Vim теория и практика использования

  • Чаще всего при запуске vi (утилита еще со времен UNIX) запускается по факту vim (VI imporoved) за счет alias – напр. MacOS
bash-3.2$ ls -ltr /usr/bin/vi
lrwxr-xr-x  1 root  wheel  3 Feb 29 07:05 /usr/bin/vi -> vim

  • Если на сервере нет vim (есть только vi), возможно есть vim.tiny (на примере Debian). Это частое явление, в таких сборках обычно отключается подсветка синтаксиса для множества языков в сравнении со стаднартным vim.
vim.tiny /etc/network/interfaces
  • Vi/vim из коробки, в отличии от vim.tiny зачастую (не всегда) не позволяет вставлять текст из gui, что крайне неудобно. В таком случае можно использовать команду :set paste и после нее вставлять.
Редактор vim – это текстовый редактор, созданный на основе более старого – vi. Ныне это один из мощнейших текстовых редакторов с полной свободой настройки и автоматизации, и созданным благодаря этому расширениям и надстройкам. Крайне популярен и используется даже сотрудниками Google в обучении Coursera 🙂 Может быть интегрирован в IDE (visual studio/pycharm).
В VIM удобно редактировать код программы – есть подсветка переменных, циклов и т.д. Можно делать отступы, которые в последующем сохраняться и при открытии обычным редактором (cat, more, less).
VIM в основном используется системными администраторами для редактирования существующего текста (командный режим Vim), а не создания нового (текстовый режим Vim). Интерфейс Vim далеко не интуитивен и требует обучения для работы в программе.
Vim во всех Linux дистрибутивах (хотя может не быть в минимальной сборке) и не требует графической среды для работы (хотя есть и графическая версия gvim, которая требует установки). Как в любом другом редакторе изменения хранятся во временном файле и могут быть либо сохранены, либо отвергнуты.
Vim внизу показывает название файла (сразу после открытия, потом убирает), текущую позицию в файле (номер строки, номер символа) и текущее положение в файле (ты видишь весь файл, вверху/внизу файла, процент в котором находишься).
More info
  • .vimrc – тут хранятся настройки по умолчанию которые применяются при запуске vim. Если файл пустой то старт с дефолтными настройками. Пример настроек есть в файле .vimrc /usr/share/vim/vim74/vimrc_example.vim. Тут можно, например, сразу включить нумерацию строк по set number.
  • книги про VIM
  • man vim
  • vimtutor – обучалка основам vim примерно на пару часов (хотя они и пишут 20-30 минут).
  • <F1>, :help – открываем внутри VIM встроенный HELP. Переключаться между основным документом и HELP-документом можно через CTRL-W, закрыть документ можно :q.
    :help <FIND> (help hls; :help user-manual) – поиск в help. Из под root и из vimtutor поиск в Help не работает.
  • :help user-manual
Start
vi – открываем vim, потом можно будет сохранить в файле с любым названием
vi |new_file| – создаем новый файл и редактируем
vi |existing_file| – открываем и редактируем существующий файл
Modes
VIM имеет два основных режима работы – командный и редактирования. Так же многие в отдельную категорию от командного выделяют визуальный режим (visual mode), ниже это подтип командного.
Командный режим или Escape режим (т.к. клавишей Esc в него можно перейти). Режим по умолчанию при старте. В этом режиме можно делать операции копирования, вставки, перемещения, удаления, замены, поиска по тексту и прочее. Так же в этом режиме можно исполнять команды, предварив их двоеточием “:”, например, сохранение файла, выход, изменение параметров VIM.
Режим редактирования или режив ввода. Режим добавления информации в файл. Команды в этом режиме не работают.
Commands
Общий синтаксис команд: operator  [number]   motion
 operator – что делается, например, удаление “d”
 [number] – повторение действие (опционально)
 motion – ограничение действия (слово – “w”, до конца строки “$”, etc).
Change mode
i – переход из командного режима в режим вставки (редактирования).
I – переход из командного режима в режим вставки с перемещением в начало текущей строки
A (удобно) – переместить курсов в end of line + переход из командного режима в режим вставки (редактирования)
a – переход в режим вставки с перемещением на символ вперед
O (удобно) – на предыдущей строке от текущей
o – переход в режим вставки на следующей после текущей строке
ESC –  если ESC нажимается в режиме редактирование – происходит перемещение из режима редактирования в командный. Если ESC нажимается в командном режиме – происходит удаление незавершенной команды.
Delete
x – удалить символ справа, можно несколько указав количество перед
X – удалить символ слева, можно несколько указав количество перед
dw/de – удалить слово, можно несколько указав количество перед w (d2w)
dd или /d – удалить строку, можно несколько указав количество перед
D/d$ – удалить все справа от курсора
d^ –  удалить все слева от курсора
dgg – удалить все выше текущей строки (очень полезная вещь, например для формирования нового списка для скана, когда часть списка выше уже отсканилась)
dG – удалить все ниже текущей строки
:3,10d – удалить строки 3-10
Move pointer
← ↓ ↑ → or hjkl  – команды перемещения работают либо через стрелки, либо через hjkl. Второй вариант более рекомендуем т.к. считается более быстрым, нужно только привыкнуть.
[number][movement]  – перед командой перемещения можно поставить число, в случае перемещения влевло-вправо оно будет рассмотрено как количество символов, в случае вниз-вверх – как количество строк.
^ or 0  – переместить курсор в начало строки
$ – переместить курсор в конец строки
w/e – переместить курсор на слово вправа
2w – переместить курсор на два слова вправа
b –  переместить курсор на слово назад
gg[[ – начало файла
G/]] – конец файла
492G – перейти на строку 492
COPY/PASTE

shift + insert – из буфера (clipboard)

y – copy operator. Можно использовать в visual mode, на строки (yy, y$), можно на слова (y2w)

p – paste/put operator. Каждая команда delete по факту вырезает и сохраняет “удаленное” в буфер (не только y – copy сохраняет в буфер) . Вставить можно используя p/P. p вставляет в строку ниже текущей, P в строку выше.
CHANGE / find-replace
c – change operator. Аналогичен delete, только после delete переносит в edit.
cw – удалить слово или часть его (если курсор не в начале) и перейти в режим вставки
С – удалить текущую строку или часть ее (если курсор не в начале) и перейти в режим вставки
r – замена символа. Если перед поставить число то заданное число симолов будут заменены на заданный символ.
R – замена нескольких символов
~ – инвертация регистра (uppercase/lowercase)
:s/old/new – поменять old на new (только первое подпадание в строке)
:s/old/new/g – поменять globally old на new (все подпадания в строке)
:s/old/new/c – поменять old на new (все подпадания в строке), перед заменой спросить
:1,1000s/old/new – поменять old на new (только первое подпадание в строке) для первых тысячи строк
:%s/old/new/gc – поменять old на new во всем файле, перед заменой спросить
:568,575s/old/new/c – поменять old на new между строками 568-575 (только первое подпадания), перед заменой спросить
:%!xxd – преобразуем в hex данные и превращаем vim в hex editor, например, для редактирования дампа
UNDO/REDO
u – UNDO
U – отменить все последние изменения по текущей строке
ctrl+r – REDO
FIND
/ – поиск, для повторая поиска вводим “n” (next), для повтора поиска в обратную сторону “N”. Для того чтобы сразу искать с конца в начало нужно ввести ? вместо /. Так же есть возможность сразу перейти к месту первого подпадения поиска указав на входе в vim строку (pattern), поиск которой осуществляется.
vi +/pattern test.sh
% – Поиск дублирующих скобок (подводишь к первой, делаешь поиск – он находит вторую), иногда полезная штука в программировании.
:set ic (Ignore case) – ищем игнорируя Case
:set noic – отменить опцию Ignore Case (вводим no перед опцией)
:set hls (hlsearch) – выделяем найденное (highlight)
SAVE & QUIT
:w – сохраняем текущий файл без выхода из vi
:w TEST – тоже самое в конкретный файл
:w! TEST – тоже самое только делаем сохранение даже если у нас нет прав
:q – выходим если не сделали изменений
:q! – выходим, даже если сделали изменения
Комбинации:
:wq or ZZ – сохраняемся и выходим, удобный shortcut для этого в visual mode ZZ
:wq!
:wq! LOL
OTHER

:set paste – для вставки текста из gui, не всегда нужно (см. выше)

:set number – нумерация строк в открытом файле, иногда включена по умолчанию, иногда нет, удобная вещь как для понимания где в файле находишься, так и для перемещения по файлу (:<number> переместит в нужную строку) и редактирования (:<number>d удалит строку, а :<number1,number2>d удалить диапазон строк).

:!ls -ltr/date/cat – позволяет исполнить команду не выходя из vim
:!rm TEST – удаляем файл TEST  без выхода
:e! – перечитать файл со сбросом всех сделанных и не сохраненных изменений (reload)
v – войти в визуальный режим. Далее стрелками (или hjkl) можно выделить текст и потом, например, удалить его используя d или записать его в файл используя :w TEST
r – забрать вывод и вставить его в текущий файл. Забрать вывод можно из другого файла или из вывода команды.
:r LOL – файл
:r !ls – команда
ctrl + d, tab – см. список возможных команд и их дополнение. Работает и для внешних команд (:!ls ctld) и для vim (: ctld)
ctrl+g – смотрим текущее положение в файле (номер строки и %) и статус файла.
J – соединить строку ниже с текущей
CTRL-o /CTRL-i – перескакиваем на предыдущий файл и назад
CTRL-a – находит ближайшее число справа и инкрементирует к нему 1
CTRL-x – находит ближайшее число справа и вычитает из него 1

Leave a Reply