Моя шпаргалка по работе в Vim

Самое главное — побороть боязнь белого листа. Я всегда говорю это себе, когда нужно начать работу над чем-то и не знаешь, как подступиться. Так что я решил не ломать голову над тем, о чем будет первая запись в этом блоге, а просто выложить небольшую шпаргалку по текстовому редактору Vim.

Шпаргалка эта уже не первый месяц хранится у меня в ~/txt/vim.txt. За это время я успел составить довольно объемный справочник по основным командам Vim. При желании вы можете начать свое обучение работе с Vim с этого поста. Итак, вот она:

Файл настройки: ~/.vimrc
Можно редактировать файлы через сеть, например
:e <scp |ftp|ftps>://user@host/path/to/the/file.txt
:Ex или :e ./ - файловый менеджер

TODO: выбор кодировки
TODO: _авто_отступы


hjkl                      перемещение в разные стороны
i                         режим вставки
I                         добавление в начало строки
a                         режим добавления
A                         добавление в конец строки
o                         добавить строку сразу за текущей
O                         добавить строку перед текущей
R                         писать поверх имеющегося текста
u, :u[ndo]                отмена предыдущего действия (undo)
CTR-R, :red[o]            отмена отмены предыдущего действия (redo)
dd                        вырезать (удалить) строку
cc                        удалить и начать редактирование
yy                        копировать строку
p                         вставить из буфера обмена
<n>d                      удалить n+1 строку
<n>y                      скопировать n+1 строку
ESC                       перейти в режим просмотра
DEL                       удалить следующий символ
:<n>                      перейти на строку #n
%                         перейти к парной скобке
:e <fname>                редактировать файл
:w [fname]                записать изменения
:wa                       сохранить изменения во всех файлах
:q                        выйти из редактора
:q!                       выйти из редактора, не сохраняя изменения
:color <name>             выбор цветовой схемы. цветвые схемы:
                            /usr/local/share/vim/vim72/colors/*.vim
:pwd                      текущий каталог
:cd [path]                перейти в другой каталог, по умолчанию - в домашний
:!<cmd>                   выполнить команду
CTR+p или CTR+n           автоматическое дополнение текста (в режиме редактирования)
CTR+r,=,<expr>            (в режиме редактирования) вставить выражение (напр 5*2 - 3)

== Подсветка синтаксиса  ==
:syntax on                включить подсветку
:syntax off               выключить подсветку (по умолчанию)

== Перенос строк ==
:set wrap                 разрешить word wrap (по умолчанию)
:set nowrap               запретить word wrap

== Печать ==
:ha[rdcopy]               распечатать документ
:set printoptions=duplex:off отключить двустороннюю печать

== Сворачивание ==
zc                        свернуть блок
zo                        развернуть блок
zM                        закрыть все блоки
zR                        открыть все блоки
za                        инвертирование
zf                        см :set foldmethod=manual
:set foldenable           включить свoрачивание
:set foldmethod=syntax    сворачивание на основе синтаксиса
:set foldmethod=indent    сворачивание на основе отступов
:set foldmethod=manual    выделяем участок с помощью v и говорим zf
:set foldmethod=marker    сворачивание на основе маркеров в тексте
:set foldmarker=bigin,end задаем маркеры начала и конца блока

== Маркеры ==
ma                        установить локальный маркер a
mB                        установить глобальный маркер B
`c                        перейти к локальному маркеру c
`0                        вернуться на позицию, на которой закончили работу
                          при закрытии vim
:marks                    просмотр маркеров

== Регистры ==
"ayy                      скопировать строку в регистр a
"bdd                      вырезать строку и поместить в регистр b
"С2d                      вырезать три строки и дописать в конец регистра C
:reg [name1][name2][...]  просмотреть содержимое регистров

== Выделение ==
v + hjkl                  выделение текста
SHIFT + v                 выделить строку
CTR + v                   выделение прямоугольника
p                         вставить
y                         копировать
d                         удалить
gu                        к нижнему регистру
gU                        к верхнему регистру

== Отступы ==
[#]>                      сдвинуть выделенное вправо
[#]< сдвинуть выделенное влево
[#]>>                     сдвинуть строку вправо
[#]<<                     сдвинуть строку влево
set tabstop=#             для табуляции используется # пробелов
set shiftwidth=#          в командах отступа используется # пробелов
set [no]expandtab             заменять ли табуляцию на соотв. число пробелов

== Поиск и замена в файле ==
/<выражение>             поиск выражения в файле
n                        следующее совпадение
N                        предыдущее совпадение
:%s/foo/bar/gi           замена строк (см http://eax.me/regular-expr/ )

== Нумерация строк ==
:set number               включить нумерацию строк
:set nonumber             отключить нумерацию строк

== Работа с Tab'ами ==
:tabnew [fname]           создать tab
:tabs                     вывести список табов
:tabn                     следующий таб
:tabp                     предыдущий таб
<n>gt                     перейти на таб #n
gt                        следующий таб
gT                        предыдущий таб

== Работа с окнами ==
:split                    горизонтальное разбиение
:vsplit                   вертикальное разбиение
Ctr+W, затем
  с                       закрыть окно
  =                       установить равный размер окон
  hjkl или стрелочки      перемещение между окнами

== Проверка орфографии ==
    mkdir -p ~/.vim/spell
    cd ~/.vim/spell
    wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.sug
    wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.spl
    wget http://ftp.vim.org/vim/runtime/spell/en.ascii.sug
    wget http://ftp.vim.org/vim/runtime/spell/en.ascii.spl

setlocal spell spelllang=ru,en   включить проверку орфографии
set spell!                       вкл/выкл проверку во время работы
]s                               следующее слово с ошибкой
[s                               предыдущее слово с ошибкой
zg                               good word
zw                               wrong word
zG                               ignore word

== Работа с кодировкой ==
e ++enc=< имя кодировки>        Редактирование файла в кодировке, не соответствующей терминалу
w ++enc=< имя кодировки>        Сохранить файл в новой кодировке
set fileencodings=utf-8,koi8-r Список автоматически определяемых кодировок в порядке убывания приоритета

== Другое ==
:set [no]wildmenu          При авто-дополнении в командной строке над ней выводятся возможные варианты
:set list                  Отображать табуляцию и переводы строк
q:                         История команд

На этом пока все. Думаю, я буду время от времени редактировать эту шпаргалку, так что следите за PS в конце следующих постов.

  • http://twitter.com/__Sander__ Sander

    Так и не смог проникнуться этим редактором. Если уж пришлось редактировать в терминале, то emacs…

  • http://eax.me/ Eax

    Всегда хотел попробовать, но у нас (на Руси/в странах СНГ) vim более распространен. Просто на моем хостинге и на серверах, где у меня нет рутовых привилегий, нет emacs. К счастью, не могу сказать, что его мне не хватает.

  • http://wp-skins.info/ Truper

    Где ты был раньше, полтора года назад весь инет перерыл в поисках документации по работа с vim. Редактор очень мощный, особенно при просмотре гигабайтных логов и вырезания оттуда определенных кусков.

  • http://eax.me/ Безумный Программист

    :) полтора года назад, я, как и вы, рыл интернет в поисках документации и потихоньку составлял эту шпаргалку.

  • http://bestann.com.ru/ bestann

    спасибо.

  • http://eax.me/ Безумный Программист

    Пользуйтесь на здоровье )

  • autotst_sp

    А почему бы не пользоваться хэлпом вимовским и не надо ничего рыть и искать))

  • Саня

    Спасибо — прикрутил проверку орфографии.

    Вставлю и свои пять копеек.

    Меня жутко раздражало, что после сдвига выделенного блока клавишами < и >, выделение пропадало.
    То есть, чтобы сдвинуть блок на несколько табов, нужно было повторно этот блок выделять.
    Можно, конечно, указать количество табов, но не всегда ведь на глаз видно на сколько табов нужно двигать.
    В общем, если кому интересно, то лечится такое поведение добавлением в .vimrc

    vnoremap < <gv
    vnoremap > >gv

    Еще очень удобно автодополнение повесить на tab

    function InsertTabWrapper()
    let col=col('.') — 1
    if !col || getline('.')[col - 1] !~ 'k'
    return «<tab>»
    else
    return «<c-p>»
    endfunction

    imap <tab> <c-r>=InsertTabWrapper()<cr>

    set complete=»"
    set complete+=.
    set complete+=b
    set complete+=t

    А перемещение окон и изменение их размера, мне кажется, удобно повесить на какие-нибудь сочетания со стрелками. Например

    «Moving windows
    nnoremap <C-Down> <C-W>J
    nnoremap <C-Up> <C-W>K
    nnoremap <C-Right> <C-W>L
    nnoremap <C-Left> <C-W>H

    «Resizing windows
    nnoremap <S-Down> <C-W>+
    nnoremap <S-Up> <C-W>-
    nnoremap <S-Left> <C-W><
    nnoremap <S-Right> <C-W>>

  • Илья

    Вообще наличие vi совместимого редактора входит в требования стандарта POSIX, поэтому vi есть везде

  • mitlas

    ещё не упомянуто:

    Ctrl+G — номер текущей строки, общее число строк в файле и его имя

    N,M ya — копировать в буфер обмена строки с N до M включительно (потом их можно вставить в нужном месте той же «p»)

    Ndd — удалить N строк (любые удалённые строки попадают в буфер обмена)

  • http://eax.me/ Безумный Программист

    Не упомянуто по той причине, что у меня в .vimrc прописано «set number», а копировать/удалять/вырезать мне кажется более удобным с помощью предварительного выделения текста (нажать v).

    Тем не менее, (2) может быть полезным. Взял на вооружение :)