[поновлюється] п’ять років тому я шукав собі простий і зручний текстовий редактор, натрапив на micro й деякий час користувався майже виключно ним. згодом якось на роботі я зауважив, як невимушено хлопці з devops’ів відкривають vim без жодного позерства, просто щоби показати мені якісь файли конфігурації чи підправити рядочок у сценарії ansible… і мені стало соромно: невже я не подужаю вивчити принаймні базові комбінації клавіш, — навіть не для того, аби повністю перейти на vim, але принаймні щоби позбутися неприємного відчуття, що я спробував, але не подужав і здався?
за якийсь час завважив, що намагаюсь у micro, nano, kate чи geany зробити hjkl
, dt"
чи :retab
, — і зрозумів, що «пропав»; тож довелося вже вчитися далі, й нотувати найцікавіше, бо забувається. отож, цей допис — не вступ до використання vim для початківця, і не спроба написати (ще один) підручник, а збірка підказок та рецептів «для себе», що доповнюватиметься з часом.
зміст
налаштування
основні зручності
деякі прості налаштування, загальні для всіх текстів (додати до ~/.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
підказки з редагування
не хочеться тут влаштовувать дитсад і починати з 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)
:X | normal | зашифрувати поточний буфер, встановити пароль
<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 = ¿)
:cd %:p:h | normal | перейти до теки поточного файлу
додаткові матеріяли
матеріялів для вивчення та облаштування vim безліч; я колекціоную лише (суб’єктивно) найкраще з доступного вільно для читання онлайн або завантаження.
документація
підручники
- learn vimscript the hard way, steve losh
- vim tutorial and reference, steve oualline
- advanced vim topics, tips and tricks, mark mdconnell
підказки
- your problem with vim is that you don’t grok vi, джим денніс на stack overflow (переклад українською)
інше
- vim-plug (мінімалістичний мереджер втулків для vim
- vimawesome (величезна збірка втулків для vim)
- vimcolorschemes — величезна галерея палітр онлайн
- base16 gallery — чимала галерея палітр, адаптованих до філософії base16