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

Я сейчас в процессе обучения 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
- Настройки nvim видео с канала Диджитализируй
- Мой вариант конфиг файлов.
Для полного срабатывания настроек необходимы плагины rust-analizer, pyright,ripgrep
git clone https://github.com/alexey-goloburdin/nvim-config.git ~/.config/nvim
Создать файл конфига:
nvim 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