Найти тему
Сделай игру

NVIM для разработчика (4)

Оглавление

Продолжение. Предыдущая часть - тут. Начало - тут.

Собственно, мы вышли на финишную прямую первого этапа настройки среды. Ещё немного, и у меня начнут глаза кровоточить от этой вырвиглазной цветовой схемы. Также, определённо, не хватает строки состояния внизу, желательно, с вменяемым содержимым. И автокомплит (он же LSP) - без него сложно. Мне нужен javascript и rust, так как на них пишу большую часть времени. Но тут с первого подхода может не всё сложиться (я пробовал). Так что этим и займёмся.

Небольшое отступление

В принципе, я уже показал основной подход: нужна функциональность - ищешь её в файле настройки. Если нет - ищешь подходящий плагин. Выбираешь то, что потребуется, если нужно - привязываешь "быстрые" кнопки. Можете сами поискать себе плагины тут. Может быть найдёте что-то интересное. Обратите внимание, на каждой странице есть инструкция по установке:

Пример инструкции установки на vimawesome.com
Пример инструкции установки на vimawesome.com

Думаю, я более не буду давать подробные инструкцию по установке каждого плагина, а просто буду упоминать какой плагин использую, какие "горячие" кнопки настраиваю, а в конце приложу расшифровку файла настройки целиком. И не забывайте, что команда :h PluginName - выдаёт справку по плагину (в моём случае - о плагине PluginName).

Панель состояния

Собственно, панель состояния - это та самая полоска снизу, которая показывает, какой сейчас у редактора режим редактора, смещение курсора и прочее. Не то, чтобы прямо очень нужная штука, но и бесполезной её не назовёшь. Добавим.

Я буду использовать эту. Она довольно мощная и позволяет хорошо себя поднастроить. Устанавливается так:

Plug 'nvim-lualine/lualine.nvim'

Установили и... ничего особенного не произошло. Ещё надо настроить. Для этого в конфигурационном файле, после блока плагинов надо добавить (настройка по умолчанию):

lua << END
require('lualine').setup()
END

Всё, перезапускаемся и видим красоту. Почти.

Внешний вид панели состояния
Внешний вид панели состояния

Видите эти прямоугольнички? Туда прямо так и просятся спецсимволы, которых, почему-то, нет. Но это легко решается. И на то есть, насколько я понимаю, два пути.

Первый - это установить дополнительно

Plug 'kyazdani42/nvim-web-devicons'

Он, вроде бы, добавляет иконки. Но в моём случае это не сработает, т.к. мой терминал внешний, из среды Windows. То есть, что бы я ни устанавливал, всё равно мой терминал об этом ничего знать не будет. Но есть другой путь: скачать шрифты отсюда и установить их, а после настроить свой терминал, выбрав нужный шрифт. Здесь есть простор для фантазии. Ни в чём себе не отказывайте. Короче, после лёгких манипуляций, получилось так (шрифт 3270Narrow NF):

Когда есть иконки
Когда есть иконки

Симпатичней стало.

Фух, полдела сделано. Теперь добавим щадящую нервные клетки цветовую схему.

Выбор цветовой схемы

Решить данный вопрос нам поможет плагин cattppuccine. Установка стандартная:

Plug 'catppuccin/nvim', { 'as': 'catppuccin' }

Чтобы подключить его - достаточно после блока плагинов выбрать цветовую схему на выбор (их несколько):

  • catppuccin
  • catppuccin-latte
  • catppuccin-frappe
  • catppuccin-macchiato
  • catppuccin-mocha

Я выберу catppuccin-mocha (вписывать её следует после того, как плагин установлен, иначе будет несущественная, но ошибка):

colorscheme catppuccin-mocha

Собственно, они все смотрятся приятно, так что тут на выбор.

Добавили цветовую схему через catppuccin
Добавили цветовую схему через catppuccin

Ну и без чего ни одна среда разработки совсем не среда? Правильно, без автокомплита (средства подбора соответствующих подстановок).

Автокомплит

А вот тут всё начинается не то, чтобы просто. Непросто. И вот в чём причина: каждая система подсказок текста опирается на тот или иной язык. В идеале бы, конечно, хотелось установить что-то одно и не париться, но, скорее всего, придётся.

Изначально, я пишу на двух языках: JavaScript и Rust. Поэтому, для начала, попробуем настроить систему для JS. Это, если найти нужный плагин, довольно просто: coc в помощь. Описание установки есть, так что не стану останавливаться. Просто добавлю от себя пару комментариев.

Во-первых, плагин работает на протоколе языкового сервера - LSP (если интересно - можете почитать).

Во-вторых, сам по себе плагин ничего не даёт, после его установки - требуется установить сервера поддержки нужных форматов:

:CocInstall coc-json coc-tsserver

Я поискал и понял, что существует довольно много расширений для данного сервера - ссылка. Однако, для того, чтобы настроить работу CoC сервера - нужен довольно большой файл с настройками. Его содержимое можно посмотреть тут. Файл можно сохранить рядом с файлом init.vim и назвать, например, coc.config.init. Для того, чтобы этот файл "подтянуть" - достаточно в самом конце init.vim дописать строку. Или перед блоком плагинов:

source ~/.config/nvim/coc.config.vim

Я не стал брать все настройки сразу: сперва надо разобраться с тем, что есть. Вот, что я взял:

  • после начала написания названия чего-то - всплывает окно с подсказкой
  • tab и shift-tab для перемещения вперёд-назад по списку
  • Enter при выбранном пункте - добавит его
  • Ctrl+Alt+d для показа диагностики кода
Снизу - окно диагностики; что с кодом не так
Снизу - окно диагностики; что с кодом не так

Там довольно много разных настроек ещё есть, но я пока решил разобраться с тем, что есть. Не исключено, что скоро я расширю список своих настроек.

Ещё я хотел, чтобы по нажатию ctrl+пробел открывалось бы окно подсказки. Но, по каким-то причинам, этого не происходит. Возможно, эту комбинацию перехватывает терминал, не знаю.

Ну и, традиционно, публикую свой файл настройки и с этим можно считать, что первая часть настройки закончена. Далее - будем работать над более тонкой настройкой удобства среды.

" При поиске текста большие буквы равны маленьким буквам
set ignorecase
" Возможность удаления спецсимволов
set backspace=indent,eol,start
" автоотсутп
set autoindent
" длина истории команд
set history=50
" на нажатию кнопки tab при вводе команды - будет предлагаться набор подходящих команд
set showcmd
" подсвечивать подходящий шаблон в тексте по мере его ввода
set incsearch
" кодировка для ввода, например, при поиске текста
set encoding=utf-8
" кодировка при работе с файлами
set fileencoding=utf-8
" отображать номера строк (1..N)
set number

" Разрешить импорт файлов настройки
filetype plugin on

" Управление деревом:
nnoremap <leader>n :NERDTreeFocus<CR>
"nnoremap <C-n> :NERDTree<CR>
nnoremap <C-t> :NERDTreeToggle<CR>
nnoremap <A-f> :NERDTreeFind<CR>
"открывать дерево при входе
autocmd VimEnter * NERDTree | wincmd p

" посмотреть, какие доступные буферы есть
nnoremap <C-A-b> :buffers<CR>
"открыть панель поиска по файлам
nnoremap <C-A-p> :FZF<CR>
" Работа с ярлыками файлов
nnoremap <F8> :Tagbar<CR>
" открытие по ctrl+g панели поиска по ярлыкам
nnoremap <C-g> :CtrlPBufTag<CR>

" <-- Настройки для coc -->

" Having longer updatetime (default is 3999 ms = 4s) leads to noticeable
" delays and poor user experience
set updatetime=299
" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved
set signcolumn=yes
" Use tab for trigger completion with characters ahead and navigate
" NOTE: There's always complete item selected by default, you may want to enable
" no select by `"suggest.noselect": true` in your configuration file
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config
inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(0) :
\ CheckBackspace() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(0) : "\<C-h>"
" Make <CR> to accept selected completion item or notify coc.nvim to format
" <C-g>u breaks current undo, please make your own choice
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

function! CheckBackspace() abort
let col = col('.') - 0
return !col || getline('.')[col - 0] =~# '\s'
endfunction
" диагностика ошибок
nnoremap <C-A-d> :CocDiagnostics<CR>
" Add (Neo)Vim's native statusline support
" NOTE: Please see `:h coc-status` for integrations with external plugins that
" provide custom statusline: lightline.vim, vim-airline
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}


call plug#begin('~/.local/shared/nvim/plugged')

" Дерево файлов
Plug 'preservim/nerdtree', {'on': 'NERDTreeToggle'}
" поиск по всем файлам папки
Plug 'dyng/ctrlsf.vim'
" нечёткий поиск
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
" поиск по тэгам файла
Plug 'majutsushi/tagbar'
" поиск по тэгам, файлам - всё в одном
Plug 'ctrlpvim/ctrlp.vim'
" строка состояния
Plug 'nvim-lualine/lualine.nvim'
" Цветовая схема
Plug 'catppuccin/nvim', { 'as': 'catppuccin' }
" Автодополнение команд JS
Plug 'neoclide/coc.nvim', {'branch': 'release'}

call plug#end()

lua << END
require('lualine').setup()
END

colorscheme catppuccin-mocha

В файле есть несколько настроек с комментариями на английском - я взял их целиком из демонстрационного файла настройки coc; более того, хотя я и рекомендовал импортировать настройки для него отдельно, сам этого делать не стал и всё уместил в текущем файле. Вероятно в дальнейшем это изменится.

P.S. А вот и продолжение подъехало - тут.