Все рано или поздно пробуют поработать с 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'
Главная цель всей истории. На это тему существует большое количество
расширений на любой вкус - развитые и заброшеные, медленные, старые,
новые обобщёные и решающие частные задачи. Главное - их всегда будет
сразу несколько, и их набор зависит от инструментов, для которых вы
готовите 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'