Vim Guide [DRAFT]
Vim Commands: A Beginner Guide with Examples
Поиск:
-
/
- после него указывается поисковая подстрока и vim ищет по файлу сверху вниз начиная с текущего положения курсора -
?
- то же что и/
, только поиск снизу вверхn/N
позволяют переходить на следующее найденное совпадение ("следующее" зависит от изначального направления поиска) -
*
- подставляет в/
слово, находящееся под курсором (то есть ищет вперед слово на которое сейчас наведен курсор) -
#
- то же что и выше но наоборот
Вставка:
-
i
- insert (вставка до выделенного символа, т.е. слева) -
a
- after -
A
- вставка в конец строки (аналогично$a
) -
o
- добавить новую строку снизу текущей строки и перейти в режим вставки на ней -
O
- то же что и выше но строка сверху
Горизонтальная навигация:
-
w
- в начало следующего слова -
b
- в начало предыдущего слова -
0
- в начало строки (к первому символу) -
^
- к первому непустому символу -
$
- конец строки -
%
- найти пару скобке -
f<char>
- поиск символа вперед по строке -
F<char>
- поиск символа назад -
t<char>
- переместиться к символу вправо по строке -
T<char>
- переместиться влево;
/,
позволяют перемещаться между найденными символами
Вертикальная навигация:
-
<line_num>G
- перейти на указанную строку -
G
- к последней строке -
1G
/gg
- наверх файла -
CTRL-e
- скролл вниз (на размер окна) -
CTRL-u
- скролл вверх (на полокна) -
CTRL-d
- скролл вниз (на полокна)
Операторы:
-
d
- delete -
c
- change -
y
- yank (copy) -
p
- put (по-умолчанию вставляет после текущего положения курсора, но можно использоватьP
и вставит перед курсором
Опции:
-
:set no<option>
- снять опцию -
:set <option>!
- переключить опцию (toggle) -
:set <option>?
- посмотреть текущее значение -
:set <option>=<value>
- установить значение -
:set <option>+=<value>
- добавить значение -
:set <option>-=<value>
- вычесть значение -
:set <option>&
- сбросить опцию до дефолтного значения
A Vim Guide for Intermediate Users
В IDE обычно используются вкладки для управления файлами. Vim использует другой путь для отображения и организации открытых файлов. Тут есть 4 уровня абстрации: буфферы, окна, табы и списки аргументов
-
Buffers
Буффер связан с открытым файлом. Это почти как вкладка у обычной IDE, только в IDE при закрытии вкладки, закрывается файл, а в Vim при закрытии окна с буффером, буффер остается, но переходит в состояние hidden
У буффера может быть 3 состояния:
- active - буффер открыт в окне
- hidden - буффер не отображается, но существует и файл остается открытым
- inactive - буффер не отображается и пуст (не связан ни с каким файлом)
Комманда
:buffers
покажет список буфферов (ls
- то же самое). В выводе будет табличка со следующими полями:- Buffer ID
- Индикатор с состоянием буффера (
a
- active,h
- hidden...) - Имя файла (имя буффера)
- Номер строки на которой находится курсор
Команды для навигации по буфферам:
-
:buffer <ID_or_name>
- переключиться на указанный буффер -
:bnext
or:bn
- на следующий буффер -
:bprevious
or:bp
- на предыдущий -
:bfirst
or:bf
- на первый -
:blast
or:bl
- на последний -
CTRL-^
- переключиться на тот у которого решетка (#
) в выводе команды:buffers
-
<ID>CTRL-^
- переключиться на указанный буффер
Применить команду ко всем буфферам сразу -
:bufdo <command>
Ниже ситуация когда оба буффера не сохранены (файлы отредактированы и в выводе команды:ls
видно плюс), после команды:bufdo w
оба буфера сохранились
Управление буфферами:
- При создании окна, автоматом создается буффер
-
:badd <filename>
- добавить файл и буффер -
:bdelete <ID_or_name>
- удалить конкретный буффер, можно перечислять через пробел несколько буфферов к удалению -
:1,10bdelete
- удалить диапазон буфферов (включение с обоих концов) -
:%bdelete
- удалить все буфферы
-
Windows
Окно это просто пространство в котором можно отображать и работать с буфферами
При запуске Vim автоматически создается одно окно и пустой буффер:new
- создаст дополнительное окно (и разделит доступное пространство терминала пополам с уже существующим окном)-
CTRL-W s
- поделить горизонтально -
CTRL-W v
- вертикально -
CTRL-W n
- горизонтально с новым файлом -
CTRL-W ^
- открыть в новом окне буффер с alternate file (тот что с решеткой) -
<buffer_ID>CTRL-W ^
- открыть конкретный буффер в новом окне
Для перемещения курсора:
-
CTRL-W <Down>
илиCTRL-W j
- вниз -
CTRL-W <Up>
илиCTRL-W k
- вверх -
CTRL-W <Left>
илиCTRL-W h
- влево -
CTRL-W <right>
илиCTRL-W l
- вправо
Перемещение окон:
-
CTRL-W r
- прокрутить окна -
CTRL-W x
- поменять местами со следующим окном
Ресайзинг:
-
CTRL-W =
- чтобы окна занимали одинакое пространство -
CTRL-W -
- уменьшить высоту -
CTRL-W +
- увеличить высоту -
CTRL-W <
- уменьшить ширину -
CTRL-W >
- увеличить ширину
:q
- закрывает текущее окно. Можно подумать что эта команда закрывает vim, но она закрывает только окно -
-
Tabs
Табы это сгруппированные окна (как в tmux)
-
:tabnew
или:tabe
- новая вкладка -
:tabclose
или:tabc
- закрыть текущую вкладку -
:tabonly
или:tabo
- закрыть все вкладки кроме текущей -
CTRL-W gt
- следующая вкладка -
CTRL-W gT
- предыдущая
-
-
Argument List (arglist)
Ничего не понял( Зачем? Для чего?
Mapping Keystrokes:
-
:nmap
- создать для NORMAL mode -
:imap
- создать для INSERT mode -
:xmap
- создать для VISUAL mode -
:cmap
- создать для COMMAND-LINE mode
Если сделать :nmap w dd
, то клавиша w
будет удалять строку как dd
Но если мы теперь захотим перемещаться по тексту per words то нужно замапить w
на другую клавишу
Если мы сделаем :nmap v w
, то v
тоже будет удалять строку, потому что мы замапили v
на w
которая замаплена на dd
(v
, w
, dd
- удаляют строку)
Чтобы такого не происходило нужно делать :nnoremap v w
, и клавиша v
будет двигать кусор вперед пословноnnoremap
:
-
n
- normal mode (may be:n
,i
,v
,c
) -
nore
- non recursive -
map
- map)
Jumping:
-
CTRL-o
- older cursor position -
CTRL-i
- next cursor position
:jumps
- покажет список сохраненных позиций
Changes::changes
- покажет изменения
-
g;
- next change -
g,
- prev change
Methods jumping:
-
[m
- начало метода (типа блоки со скобками) -
]m
- конец метода
Single Repeat:
-
.
- повторить последнее изменение -
@:
- повторить последнюю команду
Macro:
-
q<lowecase_letter>
- начать запись макроса - Все последующие команды (in normal mode) будут записаны
-
q
- остановить запись макроса -
@<lowercase_letter>
- выполнить записанный макрос
@@
- повторить последний выполненный макрос
History:
-
q:
- command line histroy -
q/
иq?
- search history -
CTRL+f
- command line history если ты уже в COMMAND LINE mode
Аналогичные команды:
-
:history :
- command line history -
:history /
или:history ?
- search history
Undo Tree:
Vim хранит не просто список изменений, он хранит целое дерево
То есть если мы сделаем три изменения в файле, потом два раза нажмем u
(отменим два из трех изменения) и сделаем новые изменения, то в будущем мы сможем восстановиться в любое из всех сделанных изменений
Ванильный Vim не имеет удобного механизма работы с этим, поэтому такие фишки реализуются через плагины
Мы можем указать Vim'у куда и сколько изменений сохранять
set undofile
set undodir=~/.vim/undo
" number of undo saved
set undolevels=10000
Plugins:
Простой менеджер плагинов - https://github.com/junegunn/vim-plug
В конфиге (~/.config/nvim/init.vim
) между call plug#begin('~/.vim/plugged')
и call plug#end()
добавляем (напр.) Plug 'moll/vim-bbye
А потом в Vim :PlugInstall
No Comments