Перейти к основному содержимому

Vim: режимы, хоткейсы, команды

neovim screenshot

Я сейчас в процессе обучения vim, так что контент будет меняться регулярно.

Основы режимы работы

В vim и его форках - клонах, например nvim, есть 3 + 1 режима:

  • normal mode - режим просмотра

  • visual mode - режим выделения текста

  • insert mode - режим редактирования

  • ESC - перейти в режим просмотра

Еще один режим работы Vimкомандный. Переход в него осуществляется из общего режима нажатием : (двоеточия). Соответствующий индикатор появляется в нижнем левом углу окна, после чего можно вводить команды и их сочетания.

Изначально при открытии файла вы будете находится в (normal mode) Для ясности ниже в документе при переходе из режима в режим я буду помечать эти события.

Повторения команд

К началу большинства команд можно добавить число, которое означает количество повторений команды.

Например:

4h - сдвиг курсора на 4 символа влево
3a - повторить ввод текста 3 раза
5X - удалить 5 символов слева от курсора

Перемещение по документу

(normal mode) - режим просмотра

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

Перемещение курсора

КлавишиПеремещение курсора
hвлево
jвниз
kвверх
lвлево

Перемещение по экрану

H - в начало экрана
M - в середину экрана
L - в конец экрана
( - к предыдущему предложению
) - к следующему предложению
{ - к предыдущему параграфу
} - к следующему параграфу

Перемещение страницы

zt - передвинуть строку вверх экрана
zz - передвинуть строку в середину экрана
z. - передвинуть строку в середину экрана, курсор в начало строки
zb - передвинуть строку в конец экрана

Ctrl+D - передвинуть пол-страницы вниз
Ctrl+U - передвинуть пол-страницы вверх

Ctrl+B - передвинуть страницу вверх (Page Up)
Ctrl+F - передвинуть страницу вниз (Page Down)

Ctrl+O - переместить курсор на предыдущее место
Ctrl+I - переместить курсор на последнее место (после Ctrl+O)

Ctrl+E - передвинуть страницу на одну строку вверх
Ctrl+Y - передвинуть страницу на одну строку вниз

Перемещение по словам в строке

В командах b, e, B, E - переход зависит от положения курсора в слове.

w - в начало следующего слова
W - в начало следующего слова после пробела
b - в начало текущего/предыдущего слова (beginning)
B - в начало текущего/предыдущего слова перед пробелом
e - в конец текущего/следующего слова (end)
E - в конец текущего/следующего слова после пробела

Перемещение по строкe

0, Home - к началу строки
$, End - к концу строки
_, ^ - к первому не пустому символу в строке
g_ - к последнему не пустому символу в строке
- - к первому не пустому символу в строке сверху
+ - к первому не пустому символу в строке снизу
gg - к первой строке
G - к последней строке
ngg - к строке под номером n (например: 45gg)
nG - к строке под номером n (аналог ngg)

Перемещение, по символам в строке

% - к парной скобке вперед по тексту строки () {} []
f и X - к следующему символу X в строке (X - любой символ)
F и X - к следующему символу X в строке (обратное направление)
t и X - перед символом X в строке (till)
T и X - перед символом X в строке (обратное направление) (till)
; - повторить переход в прямом направлении
, - повторить переход в обратном направлении

Поиск текста

Поиск в документе

Поиск по документу производится симовлами / и ?. Они будут отображаться в консоли.

  • /Выражение - поиск текста вперед по документу от курсора
  • ?Выражение - поиск текста назад по документу от курсора

\c перед Выражением - совершит поиск без учета регистра

В режиме поиска искомое слово будет подсвечено.

Отключить подсветку можно через косоль:

:nohlsearch

или поискать несуществующую ерунду ( /asdfasd)

, и прбел - Отключить посветку поискового слова

Перемещение по совпадениям

n - к следующему совпадению
N - к предыдущему совпадению
* - к следующему слову под курсором
# - к предыдущему слову под курсором
gd - перейти к первому появлению слова под курсором
g* - к следующему слову под курсором (при этом слово станет шаблоном поиска)
g# - к предыдущему слову под курсором (при этом слово станет шаблоном поиска)

:%s/foo/bar/gi* замена строк, с foo bar. Подробнее

Ввод текста

(insert mode) - режим редактирования

a - добавить текст после курсора
i - добавить текст до курсора
A - добавить текст в конце строки
I - добавить текст в начале строки
o - добавить строку сверху курсора
O - добавить строку снизу курсора

Все эти команды переключают vim в режим редактирования.

Esc - выход из режима редактирования

Выделение

(visual mode) - режим выделения текста

v - посимвольное выделение текста (visual)
V - построчное выделение текста v + hjkl - выделение текста SHIFT + v - выделить строку CTR + v - выделение прямоугольника Esc - выход из режима выделения

Продвинутое выдедение

vip - выделить параграф
viw - выделить слово
Shift+v или 0v$ - выделить строку
^v$ - выделить строку, начиная с первого непробельного символа
vi( - выделить всё между ближайшими круглыми скобками (аналогично vi\[ и vi\{ для квадратных и фигурных скобок)
va( - выделить всё между ближайшими круглыми скобками, включая сами скобки
v2j - выделить на две строки вниз
dip - вырезать параграф

Копирование и вставка

y[направление] - копировать символ под курсором по направлению (h, j, k, l, $, 0 и т.п.)
yy - копировать строку
"*y - копировать в системный буфер обмера для вставки в другое приложение (например браузер)
p - вставить после курсора (paste)
P - вставить до курсора
gp - вставить после курсора и переместить курсор на один символ вправо
gP - вставить до курсора и переместить курсор на один символ влево

Удаление (вырезка) текста

Важно отметить, что текст в Vim не удаляется как в обычных редакторах, а всегда вырезается в буфер обмена. Поэтому всегда, удаленный (вырезанный) текст, можно вставить в любом месте документа.

x, DEL - удалить (вырезать) символ под курсором
X - удалить (вырезать) символ до курсора (аналог backspace)
d[направление] - удалить (вырезать) символы по направлению (h, j, k, l, $, 0 и т.п.)
dd - удалить (вырезать) строку
D - удалить (вырезать) символы от курсора до конца строки

Регистры

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

Изменение и замена текста

J - объединить строку с нижней (join)
r[символ] - заменить символ под курсором (replace)
R - начать ввод с заменой текста (аналог кнопки insert)
s - заменить символ и начать ввод (substitute)
S - заменить строку и начать ввод
c[направление] - изменить символ по направлению (h, l, e, b и т.п.)
C - изменить строку от курсора до конца (change)
~ - сменить регистр символа под курсором
gu - преобразовать в нижний регистр (для изменения - сместите курсор)
gU - преобразовать в верхний регистр (для изменения -сместите курсор)

Сворачивание

zc свернуть блок
zo развернуть блок
zM закрыть все блоки
zR открыть все блоки
za инвертирование
zf см :set foldmethod=manual

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

Маркеры

m установить локальный маркер
' перейти к локальному маркеру (одинарная кавычка)

Буква после знака устанавливает или вызывает именованный маркер. Например:

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

set viminfo='1000,f1 маркеры пишутся в ~/.viminfo, восстанавливаясь при следующем запуске vim. маркер " хранит последнюю позицию курсора в файле

Макросы

qa - записать макрос с именем a q - в режиме записи макроса: закончить запись @a - выполнить макрос с именем a @@ - повторить последний макрос

Отступы

[#]> сдвинуть выделенное вправо
[#]< сдвинуть выделенное влево
[#]>> сдвинуть строку вправо
[#]<< сдвинуть строку влево

:set tabstop=# для табуляции используется # пробелов
:set shiftwidth=# в командах отступа используется # пробелов
:set [no]expandtab заменять ли табуляцию на соответствующее число пробелов
:set shiftwidth=4 smarttab - табуляция это 4 пробела
:set expandtab - табуляция это только пробелы а не табуляция
:set tabstop=8 softtabstop=0 - отступы табуляции будут отличаться от пробелов

Проверка орфографии

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

:set spell spelllang=ru,en - включить проверку орфографии :set nospell - выключить проверку орфографии ]s - следующее слово с ошибкой [s - предыдущее слово с ошибкой z= - замена слова на альтернативу из списка 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: История команд . Повторение последней команды

Отмена действий

u, :u[ndo] отмена предыдущего действия (undo)
CTR-R, :red[o] отмена отмены предыдущего действия (redo)
u - отменить действие (undo) :u\[ndo\]
U - отменить все изменения в строке
Ctrl+R - вернуть отменённое действие :red\[o\]
. - повторить последнее изменение

Консольные команды (:)

Выполнение команд в консоли выполняется с ввода символа : (двоеточие).
Далее сразу необходимая команда:

Переход на строку N

: и далее цифра - перейти на строку (цифра) :10 перейти на строку 10

Эксплорер (файловое меню)

:e [file_hame] - редактировать файл [file_hame]
:e [dir_name] - открыть дерикторию в файловом менеджере [dir_name]

Можно редактировать файлы через сеть, например:

:e ://user@host/path/to/the/file.txt

:Ex - открыть файловый менеджер в этом же окне
:e ./ - файловый менеджер во все окно (закроет текущий файл)
:q - закрыть файловый менеджер

Еще консольные команды

:w записать изменения
:w [fname] записать изменения в [fname] файл
:wa сохранить изменения во всех файлах
:q выйти из редактора
:q! выйти из редактора, не сохраняя изменения
:color выбор цветовой схемы. цветовые схемы: /usr/local/share/vim/vim72/colors/*.vim :pwd текущий каталог
:cd [path] перейти в другой каталог
:!команда выполнить команду - man, git, и так далее стрелочками вверх и вниз можно автодополнять команды и искать по истории

Подсветка синтаксиса

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

Перенос строк (word wrap)

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

Печать

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

Сессии

mksession file.session сохранить текущую сессию
source file.session восстановить ранее сохраненную сессию

Нумерация строк

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

Окна табы вкладки.

Полезная штука если нужно работать одновременно с несколькими файлами.

Работа с вкладками (табами)

:tabnew [fname] создать таб
:tabs вывести список табов
:tabn следующий таб
:tabp предыдущий таб
gt перейти на таб #n
gt следующий таб
gT предыдущий таб
:tabm +1 переместить таб вперед на одну позицию
:tabm -1 переместить таб назад на одну позицию
:tabm 2 переместить таб на заданную позицию (нумерация начинается с нуля)

Работа с окнами

:split    # горизонтальное разбиение
:vsplit # вертикальное разбиение

Ctr+W, затем:
с - закрыть окно
+ - - - изменение высоты текущего окна
< - > - изменение ширины текущего окна
= - установить равный размер окон

hjkl или стрелочки перемещение между окнами

Еще примеры - ниже вставлено без разбора.

Ниже примеры всатвлены без структурирования.

dd вырезать (удалить) строку
cc удалить и начать редактирование
yy копировать строку
d удалить n+1 строку
y скопировать n+1 строку
DEL удалить следующий символ

CTR+p или CTR+n автоматическое дополнение текста (в режиме редактирования) CTR+r,=, вставить выражение, например 5*2 - 3 (в режиме редактирования)

Полезные советы

Радактирование нескольких файлов

Я считаю, что наиболее удобный способ редактирования нескольких файлов - использование вкладок.
Вы можете открыть несколько файлов на отдельных вкладках через командную строку, например, так:

vim -p file1.txt file2.txt

Или, если у вас уже открыт vim, вы можете открыть новый файл на новой вкладке, например:

:tabe file2.txt

Открыв вкладки, используйте gt для просмотра следующей вкладки и gT просмотра предыдущей вкладки.

Вы также можете перейти к первой вкладке с помощью 1gt, второй вкладке с помощью 2gt и т. д.

Вы можете закрыть вкладки, используя :tabc

Наконец, вы можете переместить текущую вкладку в ту nпозицию, :ntabm где n любое число больше или равно 0.

Файлы настройки

  • Файл настройки vim: ~/.vimrc

  • Файл настройки nvim ~/.config/nvim/init.vim

  • :echo($MYVIMRC) - отобразить путь к файлу настроек

  • :e $MYVIMRC - редактировать файл настроек

Плагины и расширения nvim nvim-lsp-installer

Пример настройки neovim

Для полного срабатывания настроек необходимы плагины rust-analizer, pyright,ripgrep

git clone https://github.com/alexey-goloburdin/nvim-config.git ~/.config/nvim

Создать файл конфига:

nvim pyrightconfig.json
pyrightconfig.json
{
"venv": "env",
"venvPath": "."
}

или скачать от сюда:

wget https://stavis-dev.github.io/f/pyrightconfig.json

Так же полезным будет добавить себе файл .editorconfig. Если начинаете новый проект.

wget https://stavis-dev.github.io/f/.editorconfig

Особенности конфига

  • Ctrl + h - запуск py скрипта
  • gd - перейти к телу выделенной функции
    • если функция имортированна из модуля, то модуль откроется в отдельном буфере.
    • gp - previos перейти в предыдущий буфер (обратно на страницу)
    • gn - next перейти на следующий буфер
    • gw - закрыть буфер

Файловый менеджер

hvim . - откроет nvim в режиме файлового менеджера
Перемещение по файловому менеджеру такое же как и по документу.
Enter - открыть выделенный файл - - перейти в каталог выше.
gn - сделать рабочей папку в файловом менеджере

Плагин telescope

ff - поиск по названию файла
fg - поиск по содержимому файла Enter - открыть найденый файл
Ctrl + t - открыть в новой вкладке

Сборка Purple

С сегодняшнего дня начал использовать сборку purple для своего nvim. Клавиши управления для него опишу тут.

Пробел - клавиша <leader> - <>

Стартовое окно

e - файловый менеджер q - выход

f - поиск по названию файла
ESC ESC - выход

Окна

TAB - переход по буферу вперед
Shift TAB - переход по буферу назад

<> + / - закоментировать текущую строку
<> + c - закоментировать несколько выделенных строк

<> + tf - терминал во float режиме
<> + th - терминал во горизонтальном режиме
Ctrl \ - открыть, закрыть

<> + w - сохранить файл
jj - быстро - аналог ESC

Ссылки