vim: нотатник рецептів

| щоденник, комп'ютери, linux, підказка, vim, поновлюється

[поновлюється] п’ять років тому я шукав собі простий і зручний текстовий редактор, натрапив на micro й деякий час користувався майже виключно ним. згодом якось на роботі я зауважив, як невимушено хлопці з devops’ів відкривають vim без жодного позерства, просто щоби показати мені якісь файли конфігурації чи підправити рядочок у сценарії ansible… і мені стало соромно: невже я не подужаю вивчити принаймні базові комбінації клавіш, — навіть не для того, аби повністю перейти на vim, але принаймні щоби позбутися неприємного відчуття, що я спробував, але не подужав і здався?

за якийсь час завважив, що намагаюсь у micro, nano, kate чи geany зробити hjkl, dt" чи :retab, — і зрозумів, що «пропав»; тож довелося вже вчитися далі, й нотувати найцікавіше, бо забувається. отож, цей допис — не вступ до використання vim для початківця, і не спроба написати (ще один) підручник, а збірка підказок та рецептів «для себе», що доповнюватиметься з часом.

зображення: vim, палітра gruvbox, сайт проєкту vimawesome

зміст

налаштування

основні зручності

деякі прості налаштування, загальні для всіх текстів (додати до ~/.vimrc), з короткими коментарями:

" загальні налаштування
filetype plugin indent on                                   " автоматичне визначення типу файла
syntax on                                                   " …і включення розфарбовування синтаксису
set laststatus=2                                            " завжди відображати статусні рядки вікон 
set mousehide                                               " ховати курсор миші під час набору (для gui)
set expandtab smarttab shiftwidth=4 tabstop=4               " табуляція 4-ма пробілами, автовідступ
set listchars=eol:↲,tab:··>,lead:·,precedes:<,extends:>     " позначки кінця рядків, відступів, довгих рядків
set wrap linebreak                                          " переніс рядків без розриву слів

дуже опційно — різна форма курсора в режимах вставки, заміни й у нормальному (режим вводу команд):

" форма курсора
let &t_SI = "\e[5 q"
let &t_SR = "\e[3 q"
let &t_EI = "\e[1 q"

після цього треба перезавантажити налаштування у vim’і: :source ~/.vimrc.

менеджер втулків

за потреби vim цілком придатний для використання як є, але деякі втулки надто кльові, щоби ними не користуватися (про це далі). втулки можна завантажити і додати вручну, або — arch! — більшість справді хороших затягти pacman’ом, але… нмсд, найкраще скористатися мінімалістичним менеджером втулків vim-plug: завантажити й покласти до теки, де vim знайде скрипт:

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

…і додати блок з переліком втулків до ~/.vimrc, десь на початку (!) файлу:

" Vim-Plug (мінімалістичний менеджер втулків)
call plug#begin()
" тут має бути перелік втулків 
call plug#end()

тепер можна порпатися на vimawesome і додавати найцікавіше:

" Vim-Plug (мінімалістичний менеджер втулків)
call plug#begin()
Plug 'ervandew/supertab'            " автодоповнення слів за tab'ом
Plug 'wellle/context.vim'           " відображення контексту (функції, блока)
Plug 'scrooloose/nerdtree'          " панель з деревом тек/файлів
Plug 'jiangmiao/auto-pairs'         " автонабір парних обрамлень (), [] тощо
call plug#end()

коли .vimrc готовий і збережений, лишається дрібничка: :source ~/.vimrc і :PlugInstall.

найкращі втулки

цілком суб’єктивний перелік найкорисніших для мене втулків (приблизно в порядку спадання корисності):

  • supertab ― автодоповнення слів за tab’ом (vim вже вміє доповнювати: ctrl+p);
  • context — зручне відображення ієрархічного контексту (функції, вкладені блоки if/case, дерево json/yaml/xml тощо);
  • nerdtree — панель з деревом тек/файлів;
  • auto-pairs — автонабір парних обрамлень [], (), "" тощо;
  • surround — редагування парних обрамлень;
  • searchindex — простий індикатор кількості результатів пошуку;
  • gitgutter — індикатор змінених/доданих рядків (для git).

наразі непотрібне, але гарненьке (встановлю, якщо писатиму книжку колись):

  • limelight — гарненька підсвітка поточного блоку для зосередження;
  • goyo — режим зосередженя (distraction-free).

налаштування втулків

більшість втулків або не потребують налаштування, або чудово працюють просто «з коробки». деякі, втім, треба «підкрутити».найперше — зручніший nerdtree:

" налаштування nerdtree
nnoremap <C-n> :NERDTreeToggle<CR>          " вкл/викл панель файлів за ctrl+n
" запускати nerdtree, якщо vim відкрито з текою як аргументом (vim <dir>)
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists('s:std_in') |
    \ execute 'NERDTree' argv()[0] | wincmd p | enew | execute 'cd '.argv()[0] | endif
" закривати vim, якщо nerdtree є останнім вікном
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif

палітри

vim має декілька колірних схем «з коробки», але вони… не вражають, і придатні лише умовно; лежать в /usr/share/vim/vim??/colors/, перелік можна завантажити до (нового порожнього) буфера vim, і перепробувати по черзі (на прикладі desert):

:new
:r!for i in $(ls -1 /usr/share/vim/vim90/colors/*.vim); do i=$(basename $i); echo ${i\%.*}; done
:colorscheme desert
...

в тенетах є десятки, сотні кращих. варіантів встановлення декілька; можна завантажити вручну й закинути до теки ~/.vim/, наприклад:

> curl -fLO --output-dir ~/.vim/colors/ --create-dirs https://raw.githubusercontent.com/cocopon/iceberg.vim/master/colors/iceberg.vim
> vim +'colors iceberg' ~/test.txt

інша опція — встановити з репозиторіїв свого дистрибутива linux окремі теми, або збірку, наприклад (arch та похідні):

> pamac search vim-colors
> pamac install vim-colorschemes

палітри опиняться в /usr/share/vim/vimfiles/colors/, можна завантажити весь перелік (штатні й встановлені) і експериментувати:

:new
:r!for i in $(ls -1 /usr/share/vim/vim*/colors/*.vim); do i=$(basename $i); echo ${i\%.*}; done
:colorscheme deus 
...

і, нарешті, можна встановити збірку як втулок (див. вище) з vimawesome:

" Vim-Plug (мінімалістичний менеджер втулків)
call plug#begin()
" всі інші втулки тут…
Plug 'flazz/vim-colorschemes'           " чимала колекція палітр vim
call plug#end()

після цього :source ~/.vimrc та :PlugInstall, і можна вибирати щось підходяще: :colors deus. коли вибір зроблено, залишається просто додати рядок до ~/.vimrc (після блоку vim-plug!):

" палітра кольорів
colorscheme deus

зображення: vim, палітра iceberg, сайт проєкту iceberg

підказки з редагування

не хочеться тут влаштовувать дитсад і починати з hjkl, — для цього можна почитати якийсь підручник; тож тут — вибірково лише цікаві команди, які забуваються.

навігація текстом

 команда / клавіші  | режим     | дія
 ————————————————————————————————————————————————————————————————————————————————————————————————————
 ctrl+e             | normal    | гортання додолу порядково (не рухаючи курсор) 
 ctrl+y             | normal    | гортання вгору порядково (не рухаючи курсор)
 zz                 | normal    | поточний рядок по центру екрана

видалення

 команда / клавіші  | режим     | дія
 ————————————————————————————————————————————————————————————————————————————————————————————————————
 dd                 | normal    | видалити поточний рядок
 d{N}aw             | normal    | видалити N слів, починаючи зі слова під курсором
 d{N}as             | normal    | видалити N речень, починаючи реченням під курсором
 d{N}ap             | normal    | видалити N параграфів, починаючи параграфом під курсором
 d{N}a]             | normal    | видалити дужки [] зі вмістом навколо курсора
 d{N}i]             | normal    | видалити вміст дужок [] (лишити дужки)
 <C-h>              | insert    | видалити символ ліворуч курсора (backspace)
 <C-w>              | insert    | видалити слово ліворуч курсора
 <C-u>              | insert    | видалити до початку поточного рядка

модифікація

 команда / клавіші  | режим     | дія
 ————————————————————————————————————————————————————————————————————————————————————————————————————
 gu{N}aw            | normal    | малий регістр N слів, починаючи під курсором
 gU{N}aw            | normal    | великий регістр N слів, починаючи під курсором
 >>                 | normal    | збільшити відступ поточного рядка
 <<                 | normal    | зменшити відступ поточного рядка

пошук і заміна

 команда / клавіші  | режим     | дія
 ————————————————————————————————————————————————————————————————————————————————————————————————————
 f{C}               | normal    | пошук символа C в поточному рядку (; наст. / , поперед.)
 F{C}               | normal    | повернутися до символа C в поточному рядку (;/,)
 t{C}               | normal    | перехід до символа C в поточному рядку (;/,)
 T{C}               | normal    | повернутися до символа C в поточному рядку (;/,)
 *                  | normal    | перейти до наст. згадки слова під курсором (n/N)

історія змін

 команда / клавіші  | режим     | дія
 ————————————————————————————————————————————————————————————————————————————————————————————————————
 {N}u               | normal    | скасувати N крайніх змін в документі
 {N}Ctrl-r          | normal    | повернути N скасованих змін
 :earlier 1h        | normal    | скасувати зміни: 1 годину тому (також: s, m, h, d)
 :earlier 2         | normal    | скасувати останні 2 зміни
 :later 1h          | normal    | повернути скасовані зміни: 1 годину вперед (також: s, m, h, d)
 :later 2           | normal    | повернути 2 скасовані зміни

режими

 команда / клавіші  | режим     | дія
 ————————————————————————————————————————————————————————————————————————————————————————————————————
 <Esc>              | ...       | повернутися в нормальний режим (normal)
 <C-[>              | ...       | повернутися в нормальний режим (normal)
 <C-o>              | insert    | ввід однієї команди в режимі вставки (тимчасовий нормальний режим)

sex та інші цікавинки

 команда / клавіші  | режим     | дія
 ————————————————————————————————————————————————————————————————————————————————————————————————————
 :Sex               | normal    | перелік файлів і відкривання в сусідньому буфері (split)
 <C-r>=             | insert    | калькулятор зі вставкою результату в текст
 ga                 | normal    | коди ascii/unicode символа під курсором (десят., шіст., вісім.)
 <C-v>{code}        | insert    | встивити символ ascii за кодом (3 десят. цифри)
 <C-v>u{code}       | insert    | вставити символ unicode за кодом (4 шіст. цифри)
 <C-k>{C1}{C2}      | insert    | встивити символ за двосимвольним позначенням (>> = », ?I = ¿)

додаткові матеріяли

матеріялів для вивчення vim безліч; я колекціоную лише (суб’єктивно) найкраще з доступного вільно для читання онлайн або завантаження.

документація

підручники

підказки

інше