Найти в Дзене
Вороний блог | Linux и IT

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

Приветствую! Продолжаем конфигурацию нашего редактора 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 highli
Оглавление
Neovim — конфигурация редактора: настройка горячих клавиш и прочие настройки
Neovim — конфигурация редактора: настройка горячих клавиш и прочие настройки

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

Продолжаем конфигурацию нашего редактора 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

Описание

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

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

Описание горячих клавиш: часть 1
Описание горячих клавиш: часть 1
Описание горячих клавиш: часть 2
Описание горячих клавиш: часть 2

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

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), сначала выходит из режима вставки, а затем выполняет те же действия.

Разультат действия при нажатии F5
Разультат действия при нажатии F5

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 + F9–F12)и восстановления при нажатии <F9>–<F12>. В нормальном режиме (nnoremap), выполняется команда сохранения текущей сессии (или восстановления) с указанием файла сессии. В режиме вставки (inoremap), сначала выходит из режима вставки (<esc>), а затем выполняет те же действия.

Отдельно стоит отметить маппинг клавиш для <F21>–<F24>. Данные параметры заданы специально для использования клавиш <F9>–<F12> в терминале Alacritty (про него в будущем будет отдельная статья). Дело в том, что этот терминал интерпретирует F клавиши с 9 по 12 не стандартными кодами.
Сохранение сессии
Сохранение сессии
Пустой запуск Neovim
Пустой запуск 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. Не пропустите. Успехов в изучении!

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

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

Мои ссылки: