Paveltrpn GitHub IO

Posts

About

Todo

Настройка vim и nvim

Все рано или поздно пробуют поработать с vim (далее не буду писать nvim, неявно подрузомевая и его тоже). Кто то наслушается историй про невероятную продуктивность при работе с этими редакторами, кто то в поисках бесплатных и открытых альтернатив, кто-то из чувства вызова и 1% остаётся на тех, кому от действительно полезен:)

В этой заметке будет оисан мой опыт по настройке vim в качестве IDE. И, в основном, речь пойдёт только о настройке - т.е. установке, настройке основных визуальных моментов и вещей, влияющих на "useability" и, конечно, большую часть будет занимать вопрос о плагинах, их наличии в принципе для решения конкретных задач.

Начало. Цели и план.

Для начала стоит сразу сказать о vim то, каким я его увидел после всех слухов, попыток его установить настроить и пользоваться. Главное - интернет преподносит vim как замену (или альтернативу, с некоторыми допущениями) полноценным IDE вроде Visual Studio, продуктам Intllij, Sublime и т.д. Это, конечно, не так. VSCode можно назвать таким продуктом, но не vim. Помучевшись с настройкой, обвешав его кучей плагинов и пойдя на некоторые компромисcы (хотя для сама по себе эта работа довольно трудоёмка) можно добиться подобия уровня работы VSCode. Но, всё таки у этого решения есть минусы - если базовая настройка довольно проста, то так называемые макросы, установка и настройка плагинов (что есть 100% необходимость) или, не дай бог, написание каких-то решения под себя требует уже хотя бы базового погружения в инструментарий и API vim, т.е. изучения Vim script, Lua, а с недавних пор ещё и Vim9 script. Сама по себе это вполне решаемая задача, но её трудоёмкость далека от наличных ресурсов большенства пользователей того-же VSCode, и если vim притягивает своей клавиатуроцентричностью то стоит взглянуть на соответствующие расширения VSCode.

Теперь про сложившуюся дихотомию Vim - Neovim. Neovim описывают как более успешную альтернативу и в качестве доказательства приводят количество звёзд на github, но есть такой момент - у абсолютно необходимых плагинов vim, покрывающих большую часть проблем гораздо больше звёзд чем у их альтернатив в Lua мире Neovim. К тому же сам упор поклонников Neovim на наличии Lua, видимо не столь весомый аргумент, т.к. с тех пор как быстрый скриптовый язык был насущной потребностью, vim сам претерпел серьёзные изменения и обзавёлся асинхронностью и даже новым языком - Vim9 script. В общем, как говориться, "шо то, шо то...", у одного поддержка LSP через хорошие плагины у другого нативно, но требуется потанцевать и так во всём, к тому же даже для конфига Neovim через Lua часто требуется прибегать к вствкам vim script кода.

Цель всего этого - превратить ванильный vim в некое подобие VSCode с расширениями. Перечень необходимого:

План описания такой - по каждому пункту будут расписаны действия, для установки и настройки соответствующих функций как в Vim так и в Neovim. Всё описаное ниже справедливо для Ubuntu Linux 22.04, для Windows, в некоторой степени, всё тоже самое справедоиво, со скидкой на структуру каталогов, процесс установки программ и другие "мелочи"). Процесс написания файла конфигурации не приведён здесь т.к. его можно легко проследить по готовым файлам, благо они подробно откомментированы.

Установка (сборка)

Установка из репозиториев как обычно банальна:

sudo apt-get install vim
sudo apt-get install neovim

Правда, в репозитории может лежать не актуальная версия, поэтому можно и так:

# Для Neovim
curl https://github.com/neovim/neovim/releases/download/v0.7.2/nvim-linux64.deb --output nvim-linux64.deb
sudo apt install neovim-linux64.deb

# Vim можно скачать и собрать из исходников
git clone https://github.com/vim/vim
cd vim/
./configure\ 
  --enable-cscope\
  --with-features=huge\
  --with-x\
  --with-compiledby="paveltrpn"
make -j6
sudo make install

# Возможно, предварительно необходимо будет установит зависимости
# например:
sudo apt-get install libncurses-dev

Ещё пример сборки vim из исходников

# Зависимости
sudo apt install libncurses*-dev \
libgtk*-dev libatk*-dev \
libcairo*-dev python-dev \
python3-dev git 


cd /usr && sudo git clone https://github.com/vim/vim.git && cd vim  

sudo ./configure --with-features=huge \
--enable-multibyte \
--enable-pythoninterp=yes \
--with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ \  # pay attention here check directory correct
--enable-python3interp=yes \
--with-python3-config-dir=/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu/ \  # pay attention here check directory correct
--enable-gui=gtk2 \
--enable-cscope \ 
--prefix=/usr/local/
make -j6 && sudo make install

Первым делом после этого нужно сделать файл конфигурации:

# Директории по умолчанию
# Для Vim
touch ~/.vimrc

# Для Neovim
touch ~/.config/nvim/init.vim
# или
touch ~/.config/nvim/init.lua

Менеджер плагинов

Два самых популярных для vim и neovimv соответственно - vim-plug и packer.nvim

# vim-plug 
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

# packer.nvim
git clone --depth 1 https://github.com/wbthomason/packer.nvim \
    ~/.local/share/nvim/site/pack/packer/start/packer.nvim

Менеджеры плагинов необходимо сразу прописать в конфиг и можно ими пользоваться. Комманды установки для соответствующего менеджера - Vim-plug - :PlugInstall, Packer.nvim - PackerInstall

Укрошательства и удобство

Включение подсветки синтаксиса, настройка табуляции и переносов, номера строк и цветовая схема (например dark) - встроенные возможности и устанавливаются напрямую в конфиге. Цветовые темы нужно скачивать дополнительно, вот несколько для примера:

# vim-plug 
Plug 'safv12/andromeda.vim'
Plug 'ghifarit53/tokyonight-vim'

# packer.nvim
use 'folke/tokyonight.nvim'

Дерево каталогов

Тут, в общем то, выбор невелик, есть по одному самому популярному расширению для каждого редактора

# vim-plug 
Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }

# packer.nvim
use 'kyazdani42/nvim-tree.lua'

# Опционально сразу же можно
# установить набор иконок, они пригодятся
# не только для этих плагинов. Тут необходимо, так же
# установить патченые шрифты семейства nerd, 
# например Fira Code Nerd
Plug 'ryanoasis/vim-devicons'
use {'kyazdani42/nvim-web-devicons'}

Плавная прокрутка

Как по мне это одна из самых необходимых опций. Дёрганая навигация по тексту по умолчанию довольно резковата и неприятна. Эти плагины вызывают гличи в Windows. Конечно, вместо них можно использовать колесо мышки)

# vim-plug 
Plug 'psliwka/vim-smoothie'

# packer.nvim
use 'karb94/neoscroll.nvim'

# скролить можно через
# ctrl-f, ctrl-b, ctrl-e, ctrl-y

Нечёткий поиск фаилов и текста внутри файлов

В этом месте я обхожусь простым fzf и silver-searcher в nvim, хотя можно использовать более продвинуты вещи вроде telescope. Плагины ack.vim, ag.vim собственно в vim работают без всплывающего окна как в neovim и выбрасывают трейс в консоль с открытием qiuckfix а это вообще неудобно и несколько снижает ценость vim как IDE.

# Для всего этого нужно установить собственно
# fuzzy finder, silver-searcher или ripgrep
sudo apt-get isntall fzf
sudo apt-get install silversearcher-ag
sudo apt-get ripgrep

# vim-plug 
Plug 'junegunn/fzf'
Plug 'mileszs/ack.vim'


# packer.nvim
use 'ibhagwan/fzf-lua'
use {
  'nvim-telescope/telescope.nvim', tag = '0.1.0',
-- or                            , branch = '0.1.x',
  requires = { {'nvim-lua/plenary.nvim'} }
}

Строка состояния и закладки

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

# все поддерживают иконки
# vim-plug 
# Совмещает статус-бар и закладки
Plug 'vim-airline/vim-airline'

# packer.nvim
use 'feline-nvim/feline.nvim'
use 'romgrk/barbar.nvim'

Настройка IDE функций

Главная цель всей истории. На это тему существует большое количество расширений на любой вкус - развитые и заброшеные, медленные, старые, новые обобщёные и решающие частные задачи. Главное - их всегда будет сразу несколько, и их набор зависит от инструментов, для которых вы готовите vim, т.е. под какой язык всё это затачивается. В моём случае это Golang.
Для Vim и Neovim используются два немного разных подхода - для первого это плагин 'fatih/vim-go' в сочетании с 'neoclide/coc.nvim', для второго это нативный LSP сервер (возможно с дополнительными расширениями).
'fatih/vim-go' - популярный плагин для поддержки golang, работает в связке с gopls и решает основные IDE функции вроде просмотра документации, автодополнения (в контексте golang) и запуска форматтера, линтера и т.д.
'neoclide/coc.nvim' - мощный и очень популярный комбаин, поддерживающий через LSP множество языков и способный заменить специализированное решение, но несколько медленнее т.к. тянет с собой node.js runtime. Я использую его в дополнение к vim-go в качестве "generic" автодополнения.
В случае Neovim вся работа идёт через нативный LSP сервер, который, тем не менее, требует отдельного расширения для интеграции и настройки. Это расширение может (и должно) быть дополнено специализированным решением (може быть что то из этого - 'olexsmir/gopher.nvim', 'govim/govim').
Сюда же относится интеграция с git. Всегда полезно и удобно иметь возможность отслеживать измениения относительно последнего коммита и т.п.

# vim-plug 
Plug 'fatih/vim-go'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
# Поддержка git
Plug 'airbladbe/vim-gitgutter'

# packer.nvim
# Требует отдельной настройки, которая
# описана на гитхабе проекта
use 'neovim/nvim-lspconfig'
# Autocomplition engine
# for work need do this:
# sudo apt-get install python3-venv
# :COQdeps
use 'ms-jpq/coq_nvim'
# snippets
use 'ms-jpq/coq.artifacts'
# Поддержка git
use 'lewis6991/gitsigns.nvim'

Дополнительные мелочи

Последним пунктом нужно добавить полезные, но второстепенные возможности, которые и так могут быть предоставлены уже упоминавшимися расширениями, но, так же, имеют специализированные и более эффективные решения

# vim-plug 
# Автовставка парных скобок, кавычек и т.д. 
  Plug 'raimondi/delimitmate'
# Комментирование кода 
  Plug 'preservim/nerdcommenter'
  Plug 'tpope/vim-commentary'
# Мультистрочное редактирование
  Plug 'mg979/vim-visual-multi'
# Упрощает поиск текта по заданному шаблону
  Plug 'justinmk/vim-sneak'

# packer.nvim
# Автовставка парных скобок, кавычек и т.д. 
use 'windwp/nvim-autopairs'
# Поддержка treesiter для neovim. Поддержка
# реализована нативно, расширение нужно, как 
# обычно для настройки. Treesitter - это анализатор
# кода для многих языков, используется, например, для
# подсветки синтаксиса
use 'nvim-treesitter/nvim-treesitter'