Робимо з Vim-а цукерку

Робимо з Vim-а цукерку
24 хв. читання
30 вересня 2019

Давайте визначимося з термінологією

Vim (далі Вім) - це, як багато хто вже знає, текстовий редактор. Звичайно, зміна вами написаного є дуже важливим заняттям, яке є пляшковим горлом у вашій продуктивності, але, на жаль, не все в цьому житті так просто, і вам (як користувачу) найчастіше необхідний і інший функціонал.

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

IDE - це все робоче середовище, зосереджена в одному місці. Звичайно, є програми на зразок Emacs (далі Емакс), де ви самі вільні вставити в неї все, що вам завгодно при належному вмінні, однак найчастіше це вже готовий, зібраний за вас пакет.

Навіщо мені потрібен тоді Вім, якщо за мене все зробить IDE?

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

Однак є ще один вагоміший аргумент - продуктивність. В IDE часто є величезна кількість функціональності, якою ви не користуєтеся, і фонових процесів, які сильно навантажують систему. Навіть якщо ваш Макбук НЕ кричить як винищувач від PyCharm або у вас не лагає скролінг в Visual Studio (що неможливо, брехуни ви мої), а однопоточний Емакс не нагадує про перший Crysis або STALKER, то все одно постає питання енергоспоживання і, як наслідок, часу життя батареї. Таке ПО в лінукс співтоваристві характеризують мемом терміном "bloat".

- Чому Вім?

  • Він дуже швидкий. Зважаючи на особливості його рендеру, Вім має набагато меншу затримку, ніж інші редактори. Після нього інші редактори здаються нечуйними, я вже мовчу про вище згадані IDE.
  • Він практично не витрачає ресурси, що дуже добре позначається на батареї.

В принципі, нічого відверто поганого в інших редакторах немає, так що залиште цей вибір на суто ваш особистий розсуд. Мене не покидає впевненість, що ви зможете знайти аналогічну статтю для вашої улюбленої програми. Хоча, будемо відвертими, редактори на 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 і вони докладно описані на сторінці менеджера, але в них, найчастіше, немає потреби. Також, як ви могли здогадатися, пошук плагінів здійснюється в загальному випадку Гуглом або цією красою. Також про них можна дізнатися з тематичних форумів / сабреддітов і таких статей, як ця.

Краса вимагає налаштувань

Найбазовіша і, разом з тим, одна з найважливіших модифікацій для програми, в якій ви будете проводити більше 90% свого робочого часу - зовнішній вигляд. Якщо ви користуєтеся термінальним Вімом і вже налаштовували консоль, то ці зміни повинні відобразитися і на самому редакторі, але можна піти і далі. Почнемо з вибору теми.

Так наш підопічний (MacVim) виглядає зараз:

Робимо з Vim-а цукерку

Вибір теми

Для Віма, силами волонтерів, було написано неміряно готових тем. З більшості популярних редакторів їх давно вже всіх портували. Як на мене, головна відмітна особливість Sublime Text - його тема Monokai, яку ми зараз віроломно апропріюємо.

...
Plug 'ErichDonGubler / vim-sublime-monokai' "Додайте це до списку плагінів
...
colorscheme sublimemonokai "Додайте це НЕ в список плагінів

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

Робимо з Vim-а цукерку

Покращений рядок стану

Тепер давайте налаштуємо наш 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-а цукеркуВид після нашого втручання:

Робимо з Vim-а цукерку

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

Як бачите, ми зробили тільки гірше. Проблема полягає в тому, що вам потрібно встановити в ваш термінал або gui шрифти з підтримкою Powerline. Для першого скористайтеся налаштуванням самої консолі, а для другого це команда:

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

Але не поспішайте зараз ставити шрифт з того списку. По-перше, подібних шрифтів в природі більше і їх можна патчити самому. Наприклад, мій улюблений - це Fira Code, який підтримує лігатури (про них можете почитати там же). По-друге, є ще один відмінний плагін Devicons, який додає в Airline і Nerdtree (файловий провідник) зручні іконочки.

...
Plug 'ryanoasis/vim-devicons' "Далі я про це нагадувати не буду
...

Але і вони не працюють.

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

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

І підключимо його так 

set guifont = Fura\Code\Light\Nerd\Font\Complete:h16 "Це light версія

Тепер всі наші елементи кастомізації повинні встати на місце:

Робимо з Vim-а цукерку

Стандартні опції

Таким чином ми висвітлили найважливіші аспекти кастомізації зовнішнього вигляду Вім. Детальніше про роботу цих плагінів можна почитати або в їх мануалах (через команду :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 = ukrainian-jcukenmac
"Мова набору при старті Віма - Англійська
set iminsert = 0
"Аналогічно настроюється режим пошуку
set imsearch = 0

Тепер вам просто потрібно при вході в редактор упевнитися, що системна розкладка - англійська і ... навчитися перемикати мову по ... Так, це поєднання клавіш можна перепризначити. Ні, не на ту саму комбінацію клавіш, що і система перемикання.

Крім того, що вам доведеться звикати до перемикання мови різними командами в різних програмах, він також не працює в режимі заміни. Але це універсальний, багатоплатформовий спосіб, а як приховати відображення поточного (і швидше за все єдиного) 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. Також він вміє автоматично адаптувати ваші поєднання клавіш під нові розкладки. Однак командний режим і режим заміни знову за бортом.

Інтегруємо диференціюючи

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

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 (якщо \ - ваш ) ви виконаєте в Jupyter блок коду, на якому у вас стоїть курсор, а після натискання \R ви виженете весь файл. Більше поєднань клавіш ви можете знайти на сайті плагіна.

На жаль, тут не все так гладко. Сам плагін часто забуває скомпілювати свої команди, і його доводиться викликати милицями:

nnoremap  jc :call jupyter # Connect ()  "як приклад

А сам Jupyter обожнює періодично краш і не вбивати свої пітоновскіе процеси, що дуже згубно впливає на плагін. Він впадає в хронічну депресію, дивиться з захватом на кухонні прилади, будуючи навколо них плани щодо складання компанії покійному, і відмовляється відповідати на ваші стусани до перезавантаження системи.

Думаю, йому можна це пробачити, так як інших альтернатив немає. Якщо у вас є бажання допомогти його розробці і заробити соціальні плюси, то ви знайдете його код все там же - на гітхабе.

LaTeX

Звичайно, Вім можна використовувати як засіб написання коду, але він більш універсальний. Відповідь "наскільки" криється в самому терміні "текстовий редактор" - в ньому можна редагувати текст (несподівано, чи не так?). Це означає, що в ньому можна написати курсову або дипломну.

У чому пишуть такі типи документів і, в принципі, наукові роботи? Правильно, в LaTeX! Звичайно, цієї технології можна знайти ще море застосувань, але для всіх них можна використовувати наш програмістки блокнот. Тому давайте завантажити і встановити Vimtex.

...
Plug 'lervag/vimtex'
...
let g:tex_flavor = 'latex' "Уточнюємо який Тих

"Відключаємо автоматичне відкриття вікна Quickfix

let g:vimtex_quickfix_mode = 0

Тепер, якщо ви ввійдете в файл з розширенням .tex і введете 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 натисканням , вводимо zathura імя_файла.pdf & і в усьому зростали в Вім - fg.

Робимо з Vim-а цукерку

Якщо ви хочете такі ж кольори, то додайте ці рядки в ~ / .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 ld :LivedownToggle

Тепер при введенні команди ld (або ваш варіант) ви можете включати плагін або вимикати. До речі, він також вміє відображати HTML файли, але він все ще думає, що вони на markdown написані, так що чекайте деякі "дивацтва" верстки.

Як уже згадувалося, плагінів для markdown в Вімі - безліч. Мені також довелося помацати диво на ім'я Markdown-preview. Він виконує ті ж функції, що і Livedown, але вміє скролл скомпільований текст в залежності від положення вашого курсору і закривається при перемиканні буферу (а не по виходу з редактора). Мені особисто він сподобався менше, але це вже смаківщина.

Бліц розділ

Як і було обіцяно, ми розглянули деякі важливі аспекти робочого середовища, які ми успішно (відносно) змогли зв'язати з нашим улюбленим редактором. Щодо інших аспектів я з повною упевненістю говорити не можу, так як у мене з ними мало досвіду, але на затравочкі давайте пробіжимося за деякими цікавим речам:

Дива не буде. Дебаггера - це дуже важливі програми для налагодження ваших проектів, так як дозволяють відслідковувати стан системи під час виконання вашого коду. Однак їх інтеграція в редактори завжди була дуже болючою, так як вони дуже платформозавісіми і неповороткі.

Це не є мінусом конкретно 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'],
 \}

Стрибки по тегам

У Віма є вбудована комбінація клавіш , який дозволяє вам перейти до імплементації виділеного терміну. Однак для його роботи потрібні ті самі теги. Згенерувати їх можна термінальної командою ctags:

# У корені проекту виженете це

ctags -R &

Якщо вам потрібно перейти до оголошення цього терміна, то вам допоможе (у вас повинен бути встановлений YCM):

"Наведіть курсор на потрібний термін і введіть команду:
:YcmCompleter GoToDeclaration

Однак, постійно відправляти Вім в задній фон і запускати ручками команду - не дуже зручно. Також не дуже зручно у великих проектах підлягає чекати виконання індексації. Але у мене і для цієї проблеми знайдеться відповідь ...

Асинхронні команди

Одним з недавніх трендів програмування є асинхронність. Вона дозволяє одночасно виконувати кілька різних завдань, але сама програма залишається однопоточному.

Вім - однопоточні програма (йому можна, у нього амбіції нижче). Тому, якщо на нього занадто багато плагінів, то він поповзе зі швидкістю равлика. Але починаючи з версії 8 (ну і в NeoVim це теж є) в нього додали API для асинхронних викликів. Тепер ваш Линтер, що працює в реальному часі, що не буде сповільнювати сам процес редагування тексту.

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

...
Plug 'skywind3000/asyncrun.vim'
...
nnoremap :AsyncRun ctags -R

Тепер після натискання клавіші 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 @

Висновок

Головне завдання цієї статті полягала не скільки в доказі того, що IDE відверто погані, а в тому, щоб показати вам, що Вім теж має порох у порохівницях. Якщо ви витратите час на настройку оточення під нього, то отримаєте більш швидку, ефективну і зрозумілу робоче середовище. І так, будь ласка, не намагайтеся в коментарях довести, що якийсь стиль редагування краще або гірше інших. Чи не доведете.

Сподіваюся, що ви добре провели час, читаючи цю статтю (написану в NeoVim)

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація