dimabagow

Vim шпаргалка

Режими:

Vi має два основні режими роботи: вставки та командний (нормальний). Редактор запускається в нормальному режимі, де можна переміщати курсор, видаляти й копіювати текст. Команди вставки та зміни вмикають режим вставки. Escape повертає до нормального режиму, де можна вийти, наприклад командою :q!. Більшість команд виконується відразу після введення; команди з двокрапкою виконуються після Enter.

Вихід:

:wq Зберегти зміни та вийти
:q Вийти, якщо немає незбережених змін
ZZ Зберегти файл, якщо його змінено, та вийти
:q! Вийти без збереження змін

Вставка тексту:

i Вставити перед курсором
I Вставити перед першим непробільним символом рядка
a Додати після курсора
A Додати в кінці рядка
o Створити новий рядок під поточним
O Створити новий рядок над поточним
r Замінити один символ
R Перейти до режиму заміни

Переміщення:

h Переміститися ліворуч
j Переміститися вниз
k Переміститися вгору
l Переміститися праворуч
w До наступного слова
W До наступного слова, відділеного пробільними символами
b Назад до початку слова
B Назад до початку слова, відділеного пробільними символами
e До кінця слова
E До кінця слова, відділеного пробільними символами
( На одне речення назад
) На одне речення вперед
{ На один абзац назад
} На один абзац уперед
0 До початку рядка
$ До кінця рядка
1G До першого рядка файлу
G До останнього рядка файлу
nG До рядка n файлу
:n До рядка n файлу
fc Уперед до символу c
Fc Назад до символу c
H До верхнього рядка екрана
M До середнього рядка екрана
L До нижнього рядка екрана
% До парної дужки: ( ), { }, [ ]

Видалення тексту:

Більшість команд видалення складається з d та команди переміщення. Наприклад, dw видаляє слово. Інші команди видалення:

x Видалити символ під курсором
X Видалити символ перед курсором
D Видалити до кінця рядка
dd Видалити поточний рядок
:d Видалити поточний рядок

Копіювання тексту до регістра:

Як і команди видалення, більшість команд копіювання складається з y та команди переміщення. Наприклад, y$ копіює до регістра текст до кінця рядка. Ще дві команди копіювання:

yy Скопіювати поточний рядок
:y Скопіювати поточний рядок

Зміна тексту:

Команди зміни видаляють текст і вмикають режим вставки. Вони складаються з c та команди переміщення. Наприклад, cw змінює слово. Інші команди зміни:

C Змінити до кінця рядка
cc Змінити весь рядок

Вставка тексту з регістра:

p Вставити після курсора або під рядком
P Вставити перед курсором або над рядком

Регістри:

Перед командою видалення, зміни, копіювання чи вставки можна вказати іменований регістр. Префікс має вигляд "c, де c є малою латинською літерою. Наприклад, "adw видаляє слово до регістра a. Команда "ap повертає його до тексту.

Мітки:

У файлі можна встановлювати іменовані мітки. Малі латинські літери позначають локальні мітки. Мітки також можуть задавати межі діапазону.

mc Установити мітку c.
`c Перейти до точної позиції мітки c.
'c Перейти до першого непробільного символу рядка з міткою c.

Пошук:

/рядок Шукати вперед рядок
?рядок Шукати назад рядок
n Повторити пошук у тому самому напрямку: рядок
N Повторити пошук у протилежному напрямку: рядок

Заміна:

Для пошуку та заміни використовується :s, зазвичай із діапазоном або командою :g (див. нижче).

:s/шаблон/рядок/прапорці Замінити шаблон на рядок відповідно до прапорців.
g Замінювати всі збіги в кожному рядку.
c Запитувати підтвердження кожної заміни.
& Повторити останню команду :s.

Регулярні вирази:

. (крапка) Будь-який один символ, крім кінця рядка.
* Нуль або більше повторень попереднього елемента.
[...] Один символ із набору.
[^...] Один символ поза набором.
^ Початок рядка.
$ Кінець рядка.
< Початок слова.
> Кінець слова.
(…) Група для об'єднання частин виразу.
n Вміст групи n.

[...] приклади наборів символів:

[A-Z] Великі літери від A до Z.
[a-z] Малі літери від a до z.
[0-9] Цифри від 0 до 9.
[./=+] Набір із . (крапки), / (скісної риски), = та +.
[-A-F] Великі літери від A до F і дефіс; дефіс слід ставити першим.
[0-9 A-Z] Усі великі літери, цифри та пробіл.
[A-Z][a-zA-Z] Перша позиція містить велику літеру від A до Z.
Друга позиція містить будь-яку латинську літеру.

Приклади регулярних виразів:

/Hello/ Рядок, що містить Hello.
/^TEST$/ Рядок, що містить лише TEST.
/^[a-zA-Z]/ Рядок, що починається з латинської літери.
/^[a-z].*/ Рядок, що починається з a-z, після якої може бути нуль або більше символів.
/2134$/ Рядок, що закінчується на 2134.
/\(21\|35\)/ Рядок, що містить 21 або 35.
Екрановані дужки групують варіанти; екранована вертикальна риска означає «або» у стандартному синтаксисі шаблонів Vim.
/[0-9]*/ Нуль або більше цифр.
/^[^#]/ Рядок, першим символом якого не є #.

Примітки:

1. За замовчуванням регулярні вирази чутливі до регістру. 2. Регулярні вирази використовуються там, де потрібен шаблон: pattern.

Лічильники:

Число перед командою задає кількість її повторень. Наприклад, 5dw видаляє п'ять слів, а 3fe переміщує до третього наступного входження e. Так можна повторювати навіть вставку, наприклад вставити той самий текст 100 разів.

Діапазони:

Перед багатьма командами з двокрапкою можна вказати діапазон рядків. Наприклад, :3,7d видаляє рядки від 3 до 7. Поєднуйте діапазони з :s для заміни в кількох рядках; :.,$s/шаблон/рядок/g виконує заміну від поточного рядка до кінця файлу.

:n,m Рядки n-m
:. Поточний рядок.
:$ Останній рядок.
:'c Мітка c
:% Усі рядки файлу.
:g/шаблон/ Усі рядки, що містять шаблон.

Файли

:w файл Записати до файлу.
:r файл Прочитати з файлу.
:n Перейти до наступного файлу.
:prev Перейти до попереднього файлу.
:e файл Редагувати файл
!!програма Замінити рядок виводом програми програма.

Інші команди

~ Змінити регістр літери.
J Об'єднати рядки.
. Повторити останню зміну тексту.
u Скасувати останню зміну.
U Скасувати всі зміни в рядку.

Вступ

У довіднику вище ми вперше познайомилися з режимами. Тепер розглянемо їх докладніше та з'ясуємо, що можна робити в кожному.

Типи режимів

У Vim є три основні режими редагування:

Нормальний режим і довідка

Спочатку ви перебуваєте в нормальному режимі. Введіть :echo "hello world" та натисніть Enter. З'являться знайомі слова «hello world»: ви виконали команду :echo та передали їй текст для виведення. Тепер введіть /hello і натисніть Enter. Vim знайде наступне входження цього тексту та перемістить до нього курсор.

Це лише два приклади команд нормального режиму; далі можна вивчити багато інших. Уміння користуватися :help майже так само важливе, як розуміння самих режимів. Не потрібно пам'ятати всі команди Vim, достатньо знати, де знайти потрібну.

:help usr_toc відкриває зміст посібника користувача. :help index відкриває покажчик команд, у якому можна шукати тему, наприклад через /insert mode. Якщо ви забули обидві назви, натисніть F1 або виконайте :help.

Введення та вставка тексту

Vim запускається в нормальному режимі, а i вмикає режим вставки. Спробуємо цю команду й інші способи введення:

  1. Виконайте :e dapping.txt.
  2. Натисніть i.
  3. Введіть цей текст разом із пропусками, які ми згодом виправимо: means being determined about being determined and being passionate about being passionate.
  4. Натисніть Escape, щоб повернутися до нормального режиму.
  5. Виконайте :w.

На початку речення бракує слова, а курсор стоїть у кінці. Як повернутися й додати пропущене? Можна скористатися мишею, кілька разів натиснути стрілку або натиснути Home, а потім i. Коротший спосіб: I, велика літера i.

  1. Натисніть I.
  2. Введіть Dappin.
  3. Натисніть Escape.

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

Команда i вставляє перед символом під курсором. Для вставки після нього використовуйте a, від англійського “after”:

  1. Натисніть a.
  2. Введіть g разом із пробілом, щоб завершити “Dapping” і відокремити його від “means”.
  3. Натисніть Escape.

Як I розширює дію i, так A розширює дію a: переходить до кінця рядка.

  1. Натисніть A.
  2. Введіть . для завершення речення.
  3. Натисніть Escape.
Команда Дія
i Вставити перед курсором
I Вставити перед першим непробільним символом рядка
a Додати після курсора
A Додати в кінці рядка

Команди у верхньому регістрі охоплюють більшу частину рядка. Ми навчилися швидко працювати в одному рядку; тепер створимо нові. Натисніть o, від “open”, щоб відкрити рядок під поточним і почати введення:

  1. Натисніть o.
  2. Введіть I'm a rapper.
  3. Натисніть Escape.

Нове речення краще почати з окремого абзацу. Натисніть O, велику літеру o, а потім Escape: над реченням з'явиться порожній рядок.

Команда Дія
o Створити рядок нижче
O Створити рядок вище

Тут велика й мала літери відкривають рядки в протилежних напрямках.

Зміна та заміна тексту

Є ще помилка: мало бути “dapper”, а не “rapper”. Як швидко змінити один символ? Можна поставити курсор на r, натиснути i, Delete, ввести d, а потім Escape. Команда s, від “substitute”, скорочує цю послідовність:

  1. Перемістіть курсор на r; із кінця цього слова команда b повертає до його початку.
  2. Натисніть s.
  3. Введіть d.
  4. Натисніть Escape.

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

Велика літера S замінює весь рядок:

  1. Натисніть S.
  2. Введіть Be a sinner.
  3. Натисніть Escape.
Команда Дія
s Видалити поточний символ і ввімкнути вставку
S Замінити поточний рядок

Чи можна замінити один символ ще простіше? Так, командою r, від “replace”. Перейдіть до першої літери sinner, натисніть r, потім d. Вийде dinner. Редактор залишиться в нормальному режимі, тому Escape не потрібен.

Велика літера R замінює послідовні символи:

  1. Перемістіть курсор на i у слові dinner.
  2. Натисніть R.
  3. Введіть app; слово перетвориться на dapper.
  4. Натисніть Escape.
Команда Дія
r Замінити один символ
R Замінювати послідовні символи

Результат має виглядати так:

Dapping means being determined about being determined and being passionate about being passionate.

Be a dapper.

Матеріалу чимало, але знайомство з режимами є найскладнішим першим кроком. Коли їхня поведінка стане звичною, решту можливостей Vim буде легше опанувати. Якщо перемикання досі незручне, повторіть приклади й повертайтеся до них за потреби. Докладніше про команди можна прочитати в :help inserting та :help replacing.

Візуальний режим

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

Ефективніше поставити курсор на початок, натиснути v для візуального режиму та перейти до кінця стрілками або командою переміщення. Наприклад, 5e веде до кінця п'ятого слова від курсора. Натисніть c, від “change”, щоб замінити виділення. Ця команда вмикає режим вставки; після введення нового тексту натисніть Escape.

Мала літера v виділяє символи. Для виділення цілих рядків використовуйте велику V.

Перемикання режимів

Normal -- i,I,a,A,o,O,s,S,R --> Insert
Normal <------ Escape ------- Insert
  |  ^
 v,V | Escape
  v  |
 Visual
(r replaces one character without leaving Normal mode.)

Схему намальовано у Vim за допомогою плагіна Dr. Chip's DrawIt. Опис режимів є в :help vim-modes-intro, а переходів між ними в :help mode-switching. Якщо ви ще сумніваєтеся, що режими забезпечують потужність і простоту Vim, прочитайте статті «Why Vi» та «The Vi Input Model», які докладніше пояснюють цей спосіб редагування.

Додаткова шпаргалка

~/.vimrc Файл налаштувань Vim
:e scp://user@host/path/to/the/file.txt Редагувати віддалений файл; netrw також підтримує ftp та ftps
:Ex або :e ./ Відкрити файловий менеджер
hjkl Переміщення в чотирьох напрямках
i Режим вставки
I Вставка перед першим непробільним символом рядка
a Додавання після курсора
A Додавання в кінці рядка
o Відкрити рядок нижче
O Відкрити рядок вище
R Замінювати наявний текст
u, :undo Скасування
Ctrl-R, :redo Повтор скасованої дії
dd Вирізати рядок
cc Видалити рядок і почати введення
yy Копіювати рядок
p Вставити з регістра
ndd Видалити n рядків
nyy Скопіювати n рядків
Escape Повернутися до нормального режиму
Delete Видалити символ під курсором
:n Перейти до рядка n
% Перейти до парної дужки
:e fname Редагувати файл
:w [fname] Зберегти зміни
:wa Зберегти всі змінені файли
:q Вийти з редактора
:q! Вийти без збереження
:colorscheme name Вибрати колірну схему; у Vim 7.2 схеми могли бути в /usr/local/share/vim/vim72/colors/*.vim
:pwd Показати поточний каталог
:cd path Змінити каталог
:!cmd Виконати зовнішню команду
Ctrl-P, Ctrl-N Доповнення тексту в режимі вставки
Ctrl-R, =, expr, Enter Вставити результат виразу в режимі вставки, наприклад 5*2-3

Підсвічування синтаксису

:syntax on Увімкнути підсвічування
:syntax off Вимкнути підсвічування

Перенесення рядків

:set wrap Увімкнути перенесення під час показу
:set nowrap Вимкнути перенесення під час показу

Друк

:hardcopy Надрукувати документ
:set printoptions=duplex:off Вимкнути двобічний друк

Згортання

zc Закрити згортку
zo Відкрити згортку
zM Закрити всі згортки
zR Відкрити всі згортки
za Перемкнути стан згортки
zf Створити ручну згортку
:set foldenable Увімкнути згортання
:set foldmethod=syntax Згортання за синтаксисом
:set foldmethod=indent Згортання за відступами
:set foldmethod=manual Виділити ділянку через v і виконати zf
:set foldmethod=marker Згортання за мітками в тексті
:set foldmarker=begin,end Задати початкову й кінцеву мітки

Мітки

ma Установити локальну мітку a
mB Установити глобальну мітку B
`c Перейти до точної позиції мітки c
`0 Повернутися до позиції під час останнього виходу з Vim
:marks Показати мітки

Регістри

"ayy Копіювати рядок до регістра a
"bdd Вирізати рядок до регістра b
"C3dd Вирізати три рядки й дописати до регістра c
:reg [names] Показати вміст регістрів

Виділення

v, hjkl Виділити текст
V Виділити рядки
Ctrl-V Виділити прямокутний блок
p Вставити
y Копіювати
d Видалити
gu Перевести текст у нижній регістр
gU Перевести текст у верхній регістр

Відступи

[count]> Зсунути виділення праворуч
[count]< Зсунути виділення ліворуч
[count]>> Зсунути рядки праворуч
[count]<< Зсунути рядки ліворуч
:set tabstop=n Ширина табуляції в пробілах
:set shiftwidth=n Ширина кроку відступу
:set expandtab / :set noexpandtab Чи замінювати табуляцію пробілами

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

/pattern Знайти вираз
n Наступний збіг
N Попередній збіг
:%s/foo/bar/gi Замінити всі foo на bar без урахування регістру; докладніше: http://eax.me/regular-expr/

Нумерація рядків

:set number Показати номери рядків
:set nonumber Приховати номери рядків

Вкладки

:tabnew [fname] Відкрити нову вкладку
:tabs Показати вкладки
:tabn Наступна вкладка
:tabp Попередня вкладка
ngt Перейти до вкладки n
gt Наступна вкладка
gT Попередня вкладка

Вікна

:split Розділити горизонтально
:vsplit Розділити вертикально
Ctrl-W, c Закрити вікно
Ctrl-W, = Зрівняти розміри вікон
Ctrl-W, h/j/k/l Перейти між вікнами; також працюють стрілки

Перевірка правопису

:setlocal spell spelllang=ru,en Увімкнути перевірку російської та англійської
mkdir -p ~/.vim/spell
cd ~/.vim/spell
wget https://ftp.vim.org/vim/runtime/spell/ru.koi8-r.sug
wget https://ftp.vim.org/vim/runtime/spell/ru.koi8-r.spl
wget https://ftp.vim.org/vim/runtime/spell/en.ascii.sug
wget https://ftp.vim.org/vim/runtime/spell/en.ascii.spl
:set spell! Перемкнути перевірку
]s Наступне слово з помилкою
[s Попереднє слово з помилкою
zg Додати слово до словника
zw Позначити слово як помилкове
zG Прийняти слово на час сеансу

Кодування

:e ++enc=encoding Відкрити файл у вказаному кодуванні
:w ++enc=encoding Зберегти в новому кодуванні
:set fileencodings=utf-8,koi8-r Кодування для визначення за спаданням пріоритету

Інше

:set wildmenu / :set nowildmenu Показувати варіанти доповнення командного рядка
:set list Показувати табуляцію та кінці рядків
q: Відкрити історію команд
. Повторити останню зміну

На цьому поки все. Планую час від часу оновлювати цю шпаргалку, тож стежте за PS наприкінці наступних дописів.

Vim