
Neovim — конфигурация редактора: установка и настройка плагинов
Приветствую!
Сегодня завершим настройку нашего консольного редактора Neovim: установим и настроим перечень плагинов, которые преобразят внешний вид и дополнят функционал фишками IDE. Из основных: тема Nord, интеграция линтеров для языков программирования, поддержка git, боковая панель с деревом файлов проекта, ну и, т.к. Neovim имеет поддержку LSP, подключение библиотеки автодополнения на основе сервера ЯП Python. И многое другое.
Присоединяйтесь к нашему каналу: t.me/r4ven_me и чату: t.me/r4ven_me_chat в Telegram .
Установка и настройка Neovim для ленивых:
# установка необходимых пакетов
sudo apt install -y shellcheck pylint bat
# установка Nord темы для утилиты bat (нужно для fzf)
echo 'export BAT_THEME="Nord"' >> ~/.profile
# установка менеджера плагинов vim-plug
curl --create-dirs -fLo ~/.local/share/nvim/site/autoload/plug.vim https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
# копирование базового конфига Neovim
curl --create-dirs -fLo ~/.config/nvim/init.vim https://raw.githubusercontent.com/r4ven-me/dots/main/.config/nvim/init.vim
# копирование конфига плагинов Neovim
curl --create-dirs -fLo ~/.config/nvim/plugins.vim https://raw.githubusercontent.com/r4ven-me/dots/main/.config/nvim/plugins.vim
# установка плагинов
nvim -e -c 'PlugInstall' -c 'qall!'
# проверка установки
nvim ~/.config/nvim/plugins.vim
Введение
Количество существующих плагинов для Vim/Neovim не счесть. За счет возможности гибкой конфигурации, плагины существуют на любой вкус и цвет. Руководств в интернете по их настройке тонна.
В данной статье я расскажу про плагины, которые использую лично, а также покажу, как их легко установить и настроить – необходимо лишь скопировать конфиг, а установка и настройка уже произойдет автоматически.
Все действия выполнялись в среде дистрибутива Linux Mint 21 (Ubuntu 22.04). В других дистрибутивах шаги +- аналогичны.
Подготовка
Для корректной работы плагинов асинхронной проверки кода, а также подсветки синтаксиса во всплывающих окнах fzf, необходимо установить специальные библиотеки и пакеты, которые будут источниками для работы плагинов.
Т.к. в моём примере фигурируют bash и python, то устанавливаем такие пакеты:
sudo apt install -y shellcheck pylint bat
shellcheck
– линтер для bash/sh;pylint
– линетр для python;bat
– утилита подсветки синтаксиса при выводе текста в консоли (нам нужна для плагинаfzf
).
Сразу же зададим цветовую тему Nord для утилиты bat
с помощью переменной окружения:
echo 'export BAT_THEME="Nord"' >> ~/.profile && . ~/.profile
Данную переменную можно также задать в файле вашей оболочки: ~/.bashrc
или ~/.zshrc
. Тут уж на ваше усмотрение.
Также для отображения иконок в терминале из цветовой темы Neovim, требуется Powerline шрифт. Подойдет любой Nerd font, скачать который можно тут: https://www.nerdfonts.com/font-downloads.
Лично я предпочитаю моноширный шрифт Hack. Положить шрифт необходимо в /usr/share/fonts
.
Не упущу возможности упомянуть мою статью про кастомизацию Linux Mint, в которой также описывается и установка шрифтов: Кастомизация Linux Mint 20/21 + Nord theme.
Список устанавливаемых плагинов Neovim
И так, ниже представлен список плагинов, которые я активно использую в своём Neovim:
Плагин | Описание |
---|---|
vim-startify | Пользовательская страница запуска, отображающая список недавно открытых файлов и сессий, при запуске редактора без аргументов (Vim/Neovim). Страница плагина на github |
vim-plugin-ruscmd | Позволяет вводить команды vim, используя русскую раскладку клавиатуры (Vim/Neovim). Страница плагина на github |
vim-endwise | Автоматически завершает структуры if , do , def в различных языках программирования (Vim/Neovim).Страница плагина на github |
neomake | Плагин для асинхронной проверки кода. Поддерживает различные языки программирования и линтеры, такие как pylint для Python и shellcheck bash/sh (Vim/Neovim).Страница плагина на github |
bash-support | Обеспечивает поддержку Bash-скриптов (Vim/Neovim). Создание шаблонов и пр. Страница плагина на github |
vim-gitgutter | Подсвечивает изменения в репозитории Git (Vim/Neovim). Страница плагина на github |
vim-autopair | Автоматически вставляет или удаляет скобки/кавычки при вводе (Vim/Neovim). Страница плагина на github |
fzf | Исполняемый файл утилиты размытого поиска – fzf. Данный плагин необходимо для корректной работы, плагина fzf.vim (ниже) в deb based дистрибутивах (Vim/Neovim). Страница плагина на github |
fzf.vim | Интегрирует fzf с Vim/Neovim, предоставляя интерфейс расширенного поиска и дополнительные функции (Vim/Neovim). Страница плагина на github |
vim-commentary | Упрощает комментирование и раскомментирование кода различных языков программирования с помощью клавиш-команд, таких, как gcc для строк и gc для блоков кода (Vim/Neovim).Страница плагина на github |
indent-blankline.nvim | Отображает визуальные направляющие для уровней отступа (только Neovim). Страница плагина на github |
jedi-vim | Предоставляет поддержку Python Language Server Protocol (LSP) через библиотеку Jedi (Vim/Neovim). Если в системе не установлен пакет vim-python-jedi , плагин установит его дополнительно в директорию с плагином.Страница плагина на github |
nerdtree | Плагин для отображения боковой панели с файлами проекта (Vim/Neovim). Страница плагина на github |
vim-devicons | Добавляет цветные иконки типов файлов для NERDTree (Vim/Neovim). Страница плагина на github |
nerdtree-git-plugin | Улучшает NERDTree статусными флагами Git (Vim/Neovim). Страница плагина на github |
nord-vim | Официальный плагин цветовой схемы Nord (Vim/Neovim). Страница плагина на github |
lightline.vim | Легкая и настраиваемая строка состояния (Vim/Neovim). Страница плагина на github |
vim-fugitive | Плагин отображает текущую ветку Git в строке состояния (Vim/Neovim). В нашем случае используется совместно с плагином lightline.vim. Страница плагина на github |
nvim-scrollview | Добавляет полосу прокрутки для визуализации положения в файле (только Neovim). Страница плагина на github |
vim-floaterm | Предоставляет плавающее терминальное окно в сессиях редактора (точно работает в Neovim, про vim читайте доку). Страница плагина на github |
Список не маленький, но и не такой длинный, каким мог быть. Не стоит забывать, что каждый новый подключаемый плагин в своей мере нагружает редактор. Поэтому увлекаться не рекомендуется. При работе с указанными выше плагинами, я не заметил каких либо неполадок в работе Neovim. Если конечно всё встало корректно. Приступим к правке конфига.
Правка конфига
Прежде чем продолжить, хочу уточнить, что указанные ниже шаги, подразумевают, что у вас уже есть базовый конфиг Neovim. Если нет, то просто скопируйте мой с репозитория на GitHub такой командой:
curl --create-dirs -fLo ~/.config/nvim/init.vim https://raw.githubusercontent.com/r4ven-me/dots/main/.config/nvim/init.vim
Справка по команде выше:
curl
– это утилита взаимодействия с веб по протоколам передачи данных, таких как http;--create-dirs
– создавать каталоги по пути скачиваемого файла;-f
– завершение команды в случае HTTP ошибок;-L
– следование редиректу;-o
– позволяет указать путь, куда положить скачиваемый файл;
Если вам интересны подробности о содержимом моего базового конфига, то милости прошу к прочтению статьи:
Далее открываем наш базовый конфиг Neovim:
nvim ~/.config/nvim/init.vim
Раскоменчиваем 2 строки, если они зкоменчены:
set noshowmode
set showtabline=2
А в конец файла вставляем код:
Пропустите этот шаг, если вы скопировали конфиг с GitHub.
" Auto install plugin-manager: vim-plug
let data_dir = has('nvim') ? stdpath('data') . '/site' : '~/.vim'
if empty(glob(data_dir . '/autoload/plug.vim'))
silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
else
runtime plugins.vim
endif
Данный блок кода выполняется при запуске Neovim. Он осуществляет проверку наличия установленного менеджера плагина vim-plug, который необходим для удобного скачивания и установки других плагинов. Если менеджер отсутствует, то он скачивается и устанавливается автоматически в соответствующую директорию.
Сохраняем файл и закрываем редактор:
:wq
Теперь открываем новый файл с настройками плагинов:
nvim ~/.config/nvim/plugins.vim
Вставляем в него следующий код:
" By r4ven.me
" ################################
" ###### PLUGINS MANAGEMENT ######
" ################################
" Run PlugInstall if there are missing plugins
autocmd VimEnter * if len(filter(values(g:plugs), '!isdirectory(v:val.dir)'))
\| PlugInstall --sync | source $MYVIMRC
\| endif
" List of plugins to install
call plug#begin('~/.local/share/nvim/plugged')
" Startup page
Plug 'mhinz/vim-startify'
" Enter commands using the Russian keyboard layout
Plug 'powerman/vim-plugin-ruscmd'
" IDE options
Plug 'tpope/vim-endwise' " Automatically ends if, do, def structures
Plug 'neomake/neomake' " Autochecks code (with pylint, shellcheck, etc.)
Plug 'WolfgangMehner/bash-support' " Bash support (see :h bashsupport.txt)
Plug 'airblade/vim-gitgutter' " Git highlight
Plug 'solvedbiscuit71/vim-autopair' " Insert or delete brackets, parens, quotes in pairs
Plug 'junegunn/fzf' " Fuzzy finder (exec file)
Plug 'junegunn/fzf.vim' " Fuzzy finder (requires fzf & bat to be installed)
Plug 'tpope/vim-commentary' " Work with comments (gcc, gc)
Plug 'wincent/indent-blankline.nvim'" Indentation guides
Plug 'davidhalter/jedi-vim', { 'on': 'JediClearCache' } " Python LSP
" NERDTree FM with icons and Git
Plug 'preservim/nerdtree' " NERDTree plugin
Plug 'ryanoasis/vim-devicons' " File icons for NERDTree
Plug 'Xuyuanp/nerdtree-git-plugin' " Git status flags
" Appearance
Plug 'arcticicestudio/nord-vim' " Nord theme
Plug 'itchyny/lightline.vim' " Lightline
Plug 'tpope/vim-fugitive' " Branch name in lightline
Plug 'dstein64/nvim-scrollview' " Scrollbar
" Float terminal in Neovim session
Plug 'voldikss/vim-floaterm'
call plug#end()
" ###################################
" ###### PLUGINS CONFIGURATION ######
" ###################################
" ----- vim-startify ------
" Sets folder with session files
let g:startify_session_dir = '~/.local/state/nvim/sessions/'
" Sets bookmark file path
let g:startify_bookmarks = systemlist("cut -sd' ' -f 2- ~/.local/state/nvim/NERDTreeBookmarks")
" ----- neomake -----
" Neomake requires installed 'makers' packages, e.g., 'pylint' for Python, 'shellcheck' for sh/bash
" Also use ':lopen' or ':lwindow' to see the list of Neomake check results
" F7 key enables automake
nnoremap <F7> :NeomakeEnable<CR>:call neomake#configure#automake('nrwi', 500)<CR>:Neomake<CR>
inoremap <F7> <esc>:NeomakeEnable<CR>:call neomake#configure#automake('nrwi', 500)<CR>:Neomake<CR>a
" Shift + F7 key disables automake
nnoremap <S-F7> :NeomakeDisable<CR>:NeomakeClean<CR>
inoremap <S-F7> <esc>:NeomakeDisable<CR>:NeomakeClean<CR>a
" Shfit + <F7> for alacritty and gnome-terminal
nnoremap <F19> :NeomakeDisable<CR>:NeomakeClean<CR>
inoremap <F19> <esc>:NeomakeDisable<CR>:NeomakeClean<CR>a
" ----- jedi-vim -----
" F8 activates Jedi Python LSP
autocmd FileType python map <F8> :JediClearCache<CR>
autocmd FileType python imap <F8> <ESC>:JediClearCache<CR>a
" ----- bash-support -----
" See help ':h bashsupport.txt'
" let g:BASH_CustomTemplateFile = '~/.config/nvim/templates/template.bash'
" ----- fzf.vim -----
" F2 key opens FZF window with file preview
" Ctrl+T, Ctrl+X, or Ctrl+V to open file in a new tab, split, or vsplit
nnoremap <silent> <F2> :Files<CR>
nnoremap <silent> <S-F2> :Buffers<CR>
" Shift + <F2> for alacritty and gnome-terminal
nnoremap <silent> <F14> :Buffers<CR>
" Sets the size of the FZF window
let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } }
" Sets the size and position of the preview area
let g:fzf_preview_window = 'right:50%'
" ----- nerdtree -----
" Displays the bookmarks table on startup
let NERDTreeShowBookmarks = 1
" Show hidden files
let NERDTreeShowHidden=1
" Enter key in the NERDTree window opens the file in a new tab
let NERDTreeCustomOpenArgs={'file':{'where': 't'}}
" Sets arrow looks
let g:NERDTreeDirArrowExpandable = '▶'
let g:NERDTreeDirArrowCollapsible = '▼'
" Sets the bookmarks file path
let g:NERDTreeBookmarksFile = expand("~/.local/state/nvim/NERDTreeBookmarks")
" Binds the 'F3' key to toggle NERDTree
nnoremap <F3> :NERDTreeToggle<CR>
" Exit Vim if NERDTree is the only window remaining in the only tab
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
" Close the tab if NERDTree is the only window remaining in it.
autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
" ----- nord-vim -----
colorscheme nord " Sets Nord theme
let g:nord_cursor_line_number_background = 1 " Highlights the background of the line number column in the cursor line
let g:nord_uniform_status_lines = 1 " Applies consistent styling to all status lines
let g:nord_bold_vertical_split_line = 1 " Makes the vertical split line between windows bold
let g:nord_uniform_diff_background = 1 " Provides a consistent background color for diff blocks
let g:nord_bold = 1 " Makes text rendered in the Nord color scheme bold
let g:nord_italic = 1 " Applies italic styling to text in the Nord color scheme
let g:nord_italic_comments = 1 " Makes comments in the Nord color scheme appear in italic style
let g:nord_underline = 1 " Adds an underline to text
" ----- lightline.vim -----
let g:lightline = {
\ 'colorscheme': 'nord',
\ 'active': {
\ 'left': [ [ 'mode', 'paste' ],
\ [ 'readonly', 'relativepath', 'modified', 'gitbranch' ] ]
\ },
\ 'component': {
\ 'obsessionstatus': '%{ObsessionStatus()}'
\ },
\ 'separator': {
\ 'left': '', 'right': ''
\ },
\ 'subseparator': {
\ 'left': '', 'right': ''
\ },
\ 'component_function': {
\ 'gitbranch': 'FugitiveHead'
\ },
\ }
" ----- nvim-scrollview -----
let g:scrollview_current_only = v:true " Views the scrollbar only in the current window
let g:scrollview_winblend = 75 " Sets the level of transparency
let g:scrollview_excluded_filetypes = ['nerdtree'] " Does not show the scrollbar in NERDTree window
" ----- vim-floaterm -----
let g:floaterm_width = 0.7 " Sets the width of the terminal window
let g:floaterm_height = 0.7 " Sets the height of the terminal window
let g:floaterm_keymap_toggle = '<F4>' " F4 key toggles the terminal
" Run shell or Python script in floaterm by pressing F6 key in command or insert mode
autocmd FileType sh,python map <buffer> <F6> :w<CR>:FloatermNew! chmod ug+x <C-R>=shellescape(@%, 1)<CR> && bash -c ./<C-R>=shellescape(@%, 1)<CR><CR> bash -c 'read -p "Press Enter to exit..."' && exit<CR>
autocmd FileType sh,python imap <buffer> <F6> <esc>:w<CR>:FloatermNew! chmod ug+x <C-R>=shellescape(@%, 1)<CR> && bash -c ./<C-R>=shellescape(@%, 1)<CR><CR> bash -c 'read -p "Press Enter to exit..."' && exit<CR>
" ----- OTHERS -----
" Source the session if .session.vim exists in the current dir
if argc() == 0 && filereadable("./.session.vim")
execute "source ./.session.vim"
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * NERDTree | if argc() > 0 || exists("s:std_in") | wincmd p | endif
autocmd BufWinEnter * if getcmdwintype() == '' | silent NERDTreeMirror | endif
endif
Сохраняем, закрываем:
:wq
Вы также можете скопировать данный файл с моего GitHub командой:
curl --create-dirs -fLo ~/.config/nvim/plugins.vim https://raw.githubusercontent.com/r4ven-me/dots/main/.config/nvim/plugins.vim
Установка плагинов
В итоге у нас должны быть два файла:
ls -l ~/.config/nvim
Затем вновь открываем редактор, установка плагинов начнётся автоматически. Обязательно дожидаемся завершения:
nvim ~/.config/nvim/plugins.vim
Увидев такую ошибку, не пугаемся, просто нажимаем Enter:
Сохраняемся и выходим из редактора:
:wq
Вновь открываем файл с плагинами и должно получиться такое:
nvim ~/.config/nvim/plugins.vim
При добавлении в список новых плагинов, после запуска редактора их скачивание произойдет автоматически.
Чтобы удалить конкретный плагин, удалите строку с именем плагина (или закомментируйте), после перезапустите редактор и выполните команду:
:PlugClean
И подтвердите нажатием y
.
Демонстрация работы некоторых плагинов
- При нажатии
F2
открывается окно поиска файлов в системе. При нажатии Enter на указанном файле он откроется в текущем буфере Neovim. Закрыть окно можно клавишейEsc
:
- При нажатии
Shift+F2
во всплывающем окне fzf открывается список буферов Neovim:
- При нажатии
F3
открывается боковая панель с деревом файлов директории из которой был запущен редактор:
- При нажатии
F4
во всплывающем окне открывается простой терминал. В нём можно работать также, как и в обычном. При повторном нажатии F4 окно свернется, но сессия не закроется. Для вызова вновь нажмите эфчетыре:
- Если вы конфили Neovim по моим статьям, то помните, что на
F5
у нас забинжено действие запуска текущего файла, как исполняемого, если он имеет расширение.sh
или.py
. Т.к. у нас есть “плавающий терминал”, при нажатии F6 текущий файл исполнится во всплывающем окне:
- При нажатии клавиши
F7
активируется статический анализатор кода для shell и python файлов. При условии, что в системе установлены пакеты линтеров (делали в начале статьи). Выглядит это следующим образом:
Чтобы отключить линтер, вновь нажмите F7
.
- Ну и при нажатии
F8
активируется Jedi – библиотека автодополнения для Python:
Советую не использовать одновременно Jedi и Neomake, т.к. Jedi уже включает в себя проверку синтаксиса.
Также редактор умеет в git, комментарии с помощью горячих клавиш, имеет полосу прокрутки и многое другое. Весь список представлен в таблице. Подробности по настройке каждого плагина смотрите в документации, ссылки также в таблице.
Чувствуйте себя свободно, при адаптировании моего конфига под себя) Потратив немного времени на изучение вы поймёте, что это не сложно.
Заключение
Фух… вот теперь наш редактор Neovim готов к активному использованию.
Он красив и практичен. А главно, очень шустр в работе. Порог входа в случае vim-like редакторов конечно высок, он по моему личному мнению, оно того стоит. Это путь классического Unix, который сформировался еще на заре IT технологий и со временем стал только лучше.
Если у вас остались вопросы, или просто есть желание обсудить “тяжести” работы в *vim – добро пожаловать в наш чат в телеге: @r4ven_me_chat.
Если вы зачем-то осилили данную статью, но никогда не работали с Vim/Neovim, обязательно изучите вводную часть: VIM – Консольный редактор: знакомство. Это прольёт свет на некоторые аспекты консольных текстовых редакторов.
Следующим моим шагом станет адаптация данных конфигов, написанных на vim-script
, в формат lua
. Предполагаю, что это тоже будет весело)
Спасибо, что читаете. Учтите, что сегодня умение выйти из *vim
является полноценным hard-скиллом)
Успехов!
Полезные источники
Ссылки на источники плагинов в таблице вначале статьи)
Под данной инструкцией, на моём Дзен канале были заданы интересные вопросы:
1.
По первому пункту: если вы изучали конфиг, то вероятно видели строки, подобные этой:
Данная настройка, выполняет заданные действия при открытии редактора (директива autocmd), далее указаны типы файлов: sh (shell) и python. После указания типов, можно задются команды или любые другие настройки vim, которые будут выполнятся только при работе с файлами, заданных форматов. По сути, можно настроить всё что угодно. При открытии файлов других типов, эти настройки игнорируются.
В моём примере, при открытии python файлов, выполняется назначение (маппинг) горчей клавиши – F7 указанных действий: добавление флага исполнения текущему редактируемому файлу и запуск его как скрипта во всплывающем терминале (плагин floaterm).
Т.е. данная строка выполняется только в том случае, если вы открываете файл, заданного типа. Тоже самое справедливо и для других форматов, в т.ч. и PHP.
Таким образом можно настроить поведение редактора под любые нужды. И это лишь один из способов.
2.
Так как особо такой необходимости не было, поэтому не подскажу. Но я уверен, что уже существуют подобные инструменты, ибо предположу, что очень актуально) Например, поверхностный поиск привел меня к такому плагину: https://github.com/vim-vdebug/vdebug
Отмечу, что я его не проверял, привел его лишь в качестве примера.
Еще про первый вопрос. Можно вынести настройки для разных типов файлов (или любых других условий) в отдельные файлы. Затем описать нужные условия и при их соблюдении выполнить импорт настроек из этих файлов.
Например:
при открытии файлов с расширением .sh будут выполнены настройки из файла plugins.vim. Во всех других случаях, данное действие выполняться не будет.