Info
Content

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...)
    • Имя файла (имя буффера)
    • Номер строки на которой находится курсор

    Screenshot_2021_02_02-12_49_03-2022-08-04-at-buffers-with-u.png


    Команды для навигации по буфферам:

    • :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 оба буфера сохранились
    Screenshot_2021_02_02-12_49_03-2022-08-04-bufdo.png


    Управление буфферами:

    • При создании окна, автоматом создается буффер
    • :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 - покажет список сохраненных позиций
Screenshot_2021_02_02-12_49_03-2022-08-04-at-18jumps.png


Changes:
:changes - покажет изменения
Screenshot_2021_02_02-12_49_03-2022-08-04-at-changes.png

  • 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 

Screenshot_2021_02_02-12_49_03-2022-08-04-at-undosaves.png


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
Back to top