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

  • Gray at the temples and in need of reading glasses, the middle-aged Vi (pronounced vee-eye) editor, released in 1976, is still a system administrator’s best friend.
  • Чаще всего при запуске 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 – удалить строку, можно несколько указав количество перед (2dd удалит текущую строку и еще одну ниже)
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). 17yy – скопировать текущую строку и 16 ниже (всего 17), подробнее ниже в вопросах.

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! – выходим, даже если сделали изменения
Комбинации:
😡 or :wq or ZZ – сохраняемся и выходим, удобный shortcut для этого в visual mode ZZ ; между wq и ZZ есть разница, подробнее ниже
:wq!
:wq! LOL
As akshay pointed out, Vim's documentation explains, that :x and ZZ are equivalent and only save a file if the associated buffer has been changed. Whereas :wq saves the buffer to the corresponding file, even if it is unchanged. In both cases, the contents of the buffer will be saved to disk. Obviously the outcome is the same, so why bother, right? But wait... There is a subtle, but not irrelevant difference. If you exit Vim via :x and there has been no change to the buffer, there will be no change to the modification time of that file. On the other hand, if you quit via :wq, the modification time will change, as the file is technically rewritten (saved again). This can have some impact in certain situations. For example a backup process that is dependent on modification time, could store this file (and potentially send it over the network) even if no additional information has been included. Or some monitoring process could ring an alarm if it detects that (for it) the file has been changed...
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
questions

In the vi editor, what vi command will copy (but not paste) from the current line at the cursor and the following 16 lines (17 lines total)? Specify the correct vi command without spaces.

17yy
Explanation
The vi editor is a text editor that operates in two modes: command mode and insert mode. In command mode, the user can enter commands to perform various operations on the text, such as copying, pasting, deleting, moving, searching, etc. In insert mode, the user can type text into the file. To switch from command mode to insert mode, the user can press i, a, o, or other keys. To switch from insert mode to command mode, the user can press Esc. The yy command is used to copy (yank) the current line into a buffer. The number before the yy command specifies how many lines to copy, starting from the current line. Therefore, the command 17yy will copy the current line and the following 16 lines (17 lines total) into a buffer. The buffer can then be pasted into another location by using the p or P command. Note that the command 17yy does not paste the copied lines, it only copies them.

Which of the following vi commands deletes two lines, the current and the following line?

A. d2

B. 2d

C. 2dd

D. dd2

E. de12

Answer: C

When in Normal mode invi, which character can be used to begin a reverse search of the text?

A. ?

B. /

C. F

D. r

Correct Answer: A

In vi, the ? character can be used to begin a reverse search of the text. This means that the search will start from the current cursor position and move backwards towards the beginning of the file. The search pattern can be any regular expression that matches the desired text. To repeat the search, the user can press n for the previous match or N for the next match. 

The / character can be used to begin a forward search of the text, which means that the search will start from the current cursor position and move forwards towards the end of the file. 
The F and r characters are not used for searching, but for other commands in vi. 
The F command is used to move the cursor to a previous occurrence of a specified character in the current line. 
The r command is used to replace the character under the cursor with another character.

While editing a file in vi, the file changes due to another process. Without exiting vi, how can the file be reopened for editing with the new content?

A. :r

B. :n

C. :w

D. :e

Answer: D

Explanation
The :e command in vi is used to edit a file. If the file name is not specified, it will edit the current file. If the file has been changed by another process, the :e command will reload the file with the new content, discarding any unsaved changes made in vi. Therefore, the :e command can be used to reopen the file for editing with the new content without exiting vi. The other options are either invalid or do not perform the desired task.
The :r command is used to read the content of another file or command and insert it into the current file.
The :n command is used to edit the next file in the argument list, if any. The :w command is used to write the current file to disk, optionally with a new name.

In the vi editor, how can commands such as moving the cursor or copying lines into the buffer be issued multiple times or applied to multiple rows?

A. By using the command :repeat followed by the number and the command.
B. By specifying the number right in front of a command such as 4l or 2yj.
C. By selecting all affected lines using the shift and cursor keys before applying the command.
D. By issuing a command such as :set repetition=4 which repeats every subsequentcommand 4 times.

Answer: B

Which of the following are modes of the vi editor? (Choose two.)

A. edit mode

B. insert mode

C. change mode

D. review mode

E. command mode

Answer: BE

The Vi editor has two modes: Command and Insert. 
https://www.redhat.com/sysadmin/introduction-vi-editor

Immediately after deleting 3 lines of text in vi and moving the cursor to a different line, which single character command will insert the deleted content below the current line?

A. i (lowercase)

B. P (uppercase)

C. p (lowercase)

D. U (uppercase)

E. u (lowercase)

Answer: C
In vi editor, the command to delete a line of text is "dd". So, if we want to delete 3 lines of text, we can type "3dd". After deleting the text, if we want to insert it below the current line, we can use the "p" command. The "p" command stands for "put" and it will insert the deleted text below the current line.
For example, let's say we have the following text in vi:
Line 1 Line 2 Line 3 Line 4

If we want to delete lines 2, 3, and 4, we can type "3dd" while the cursor is on line 2. The text will now look like this:
Line 1


The deleted text is now in the buffer, ready to be put back in the file. If we want to insert the deleted text below line 1, we can move the cursor to line 1 and type "p". The text will now look like this:
Line 1 Line 2 Line 3 Line 4

Option A (i) is the command to enter insert mode, which is not relevant to this scenario.

Option B (P) is the command to put the deleted text above the current line.

Option D (U) is the command to undo the last action, which would undo the deletion of the text.

Option E (u) is the command to undo the last action for a single line, which would also undo the deletion of the text.

Leave a Reply