Делаем из Vim-а конфетку

в 20:47, , рубрики: customization, IDE, jupyter, latex, markdown, vim

Вы под давлением коллег или сокурсников из более успевающих групп решились на отчаянный шаг, способный разделить вашу жизнь на период "до" и "после" (прошли vimtutor), и теперь не знаете что делать с вашими новообретёнными способностями? А может вы всё ещё сидите в какой-нибудь IDE и в ус не дуете зачем вам "эти ваши программистские блокноты" и "какой-то там Vim"? Тогда присаживайтесь поудобнее и налейте себе лимонад, сейчас я вам всё по полочкам разложу.

Делаем из Vim-а конфетку - 1

(Статья рекомендуется к последовательному прочтению, но для вашего удобства ниже приведено оглавление)

  1. Вступление
  2. Менеджер плагинов
  3. Настойка внешнего вида
  4. Поддержка Русского языка
  5. Интеграция с внешними программами
  6. В кратце о(б)
  7. Заключение

Давайте определимся с терминологией

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

Рабочая среда — это набор программ для разработки ПО. Например, он может содержать компилятор, интерактивную консоль, редактор раположения GUI элементов, дебаггер и прочее. Редактор — это лишь маленький кусочек этого пазла.

IDE — это вся рабочая среда, сосредоточенная в одном месте. Конечно, есть программы на подобии Emacs (далее Емакс), где вы сами вольны вставить в неё всё, что вам угодно при должном умении, однако чаще всего это уже готовый, собранный за вас пакет.

Зачем мне нужен тогда Вим, если за меня всё сделает IDE?

Раньше весомым аргументом была его расскладка, так как она для многих удобнее современных Емаксо-подобных многокнопочных комбинаций клавиш для навигации и редактирования текста. Однако, благодаря Neovim и другим проектам, таким как VSCodeVim, она есть буквально везде.

Однако есть ещё один более весомый аргумент — производительность. В IDE часто имеется огромное количество функционала, которым вы не пользуетесь, и фоновых процессов, которые сильно нагружают систему. Даже если ваш Макбук не орёт как истребитель от PyCharm или у вас не лагает скроллинг в Visual Studio (что невозможно, врунишки вы мои), а однопоточность Емакса не напоминает о первом Crysis или S.T.A.L.K.E.R., то всё равно встаёт вопрос энергопотребления и, как следствие, времени жизни батареи. Такое ПО в линукс сообществе характеризуют мемом термином "bloat".

Делаем из Vim-а конфетку - 2

Почему Вим?

У меня уже есть статья про все прелести этой программы. Однако она была написана человеком под впечатлением от новой игрушки с уровнем интеллекта второкурсницы (догадайтесь почему), что вылилось в настолько критично малое количество в ней смысла, что на её месте образовалась чёрная дыра. Ну хоть смешные картинки удались...

Что же я могу сказать про него сейчас, по прошествии года активного использования?

  1. Он очень быстрый. Ввиду особенностей его рендера, Вим имеет намного меньшую задержку, чем другие редакторы. После него другие редакторы кажутся неотзывчивыми, я уже молчу про выше упомянутые IDE.
  2. Его использование подобно прохождению третьего Dark Souls после первой части. Сначала сложно и непривычно, так как игра стала быстрее, и нельзя зачизить многие сложные моменты с помощью RPG составляющей, но потом приходит осознание того, что игра оказуалилась, и почти все боссы одолеваются со второй попытки.
  3. Он практически не тратит ресурсы и запускается даже на хлебушке, что очень хорошо сказывается на батарее.

В принципе, ничего откровенно плохого в других редакторах нет, так что оставьте этот выбор на сугубо ваше личное усмотрение. Меня не покидает уверенность, что вы сможете найти аналогичную статью для вашей любимой программы. Хотя, будем откровенными, редакторы на electron еле-еле проходят по критерию энергоэффективности.

В этой статье мы приведём Вим в удобаваримое состояние для серьёзной работы, а также научим его дружить с некоторыми сторонними программами для разработки. Учтите, что я буду рассказывать только про то, с чем мне довелось столкнуться лично, и если у вас интересные предложения, то добро пожаловать в комментарии.

Вставьте шутку про штепсель

Главным оружием для настройки нашего друга явлются плагины. По сути дела, это просто отдельные файлы с кодом на VimScript, которые исполняются при загрузке вашего файла настроек (~/.vimrc или ~/.config/nvim/init.vim) командой source. Ручками скачивать всё это довольно больно, поэтому великие умы человечества придумали пакетные менеджеры… для Вима!

Главная задача пакетного менеджера — скачать указанные плагины с гитхаба, предоставить пользователю удобный интерфейс по управлению ими и, собственно, подключать их при загрузке Вима. Есть, конечно, минималистичные менеджеры по типу Pathogen (который занимается преимущественно только третьим), но мы настолько усложнять себе жизнь не будем.

Нашим подопечным сегодня выступит vim-plug. Но, прежде чем вы пойдёте его устанавливать, сначала нужно добавить пару строчек в ваш конфиг:

filetype plugin indent on "Включает определение типа файла, загрузку...
"... соответствующих ему плагинов и файлов отступов
set encoding=utf-8 "Ставит кодировку UTF-8
set nocompatible "Отключает обратную совместимость с Vi
syntax enable "Включает подсветку синтаксиса

Эти команды вы чаще всего встретите в инструкциях по установке различных плагинов. Теперь давайте установим сам менеджер пакетов. Тут есть нужные команды для Vim и Neovim, но существует способ для его автоматического скачивания. Для этого добавьте следущие строчки в свой конфиг:

if empty(glob('~/.vim/autoload/plug.vim')) "Если vim-plug не стоит
  silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs "Создать директорию
     https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim 
  "И скачать его оттуда
  "А после прогнать команду PlugInstall, о которой мы сейчас поговорим
  autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif

Тогда при следующем запуске Вима, менеджер будет автоматически установлен, но его команды работать не будут и вы увидите ошибку. Хочу также заметить, что у вас в системе должен стоять curl, а для Neovim нужно поменять ~/.vim на ~/.local/share/nvim/site. Прежде чем вы перезапустите ваш редактор, предлагаю также добавить в настройки следущие строчки. Не забудьте изменить этот код для Neovim аналогично прошлому разу:

call plug#begin('~/.vim/bundle') "Начать искать плагины в этой директории
"Тут будут описаны наши плагины
call plug#end() "Перестать это делать

С этого момента у вас всё должно работать. Далее мы будем добавлять плагины меж этих строк по следующей схеме:

Plug 'пользователь/репозиторий' "Берём эти данные с гитхаба
"После чего перезагружаем файл настроек...
"... и исполняем команду :PlugInstall в панели команд

Есть и другие способы добавления плагинов в vim-plug и они подробно описаны на странице менеджера, но в них, чаще всего, нет нужды. Также, как вы могли догадаться, поиск плагинов осуществляется в общем случае Гуглом или этой прелестью. Также про них можно узнать из тематических форумов/сабреддитов и таких статей, как эта.

Делаем из Vim-а конфетку - 3
Слишком сложно...

Красота требует настройки

Самая базовая и, вместе с тем, одна из самых важных модификаций для программы, в которой вы будете проводить более 90% своего рабочего времени — внешний вид. Если вы пользуетесь терминальным Вимом и уже настраивали консоль, то эти изменения должны отобразиться и на самом редакторе, но можно пойти и дальше. Начнём с выбора темы.

Так наш подопечный (MacVim) выглядит сейчас:

Делаем из Vim-а конфетку - 4

Выбор темы

Для Вима, силами волонтёров, было написано немеренно готовых тем. Из большинства популярных редакторов их давно уже всех портировали. Как по мне, главная отличительная особенность Sublime Text — его тема Monokai, которую мы сейчас вероломно апроприируем.

...
Plug 'ErichDonGubler/vim-sublime-monokai' "Добавьте это в список плагинов
...

colorscheme sublimemonokai "Добавьте это НЕ в список плагинов

Теперь вы можете презагрузить ваш файл настроек (или сам Вим), и насладиться раскулаченным добром. Аналогично вы можете поставить себе и другие темы, такие как Darcula, Solarized Dark и.т.д.

Делаем из Vim-а конфетку - 5

Улучшенная строка состояния

Теперь давайте настроим наш status bar. Основная идея состоит в том, чтобы красиво показывать важную информацию по аналогии с tmux и панелями в WM на экране, касающуюся редактирования текста. Для этого давайте поставим Airline:

...
Plug 'vim-airline/vim-airline' "В список плагинов
...

"Не в список плагинов
let g:airline_powerline_fonts = 1 "Включить поддержку Powerline шрифтов
let g:airline#extensions#keymap#enabled = 0 "Не показывать текущий маппинг
let g:airline_section_z = "ue0a1:%l/%L Col:%c" "Кастомная графа положения курсора
let g:Powerline_symbols='unicode' "Поддержка unicode
let g:airline#extensions#xkblayout#enabled = 0 "Про это позже расскажу

Про Powerline мы поговорим далее, но главное, чего мы этим добьёмся, — секции строки состояния будут выделяться не прямоугольниками, а стрелками. Про Keymap мы поговорим в секции про интеграцию русского языка, но эта комманда просто скроет его индикатор из строки статуса (аналог останется в строке команд). Символ ue0a1 — это красивая альтернатива "ln", но также мною был опущен процентный показатель конца файла, ибо мне он показался излишним.

Вид Airline по умолчанию:

Делаем из Vim-а конфетку - 6

Вид после нашего вмешательства:

Делаем из Vim-а конфетку - 7

Шрифт и иконки

Как видите, мы сделали только хуже. Проблема заключается в том, что вам нужно установить в ваш терминал или gui шрифты с поддержкой Powerline. Для первого воспользуйтесь настройками самой консоли, а для второго это командой:

"16 вы можете поменять на нужный вам размер шрифта
set guifont=имя_вашего_шрифта_в_системе:h16

Но не спешите сейчас ставить полюбившийся вам шрифт из того списка. Во-первых, подобных шрифтов в природе больше и их можно патчить самому. Например, мой любимый — это Fira Code, который поддерживает лигатуры (о них можете почитать там же). Во-вторых, есть ещё один отличный плагин Devicons, который добавляет в Airline и Nerdtree (файловый проводник) удобные иконочки.

...
Plug 'ryanoasis/vim-devicons' "Далее я про это напоминать не буду
...

Но и они не работают.

Делаем из Vim-а конфетку - 8

Для того, чтобы все наши красивости заработали нам нужен не просто пропатченный на поддержку Powerline шрифт, но и совместимый с Nerd Font, благо такая вариация Fira Code имеется. Тут от системы к системе последовательность действий будет отличаться, но на MacOS с brew этот шрифт ставится в два счёта:

# В терминале
brew tap homebrew/cask-fonts
brew cask install font-firacode-nerd-font

И подключим его так (в GUI. И да, "фура" тут намеренно):

set guifont=Fura Code Light Nerd Font Complete:h16 "Это light версия

Теперь все наши элементы кастомизации должны встать на место:

Делаем из Vim-а конфетку - 9

Стандартные опции

Таким образом мы осветили самые важные аспекты кастомизации внешнего вида Вим. Подробнее про работу этих плагинов можно почитать либо в их мануалах (через команду :help) или на их страницах на гитхабе (ищутся в Гугл по имени из списка плагинов). Далее будут указаны другие полезные команды, а после этого мы перейдём к следующей большой теме:

set guioptions= "Отключаем панели прокрутки в GUI
set showtabline=0 "Отключаем панель табов (окошки FTW)

"Сам по себе number показывает справа номера строк
"relativenumber - нумерацию строк относительно положения курсора
set number relativenumber "А это гибридный вариант. Протестируйте все

"wrap заставляет переносить строчки без их разделения
"Соответсвенно nowrap рендерит строчки за границами экрана
set wrap linebreak nolist "Данная вариация работает как wrap...
"... но переносит строчки не посимвольно, а по словам

"Предыдущий способ известен как soft wrapping
"При желании вы можете заставить Вим насильно разделять...
"... строчки в самом тексте вот так:
set textwidth=80 "Где 80 стоит заменить на нужную вам длину строки

set cursorline "А так мы можем подсвечивать строку с курсором

"Если вы используете обычный терминальный Вим, а не NeoVim, то...
"... для изменения курсора в разных режимах используйте это:
set ttimeoutlen=10 "Понижаем задержку ввода escape последовательностей
let &t_SI.="e[5 q" "SI = режим вставки
let &t_SR.="e[3 q" "SR = режим замены
let &t_EI.="e[1 q" "EI = нормальный режим
"Где 1 - это мигающий прямоугольник
"2 - обычный прямоугольник
"3 - мигающее подчёркивание
"4 - просто подчёркивание
"5 - мигающая вертикальная черта
"6 - просто вертикальная черта

set macligatures "Включает поддержку лигатур в MacVim
"Лучше бы не поддерживал совсем

Русский ферштейн?

Наверное, самый главный отталкивающий фактор в освоении Вима, с которым сталкиваются все русскоговорящие программные инженеры — Русский язык. Не то, чтобы у меня была какая-то неприязнь к великому и могучему, но она есть у нашего редактора, причём ко всем языкам, отличным от Английского.

Вим обходит системные драйвера клавиатуры и сам обрабатывает ввод. Хорошая новость состоит в том, что это делает его самым быстрым и отзывчивым редактором среди конкурентов. Плохая новость — он считывает не нажатие клавиши, а введённые символы. Результирует это в том, что команды нормального режима (и много что ещё) на других раскладках не работают.

Лекарство для этой болезни искали люди давно, так как вечно ручками дёргать язык ввода неудобно. Когда появились более близкие к системе штуки, такие как gVim и MacVim, они тоже не справились (и не особо пытались). Поэтому на данный момент есть пара костылей:

Langmap

Наверное, при поиске решения в интернете, вы натыкались на строчки подобного характера:

set langmap=ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ;ABCDEFGHIJKLMNOPQRSTUVWXYZ,фисвуапршолдьтщзйкыегмцчня;abcdefghijklmnopqrstuvwxyz

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

Keymap

Существует чуть более адекватный стандартный способ переключения раскладки:

"Если вы используете обычную qwerty, то поменяте mac на win
set keymap=russian-jcukenmac
"Язык ввода при старте Вима - Английский
set iminsert=0
"Аналогично настраивается режим поиска
set imsearch=0

Теперь вам просто нужно при входе в редактор удостовериться, что системная раскладка — английский и… научиться переключать язык по <C-^>… Да, это сочетание клавиш можно переназначить. Нет, не на ту же комбинацию клавиш, что и системое переключение.

Помимо того, что вам придётся привыкать к переключению языка разными командами в разных программах, он также не работает в режиме замены. Но это универсальный, кроссплатформенный способ, а как скрыть отображение текущего (и скорее всего единственного) Keymap мы уже рассмотрели.

Xkb-switch

Сие есть прекрасная консольная утилита для переключения раскладки в терминале. Сейчас мы в первый раз попробуем заставить Вим общаться с внешними программами. У Xkb-switch есть порты под три популярные операционные системы, но, как водится, здесь мы рассмотрим установку на MacOS. Для других систем вы можете найти инструкции на сайте плагина.

# Давайте сначала скачаем саму программу
git clone https://github.com/myshov/xkbswitch-macosx
# Установка происходит простым копированием в директорию в $PATH
cp xkbswitch-macosx/bin/xkbswitch /usr/local/bin/xkbswitch
# Аналогично мы поступим с библиотекой-интеграцией с плагином
git clone https://github.com/myshov/libxkbswitch-macosx
cp libxkbswitch-macosx/bin/libxkbswitch.dylib /usr/local/lib/libxkbswitch.dylib

А теперь победным маршем добавим эти строчки в конфиг:

...
Plug 'lyokha/vim-xkbswitch'
...

let g:XkbSwitchEnabled = 1 "Дёргаем рубильник

И все ваши проблемы решены. В основном потому что мы это сделали заранее. Помните строчку из настройки Airline, упоминавшую Xkb-switch? По дефолту наш статус бар показывает номер текущей раскладки, но (по крайней мере у меня) это заставляло скроллинг в Виме безбожно зависать вплоть до полной остановки работы, поэтому мы это просто отключили.

Теперь наш верный друг должен работать с разными раскладками как любой другой современный редактор. При переходе в режим вставки Xkb-switch будет переключать раскладку с английской, на последнюю, вами использованную и vice versa. Также он умеет автоматически адаптировать ваши сочетания клавиш под новые раскладки. Однако командный режим и режим замены снова за бортом.

Интегрируем дифференцируя

Продолжая тему навязывания дружбы между Вимом и внешними программами, давайте рассмотрим несколько более масштабных вариантов интеграции этого редактора с вашим ПО.

Делаем из Vim-а конфетку - 10
Размечтались...

Slime

Наверное, один из самых полезных плагинов для Емакса — это Slime. Суть его работы заключается в введении новой комбинации клавиш Ctrl-C-C, которой вы можете посылать куски кода в REPL вашего любимого языка программирования. Благо умельцы забрали это чудо к нам:

...
Plug 'jpalardy/vim-slime'
...

Теперь, когда вы выделите текст и настучите этот шорткат, Slime пойдёт искать терминал с работающим screens и спросит название вашей сессии и номер окна, после чего пошлёт в него ваш текст и исполнит. При желании, можете перенастроить её на работу с tmux и даже встроенным в Вим терминалом (да, в Виме есть терминал). Примеры перенастройки:

"Для tmux
let g:slime_target = "tmux"

"Для обычного Вима
let g:slime_target = "vimterminal"

"Для Вима избранных
let g:slime_target = "neovim"

Jupyter

От посылочек с кодом в общем случае, давайте перейдём к более узкому. Jupyter — это бывший iPython, который предоставляет очень удобную консоль для исполнения питоновских команд с поддержкой рендера графиков и изображений в matplotlib. У него есть встронный редактор notebook и чуть менее встроенный lab, но оба — довольно печальное зрелише.

Давайте сначала сгенерируем и настроим конфиг для… Нет, не для Вима, а для Jupyter:

jupyter qtconsole --generate-config
vim ~/.jupyter/jupyter_qtconsole_config.py

Теперь найдите эту строчку

#c.ConsoleWidget.include_other_output = False

и раскомментируйте её, заменив False на True.

А теперь добавьте это в конфиг уже Вима для установки Jupyter-vim:

...
Plug 'jupyter-vim/jupyter-vim'
...

Теперь вы можете, открыв ваш код на Python (или на другом поддерживаемом языке), разбить его на блоки (начало блока обозначается символом ## или #%%) и подключиться к Jupyter. Для этого вам его нужно сначала запустить:

jupyter qtconsole &

А в самом Виме вбить

:JupyterConnect "Не в конфиге, а в редакторе

Теперь по нажатию X (если — ваш <localleader>) вы исполните в Jupyter блок кода, на котором у вас стоит курсор, а по нажатию R вы прогоните весь файл. Больше сочетаний клавиш вы можете найти на сайте плагина.

К сожалению, тут не всё так гладко. Сам плагин часто забывает скомпилировать свои команды, и его приходится вызвать костылями:

nnoremap <leader>jc :call jupyter#Connect()<CR> "как пример

А сам Jupyter обожает переодически крашиться и не убивать свои питоновские процессы, что очень пагубно вляет на плагин. Он впадает в хроническию депрессию, смотрит с упоением на кухонные приборы, строя вокруг них планы по составлению компании усопшему, и отказывается отвечать на ваши пинки до перезагрузки системы.

Думаю, ему можно это простить, так как других альтернатив нет. Если у вас есть желание помочь его разработке и заработать социальные плюсы, то вы найдёте его код всё там же — на гитхабе.

LaTeX

Конечно, Вим можно использовать как средство написания кода, но он более универсален. Ответ "насколько" кроется в самом термине "текстовый редактор" — в нём можно редактировать текст (неожиданно, не так ли?). Это значит, что в нём можно написать курсовую или дипломную.

В чём пишут такие типы документов и, в принципе, научные работы? Правильно, в LaTeX! Конечно, этой технологии можно найти ещё море применений, но для всех них можно использовать наш программисткий блокнот. Поэтому давайте скачаем и установим Vimtex.

...
Plug 'lervag/vimtex'
...

let g:tex_flavor = 'latex' "Уточняем какой Тех

"Отключаем автоматическое открытие окна Quickfix
let g:vimtex_quickfix_mode = 0

Теперь, если вы войдёте в файл с расширением .tex и введёте <localleader>ll (или :VimtexCompile), то у вас скомпилируется проект, предупреждения и ошибки отправятся в Quickfix и Location списки, а также откроется системный просмотрщик pdf.

Однако в MacOS её Preview не умеет автоматически обновлять документ при его изменении и на него приходится тыкать мышкой. В Линуксе очень любят программу Zathura, у которой схожие с Вимом элементы управления и есть возможность поменять цвета документа и элементов интерфейса, чтобы получить тёмную тему. Давайте её настроим:

# Это пример установки на MacOS (не забудьте про XQuartz)
brew tap zegervdv/zathura
brew install zathura --with-synctex
brew install zathura-pdf-poppler

# Настраиваем плагины (требуется после каждой переустаноки)
mkdir -p $(brew --prefix zathura)/lib/zathura
ln -s $(brew --prefix zathura-pdf-poppler)/libpdf-poppler.dylib $(brew --prefix zathura)/lib/zathura/libpdf-poppler.dylib

# И нам нужна эта зависимость
# Но она замедляет инициализацию Vimtex
# Так что выбор за вами
brew install xdotool

Теперь попросим Vimtex использовать zathura по умолчанию:

let g:vimtex_view_method = 'zathura'

С этого момента в Linux у вас должна по умолчанию открываться ваша новая программа для просмотра pdf. Однако в системе для любителей сорта макинтош такой важный функционал не завезли, поэтому вам придётся её запусткать ручками: сворачиваем Vim нажатием <C-z>, вводим zathura имя_файла.pdf & и возращаемся в Вим — fg.

Делаем из Vim-а конфетку - 11

Если вы хотите такие же цвета, то добавьте эти строчки в ~/.config/zathura/zathurarc (учтите, что это инвертирует даже в вложенные изображения)

set recolor true
set recolor-darkcolor "#dcdccc"
set recolor-lightcolor "#1f1f1f"

Markdown

К сожалению, у LaTeX есть несколько небольших проблем. Он слишком комплексный для относительно простых задач и довольно медленно компилируется. Но наши мольбы об идеале услышали боги вёрстки и сотворили такую прекрасную вещь как Markdown.

Markdown (также известный как "та штука с гитхаба") — это очень простой язык разметки, который моновением волшебной палочки компилируется в HTML. Он очень удобен для написания больших текстов с незамысловатым форматированием (как эта статья). К счастью, фанатов у него много, поэтому и плагинов для Вима под него — море.

Давайте рассмотрим плагин Livedown. Его главная задача — представлять из себя vimtex для markdown. По сочетанию клавиш он открывает ваш файл в браузере и далее продолжает его обновлять при каждом сохранении исходников. Но сначала вам придётся установить Nodejs и пакет для него:

# Применимо к MacOS
brew install node
# Универсально
npm install -g livedown

А это добавьте в конфиг:

...
Plug 'shime/vim-livedown'
...

"Поменяйте сочетание клавиш на любое вам удобное
nnoremap <leader>ld :LivedownToggle<CR>

Теперь при введении команды <leader>ld (или ваш вариант) вы можете включать плагин или выключать. Кстати, он также умеет отображать HTML файлы, но он всё ещё думает, что они на markdown написаны, так что ожидайте некоторые "странности" вёрстки.

Как уже упоминалось, плагинов для markdown в Виме — великое множество. Мне также довелось пощупать чудо по имени Markdown-preview. Он исполняет те же функции, что и Livedown, но умеет скроллить скомпилированный текст в зависимости от положения вашего курсора и закрывается при переключении буффера (а не по выходу из редактора). Мне лично он понравился меньше, но это уже вкусовщина.

Блиц раздел

Как и было обещано, мы рассмотрели некоторые важные аспекты рабочей среды, которые мы успешно (относительно) смогли связать с нашим любимым редактором. Насчёт других аспектов я с полной уверенностью говорить не могу, так как у меня с ними мало опыта, но на затравочку давайте пробежимся по некоторым интересным вещам:

Комментарии про отладку

Делаем из Vim-а конфетку - 12

Чуда не будет. Дебаггеры — это очень важные программы для отладки ваших проектов, так как позволяют отслеживать состояние системы во время исполнения вашего кода. Однако их интеграция в редакторы всегда была очень болезненной, так как они очень платформозависимы и неповоротливы.

Это не является минусом конкретно Vim, так как в том же Sublime Text дела обстоят не лучше. Хотя вам никто не мешает просто научиться ими пользоваться из консоли. Туториалов на эту тему полно, и сам процесс несложный.

Если вы заложник яблока, то используйте гайды для gdb, но сами туда подставляйте аналогичные команды из lldb с помощью этого сайта.

Уход за проектом

В Виме есть встроенная команда :make, которая ведёт себя как одноимённая программа для терминала. Плюс этого подхода в том, что она вас носом проведёт по всем предупреждениям и ошибкам, указывая на то, что её беспокоит (это поведение настраивается).

Про настройку проверки синтаксиса и непосредственного написания кода уже написано много статей, но могу посоветовать установить YouCompleteMe для автодополнения по табу, отключить у него проверку синтаксиса и поставить для неё Neomake:

...
Plug 'Valloric/YouCompleteMe'
Plug 'neomake/neomake'
...
"Не забудьте, что YCM нужно компилировать после кадого обновления
"Например: python3 ~/.vim/bundle/YouCompleteMe/install.py --clang-completer

let g:ycm_show_diagnostics_ui = 0 "Обрубаем YCM

"А вот пример настройки работы Neomake
let g:neomake_cpp_clang_maker = {
    'exe': 'clang++',
    'args': ['-I/usr/local/include/wx-3.0', '-std=c++17'],
    }

Прыжки по тегам

У Вима есть встроенная комбинация клавиш <C-]>, который позволяет вам перейти к имплементации выделенного термина. Однако для его работы нужны те самые тэги. Сгенерировать их можно терминальной командой ctags:

# В корне проекта прогоните это
ctags -R &

Если вам нужно перейти к объявлению этого термина, то вам поможет (у вас должен быть установлен YCM):

"Наведите курсор на нужный термин и введите команду:
:YcmCompleter GoToDeclaration

Однако, постоянно отправлять Вим в задний фон и запускать ручками команду — не очень удобно. Также не очень удобно в больших проектах подолгу ждать выполнение индексации. Но у меня и для этой проблемы найдётся ответ...

Асинхронные команды

Одним из недавних трендов программирования является асинхронность. Она позволяет одновременно выполнять несколько разных задач, но сама программа остаётся однопоточной.

Вим — однопоточная программа (ему можно, у него амбиции ниже). Поэтому, если на него слишком много плагинов, то он поползёт со скоростью улитки. Но начиная с версии 8 (ну и в NeoVim это тоже есть) в него добавили API для асинхронных вызовов. Теперь ваш линтер, работающий в реальном времени, не будет замедлять сам процесс редактирования текста.

Давайте в качестве нашего подопечного возьмём плагин AsyncRun. Он умеет запускать асинхронно терминальные программы как в Vim 8, так и в NeoVim (ну и всех их разновидностях).

...
Plug 'skywind3000/asyncrun.vim'
...

nnoremap <F3> :AsyncRun ctags -R<CR>

Теперь по нажатию клавиши F3 вы будете прогонять рекурсивно в директории проекта ctags. Вы всегда можете посмотреть вывод запущенной через AsyncRun программы в окне Quickfix. Умышленно убить программу в заднем фоне можно с помощью команды AsyncStop.

Соответственно, вызывать zathura можно также асинхронно:

:AsyncRun zathura mew.pdf

Интеграция с Git

Человечеством ещё не было придумано более удобного способа пользоваться Git, чем через терминал. Многие IDE пытались бороться с такой тенденцией, но либо упрощали процесс настолько, что терялись важные фичи, либо усложняли до безумия. Но для фанатов делать всё из-под Вим таки нашёлся плагин Fugitive, просто оборачивающий всеми любимые команды.

Однако, по аналогии с прошлым пунктом, можно пойти и дальше, добавив немного асинхронности. :Gfetch и :Gpush умеют пользоваться сторонними реализациями :Make, так что для нашей затеи вам понадобится лишь добавить эту строчку в свой конфиг:

command! -bang -nargs=* -complete=file Make AsyncRun -program=make @ <args>

Заключение

Главная задача этой статьи состояла не сколько в доказательстве того, что IDE откровенно плохи, а в том, чтобы показать вам, что Вим тоже имеет порох в пороховницах. Если вы потратите время на настройку окружения под него, то получите более быструю, эффективную и понятную рабочую среду. И да, пожалуйста, не пытайтесь в комментариях доказать, что какой-то стиль редактирования лучше или хуже других. Не докажете.

Надеюсь, что вы хорошо провели время, читая эту статью (написанную в NeoVim) и...

Делаем из Vim-а конфетку - 13

Источники

Ссылки на все плагины уже указаны в статье, но

  1. Мой конфиг, на котором основанна эта статья можно найти тут
  2. Ещё раз упомяну VimAwesome
  3. Также многие проблемы были решены пролистыванием Reddit
  4. В вики тоже много полезных лайфхаков для решения проблем без плагинов

Автор: Хова Феклисова

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js