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