Neovim — конфигурация редактора: настройка горячих клавиш и автозапуск команд

Neovim — конфигурация редактора: настройка горячих клавиш и автозапуск команд

Обновлено 23.02.2024

Приветствую!

Продолжаем конфигурацию нашего редактора Neovim. Сегодня в эфире настройка горячих клавиш и автозапуска некоторых команд при старте редактора. Прошу под кат)

Присоединяйтесь к нашему каналу: t.me/r4ven_me и чату: t.me/r4ven_me_chat в Telegram .

Если вы пропустили прошлые статьи, то обязательно их изучите:

Если вы не понимаете, что это вообще такое или просто не смогли выйти из Vim, то прошу к прочтению мою вводную статью: VIM – Консольный редактор: знакомство.

Также напомню, что актуальный мой конфиг Neovim можно найти в репе на GitHub.

И так, продолжаем конфигурацию.

Конфигурация Neovim

Открываем файл конфига на редактирование:

nvim ~/.config/nvim/init.vim

И в конец файла добавляем следующий код:

" #########################
" ###### KEYBINDINGS ######
" #########################

" Insert a new line below
nnoremap <Enter> o<ESC>
 
" Add a space after the cursor
nnoremap <Space> a<Space><ESC>

" Map 'jk' in insert mode to Escape
inoremap jk <ESC>

" Turn off search highlighting with ',<Space>'
nnoremap ,<Space> :nohlsearch<CR>

" Delete without yanking to the default register
nnoremap x "_x
xnoremap x "_x

" Swap 'p' and 'P' keys
xnoremap <expr> p 'pgv"'.v:register.'y`>'
xnoremap <expr> P 'Pgv"'.v:register.'y`>'

" Auto-chmod and execute for shell and python files with <F5>
" Here '<C-R>=shellescape(@%, 1)<CR>' makes insert result of 'shellescape(@%, 1)'
" which parses current filename and escapes it for safe use in commandline
autocmd FileType sh,python map <buffer> <F5> :w<CR>:!chmod ug+x <C-R>=shellescape(@%, 1)<CR> && sh -c ./<C-R>=shellescape(@%, 1)<CR><CR>
autocmd FileType sh,python imap <buffer> <F5> <esc>:w<CR>:!chmod ug+x <C-R>=shellescape(@%, 1)<CR> && sh -c ./<C-R>=shellescape(@%, 1)<CR><CR>

" Session save and restore (4 sessions)
" Sets variable for session file path prefix
let session_file = "~/.local/state/nvim/sessions/session"

" Mapping <F9>, <F10>, <F11>, <F12> keys to save sessions (1-4)
nnoremap <S-F9> :execute "mksession! " . session_file . "1.vim"<CR>
inoremap <S-F9> <esc>:execute "mksession! " . session_file . "1.vim"<CR>a
nnoremap <S-F10> :execute "mksession! " . session_file . "2.vim"<CR>
inoremap <S-F10> <esc>:execute "mksession! " . session_file . "2.vim"<CR>a
nnoremap <S-F11> :execute "mksession! " . session_file . "3.vim"<CR>
inoremap <S-F11> <esc>:execute "mksession! " . session_file . "3.vim"<CR>a
nnoremap <S-F12> :execute "mksession! " . session_file . "4.vim"<CR>
inoremap <S-F12> <esc>:execute "mksession! " . session_file . "4.vim"<CR>a

" Mapping <F9>, <F10>, <F11>, <F12> keys to save sessions (1-4) for alacritty terminal
nnoremap <F21> :execute "mksession! " . session_file . "1.vim"<CR>
inoremap <F21> <esc>:execute "mksession! " . session_file . "1.vim"<CR>a
nnoremap <F22> :execute "mksession! " . session_file . "2.vim"<CR>
inoremap <F22> <esc>:execute "mksession! " . session_file . "2.vim"<CR>a
nnoremap <F23> :execute "mksession! " . session_file . "3.vim"<CR>
inoremap <F23> <esc>:execute "mksession! " . session_file . "3.vim"<CR>a
nnoremap <F24> :execute "mksession! " . session_file . "4.vim"<CR>
inoremap <F24> <esc>:execute "mksession! " . session_file . "4.vim"<CR>a

" Load sessions with <F9>, <F10>, <F11>, <F12>
nnoremap <F9> :execute "source " . session_file . "1.vim"<CR>
inoremap <F9> <esc>:execute "source " . session_file . "1.vim"<CR>
nnoremap <F10> :execute "source " . session_file . "2.vim"<CR>
inoremap <F10> <esc>:execute "source " . session_file . "2.vim"<CR>
nnoremap <F11> :execute "source " . session_file . "3.vim"<CR>
inoremap <F11> <esc>:execute "source " . session_file . "3.vim"<CR>
nnoremap <F12> :execute "source " . session_file . "4.vim"<CR>
inoremap <F12> <esc>:execute "source " . session_file . "4.vim"<CR>

" Save the file with 'WW' (same as :w) 
nnoremap WW :w<CR>

" ############################
" ###### OTHER SETTINGS ######
" ############################

" Always jump to the last known cursor position after opening a file
autocmd BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal g`\"" | endif

" Update terminal size on VimEnter
autocmd VimEnter * :silent exec "!kill -s SIGWINCH $PPID"
" After loading a session, equalize window sizes
autocmd SessionLoadPost * wincmd =

" Disable readonly (ro) format options for all file types (off auto comments)
autocmd FileType * setlocal formatoptions-=ro

Сохраняемся. Для применения новых настроек необходимо перезайти в Neovim:

:wq

nvim ~/.config/nvim/init.vim

Описание

Подробнее рассмотрим переназначенные клавиши.

Горячие клавиши

КлавишаОписание
EnterПереназначено действие при нажатии клавиши Enter в командном режиме. Теперь эта клавиша также осуществляет перевод строки.
Space (пробел)Переназначено действие при нажатии клавиши пробела в командном режиме. Теперь пробел добавляет отступ.
jkПри последовательном нажатии данной комбинации клавиш в режиме редактирования происходит эмуляция клавиши Esc. Таким образом, происходит возвращение в командный режим. Это сделано специально для того, чтобы избежать изменения положения рук на клавиатуре при необходимости выхода из режима вставки.
,SpaceПоочередное нажатие клавиш запятой (англ) и пробела выполняет команду сброса буфера подсветки результатов поиска. Проблема заключается в том, что сама подсветка найденных элементов не сбрасывается, что иногда мешает и отвлекает.
xnnoremap – переназначение в режиме Normal,
xnoremap – переназначение в режиме Visual,
"_x – используется для удаления символа перед курсором без сохранения его в стандартном регистре, чтобы не влиять на буфер обмена, при вставке с помощью команды p.
Подробнее про регистры на Habr
pКоманда вставки из регистра была поменяна местами с командой (большая) P, чтобы избежать перезаписи текущего содержимого в стандартном регистре, которое заменяется при вставке из него. В *vim по умолчанию происходит перезапись стандартного буфера при каждой вставке, но это “особенное” поведение можно компенсировать использованием более чем 15 регистров, если не ошибаюсь. Если интересно, более подробную информацию можно найти в упомянутой выше статье.
PВставка с сохранением в регистр заменяемого текста. Производится по умолчанию командой p.
F5Назначено выполнение внешней команды для клавиши F5. Эта команда включает в себя использование chmod и запуск текущего редактируемого файла в виде скрипта во всплывающем окне. Однако это действие осуществляется только для файлов с определенными форматами, а именно sh (shell) и py (python). Подробности об этом будут описаны далее.
Shift+F9,F10,F11,F12Для клавиш Shift + F* назначено действие сохранения текущей сессии в файл (4 штуки). Чуть подробнее далее.
F9,F10,F11,F12Клавиши восстановления сохраненных сессий из файлов.
WWПоочередное нажатие двух больших W выполняет обычное сохранение файла. Сделал для удобства, как альтернатива Ctrl+s в Windows like редакторах.
Клавиши и описания

Добавленные параметры

1)

let session_file = "~/.local/state/nvim/sessions/session"

Эта строка кода определяет переменную session_file, указывающую на путь к файлу сессии в Neovim. Этот файл используется для сохранения текущего состояния редактора, включая открытые файлы, расположение окон, вкладки и другие параметры.

2)

autocmd FileType sh,python map <buffer> <F5> :w<CR>:!chmod ug+x <C-R>=shellescape(@%, 1)<CR> && sh -c ./<C-R>=shellescape(@%, 1)<CR><CR>
autocmd FileType sh,python imap <buffer> <F5> <esc>:w<CR>:!chmod ug+x <C-R>=shellescape(@%, 1)<CR> && sh -c ./<C-R>=shellescape(@%, 1)<CR><CR>

Эти параметры устанавливают автоматическое выполнение команды chmod и запуск скрипта при нажатии <F5> в файлах с расширением .sh или .py. В нормальном режиме (map), сохраняет файл, устанавливает права выполнения и запускает скрипт. В режиме вставки (imap), сначала выходит из режима вставки, а затем выполняет те же действия.

3)

nnoremap <S-F9> :execute "mksession! " . session_file . "1.vim"<CR>
inoremap <S-F9> <esc>:execute "mksession! " . session_file . "1.vim"<CR>a
...
nnoremap <F9> :execute "source " . session_file . "1.vim"<CR>
inoremap <F9> <esc>:execute "source " . session_file . "1.vim"<CR>
...

Эти параметры задают команду быстрого сохранения сессии при нажатии <S-F9><S-F12> (Shift + F9F12)и восстановления при нажатии <F9><F12>. В нормальном режиме (nnoremap), выполняется команда сохранения текущей сессии (или восстановления) с указанием файла сессии. В режиме вставки (inoremap), сначала выходит из режима вставки (<esc>), а затем выполняет те же действия.

Отдельно стоит отметить маппинг клавиш для <F21><F24>. Данные параметры заданы специально для использования клавиш <F9><F12> в терминале Alacritty (про него в будущем будет отдельная статья). Дело в том, что этот терминал интерпретирует F клавиши с 9 по 12 не стандартными кодами.

Сохранение сессии
Пустой запуск Neovim
После нажатия клавиши восстановления сессии

4)

autocmd BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal g`\"" | endif

После чтения файла (BufReadPost), выполняется код, который устанавливает курсор в позицию последнего известного положения после открытия файла. Если позиция известна (записана в '"'), и она находится в пределах файла, то выполняется команда exe "normal g""`, которая устанавливает курсор в это место. Vimscript – для рептилоидов..

5)

autocmd VimEnter * :silent exec "!kill -s SIGWINCH $PPID"

При событии VimEnter (после полной загрузки Neovim), выполняется команда для отправки сигнала SIGWINCH (перерисовка окна) родительскому процессу (PPID). Нужно для корректного отображения окна редактора в терминале.

6)

autocmd SessionLoadPost * wincmd =

После загрузки сессии (SessionLoadPost), выполняется команда wincmd =, которая пытается уравнять размеры всех окон, распределяя их равномерно по экрану.

autocmd FileType * setlocal formatoptions-=ro

Этот параметр устанавливает для всех типов файлов (FileType *) локальные опции форматирования (formatoptions) для текущего буфера, исключая опцию ro (read-only). Таким образом отключается автоматическое подстановка знака комментария при нажатии клавиши Enter в режиме редактирования. Без понятия зачем такую штуку оставили по умолчанию, неудобно.

Выводы

Вот мы и завершили базовую конфигурацию Neovim, добавив несколько кастомных сочетаний клавиш и скорректировав пару существующих. В целом, старайтесь сильно не модифицировать поведение *vim, делая из него ваш “эксклюзив”. Необходимо регулярно пользоваться дефолтом, чтобы попав в не настроенную среду, но в которой установлен *vim, вы смогли эффективно выполнять редактирование нужных файлов.

В следующих статьях мы начнем настраивать плагины) Таам тоже будет много чего интересного. Наконец то настроим тему оформления Nord и дополним наш редактор фишками IDE. Не пропустите. Успехов в изучении!

Если у вас возникли любые вопросы по статье, смело задавайте их в нашем чате Телеграм: Вороний чат.

Материалы по теме

Подписаться
Уведомить о
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии