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

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

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

Сегодня завершим настройку нашего консольного редактора Neovim: установим и настроим перечень плагинов, которые преобразят внешний вид и дополнят функционал фишками IDE. Из основных: тема Nord, интеграция линтеров для языков программирования, поддержка git, боковая панель с деревом файлов проекта, ну и, т.к. Neovim имеет поддержку LSP, подключение библиотеки автодополнения на основе сервера ЯП Python. И многое другое.

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

TLDR

Установка и настройка 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
Установка переменной для bat

Данную переменную можно также задать в файле вашей оболочки: ~/.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. Если конечно всё встало корректно. Приступим к правке конфига.

Правка конфига

Прежде чем продолжить, хочу уточнить, что указанные ниже шаги, подразумевают, что у вас уже есть базовый конфиг 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 – позволяет указать путь, куда положить скачиваемый файл;
Установка vim-plug

Если вам интересны подробности о содержимом моего базового конфига, то милости прошу к прочтению статьи:

Далее открываем наш базовый конфиг 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
Добавление кода запуска и автоустановки vim-plug

Данный блок кода выполняется при запуске 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
Наполнение конфиг файла плагинов Neovim

Сохраняем, закрываем:

: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
Neovim после установки плагинов

При добавлении в список новых плагинов, после запуска редактора их скачивание произойдет автоматически.

Чтобы удалить конкретный плагин, удалите строку с именем плагина (или закомментируйте), после перезапустите редактор и выполните команду:

:PlugClean

И подтвердите нажатием y.

Демонстрация работы некоторых плагинов

  • При нажатии F2 открывается окно поиска файлов в системе. При нажатии Enter на указанном файле он откроется в текущем буфере Neovim. Закрыть окно можно клавишей Esc:
Поиск с fzf
  • При нажатии Shift+F2 во всплывающем окне fzf открывается список буферов Neovim:
Список буферов с fzf
  • При нажатии F3 открывается боковая панель с деревом файлов директории из которой был запущен редактор:
Боковая панель NERDTree
  • При нажатии F4 во всплывающем окне открывается простой терминал. В нём можно работать также, как и в обычном. При повторном нажатии F4 окно свернется, но сессия не закроется. Для вызова вновь нажмите эфчетыре:
Плавающий терминал
  • Если вы конфили Neovim по моим статьям, то помните, что на F5 у нас забинжено действие запуска текущего файла, как исполняемого, если он имеет расширение .sh или .py. Т.к. у нас есть “плавающий терминал”, при нажатии F6 текущий файл исполнится во всплывающем окне:
Запуск скрипта в плавающем терминале
  • При нажатии клавиши F7 активируется статический анализатор кода для shell и python файлов. При условии, что в системе установлены пакеты линтеров (делали в начале статьи). Выглядит это следующим образом:
Работа линтера shellcheck
Работа линтера pylint

Чтобы отключить линтер, вновь нажмите F7.

  • Ну и при нажатии F8 активируется Jedi – библиотека автодополнения для Python:
Работа LSP с Jedi

Советую не использовать одновременно Jedi и Neomake, т.к. Jedi уже включает в себя проверку синтаксиса.

Также редактор умеет в git, комментарии с помощью горячих клавиш, имеет полосу прокрутки и многое другое. Весь список представлен в таблице. Подробности по настройке каждого плагина смотрите в документации, ссылки также в таблице.

Чувствуйте себя свободно, при адаптировании моего конфига под себя) Потратив немного времени на изучение вы поймёте, что это не сложно.

Заключение

Фух… вот теперь наш редактор Neovim готов к активному использованию.

Он красив и практичен. А главно, очень шустр в работе. Порог входа в случае vim-like редакторов конечно высок, он по моему личному мнению, оно того стоит. Это путь классического Unix, который сформировался еще на заре IT технологий и со временем стал только лучше.

Если у вас остались вопросы, или просто есть желание обсудить “тяжести” работы в *vim – добро пожаловать в наш чат в телеге: @r4ven_me_chat.

Если вы зачем-то осилили данную статью, но никогда не работали с Vim/Neovim, обязательно изучите вводную часть: VIM – Консольный редактор: знакомство. Это прольёт свет на некоторые аспекты консольных текстовых редакторов.

Следующим моим шагом станет адаптация данных конфигов, написанных на vim-script, в формат lua. Предполагаю, что это тоже будет весело)

Спасибо, что читаете. Учтите, что сегодня умение выйти из *vim является полноценным hard-скиллом)

Успехов!

Полезные источники

Ссылки на источники плагинов в таблице вначале статьи)

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