Vim

Содержание

Work in progress


TODO статьи:
	* добавить раздел про табы (tabe);
	* описание буферов и работы с ними (:ls/:b/);
	* ctags;
	* разделение экрана на несколько областей :vsplit, :split, ...
	* полезные плагины.

Vim — мощный текстовый редактор, потомок Unix-редактора vi. Так же как и vi, vim гибко конфигурируем и содержит множество возможностей по ускорению и автоматизации редактирования текстов. За счёт использования внутреннего скриптового языка vimscript редактор гибко конфигурируется и позволяет быстро разрабатыватывать расширения.

Для новичков vim может показаться громоздким и непонятным из-за своей необычной «системы управления». Дело в том, что Vim поддерживает множество режимов работы. Это значит, что действие комбинаций клавиш различается в зависимости от того режима, в котором находится редактор. Командный режим является режимом по умолчанию. Находясь в нём, мы можем перейти в другие режимы или выполнять команды (о них будет сказано ниже).

Для того чтобы начать вводить текст, необходимо перевести vim в режим вставки. Делается это вводом i. После этого внизу окна редактора начнёт отображаться строка -- INSERT --. В режиме вставки vim работает как нормальный текстовый редактор, любой введённый символ вставляется в редактируемый текст.

Для того, чтобы вернуться в командный режим, необходимо нажать клавишу Esc. Здесь и далее мы будем обозначать её как <ESC>.

В качестве примера создадим файл hello.txt, содержащий строчку 'Hello, world!'

В терминале вводим команду

 $ vim hello.txt

После этого в открытом редакторе набираем

 iHello, world!<ESC>:wq

Теперь по порядку о том, что мы сделали:

  1. i — команда перехода в режим вставки (После нажатия внизу появляется строка -- INSERT --);
  2. Hello,world! — в режиме вставки строка печатается на экран;
  3. <ESC> — возвращаем vim в командный режим;
  4. :wq — команда для сохранения файла и выхода из текстового редактора.

Посимвольное перемещение курсора

Для перемещения курсора по тексту в командном режиме используются клавиши hjkl:

h
переместить курсор влево,
j
переместить курсор вниз,
k
переместить курсор вверх,
l
переместить курсор вправо.

Вы можете использовать клавиши со стрелками (← ↑ → ↓) но использовать hjkl для перемещения гораздо удобнее, чем тянуть руку к мышке или клавишам со стрелками (при слепом десятипальцевом методе набора ваши пальцы уже лежат на клавишах jkl).

Числовые аргументы

Перед любой командой перемещения курсора можно указать число, обозначающее сколько раз команда будет выполнена. Например команда 4j перемещает курсор на 4 строки вниз.

Базовые команды

Команда удаления символа под курсором x.

Отмена сделанных изменений u (аналог <ctrl>+z).

Возвращение отменённых изменений <ctrl>+r

Помимо базовых команд, о которых было сказано выше, vim поддерживает множество других, позволяет комбинировать уже существующие или создавать свои. Более того, перед большинством команд можно набрать число, определяющее сколько раз команда будет выполнена, например для удаления четырёх символов вместо четырёх нажатий на x можно набрать команду 4x

Пара слов о командном режиме

Можно относиться к командам vim как к предложениям.

Есть глаголы (например f — find, d — delete, g — go), есть существительные (например w — word, буквы, числа).

Примеры составления предложений:

  • Delete till find 'b' (удалить всё до символа 'b') — dtfb
  • Mark from there to 22 line (выделить всё с текущего символа до 22 строки) — vg22g

Соответственно чем больше вы знаете «слов», тем более сложные и полезные «предложения» вы сможете составлять. Вторая часть статьи — краткий конспект различных возможностей и команд vim.

 

1. Режимы Vim

Помимо описанных выше режимов работы (вставка, командный режим) vim поддерживает множество других. Более того, переход между режимами может быть выполнен несколькими способами.

1.1 Командный режим

Режим по умолчанию. Из него осуществляется переход в другие режимы и выполнение команд.

Клавиша перехода — <ESC>.

Все команды из разделов 3 - 10 выполняются из этого режима.

1.2 Режим ввода

Клавиши перехода:

  • i — ввод с текущего символа;
  • a — ввод со следующего символа;
  • o — перейти в режим ввода с новой строки под курсором;
  • O — перейти в режим ввода с новой строки над курсором;
  • I — переместиться в начало строки и перейти в режим ввода;
  • A — переместиться в конец строки и перейти в режим ввода.

1.3 Режим выделения

Клавиши перехода:

  • v — посимвольное выделение;
  • V — построчное выделение.

1.4 Режим замены

Клавиша перехода — R.

2. Справка

Vim содержит довольно полную документацию, которой можно воспользоваться в любой момент. Для её просмотра необходимо использовать команду :help. Для получения справки по интересующей команде достаточно набрать :help commandname в командном режиме. По оглавлению можно перемещаться с помощью горячих клавиш из раздела "Путешествие по меткам". Кроме того вместе с vim устанавливается вместе с небольшим учебным пособием, для начала обучения введите в терминале

 $ vimtutor

3. Работа с файлами и сессиями

:mksession — создать файл сессии (в файл Session.vim сохраняется информация о настройках и всех открытых файлах и буферах);

source Session.vim — загрузить файл сессии (все настройки и открытые в прошлый раз окна восстанавливаются);

:eFILE — открывает FILE на редактирование;

:w[FILE] — записывает сделанные изменения в открытый файл или FILE, если он указан;

:q — выход из vim. При :q! выход без записи сделанных изменений.

РЕМАРКА: можно смешивать несколько команд в одну. Например — :wq

4. Перемещение

Перемещение курсора:

влево / вниз / вверх / вправо
 h    / j    / k     / l

РЕМАРКА: Удобство в том, что при такой раскладке пальцы всегда лежат на большинстве нужных клавиш, и не нужно перемещать руку от букв к клавишам стрелок.

^ — курсор в начало строки;

$ — курсор в конец строки;

w — курсор в начало следующего слова;

b — курсор в начало предыдущего слова;

{NUM}gg — переход на {NUM} строку;

G — переход в конец файла;

ctrl + y — экран на 1 строку вверх;

ctrl + e — экран на 1 строку вниз;

ctrl + u — экран на 1/2 страницы вверх;

ctrl + d — экран на 1/2 страницы вниз;

ctrl + b — экран на страницу вверх;

ctrl + u — экран на страницу вверх.

5. Отмена действий

u — отменяет предыдущее действие. Может применяться несколько раз. Аналог комбинации ctrl + z;

ctrl + r — отмена отмены предыдущего действия. Аналог комбинации ctrl + shift + z.

6. Поиск

/{regex} — поиск регулярного выражения {regex} в текущем файле от курсора к концу файла;

/{regex} — поиск регулярного выражения {regex} в текущем файле от курсора к началу файла;

n — найти следующее вхождение;

N — найти предыдущее вхождение;

f{letter} или F{letter} — перемещает курсор на следующую (или предыдущую если F) букву {letter} в текущей строке;

t{letter} или T{letter} — перемещает курсор за один символ до следующей (или предыдущей если T) буквы {letter} в текущей строке.

7. Редактирование

{NUM}dd — удаление {NUM} строк;

{NUM}cc — аналог dd, но после удаления переворит редактор в режим ввода;

{NUM}yy — копирование {NUM} строк в буфер обмена;

p — вставка из буфера обмена после позиции курсора;

P — вставка из буфера обмена до позиции курсора;

x — удаление символа под курсором.

8. Вызов внешних команд

:!cmd — вызывает shell команду cmd для обработки переданных данных. Если данных не передано, показывает вывод команды на экран.

Пример:

:!ls — листинг файлов в текущей директории;

:%wc -w — подсчёт слов в файле.

Делаем vim hex-редактором:

%!xxd — конвертирует файл в хекс представление;

%!xxd -r — конвертирует обратно.

9. Прочие полезные команды

:E — Открывает меню выбора файла;

:setlocal — показывает текущие локальные переменные.

10. Путешествие по меткам

В отношении языков программирования меткой является некий объект (функция, переменная, структура, ...). Vim позволяет организовать удобное перемещение к определениям меток.

ctrl + ] — перейти к первому определению метки, находящейся под курсором;

ctrl + g — то же что и ctrl + ], но показывает меню выбора, если определений несколько;

ctrl + t — вернуться обратно.

Для создания файла, содержащего в себе информацию о расположении меток необходимо воспользоваться утилитой ctags.

В корневой директори проекта, к которому вы хотите сгенерировать файл меток запустите команду

 $ ctags -R .

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

 :set tags=TAGFILE

11. Файл настроек vimrc

При запуске редактор считывает настройки, сохранённые в файле ~/.vimrc. Те же команды можно установить для текущей сессии vim в командном режиме после двоеточния (Пример: :set nu)

Для установки опций используется ключевое слово set, причём если мы хотим отключить опцию, то перед её именем мы пишем no

Пример:

set nu — включает нумерацию строк vim;

set nonu — выключает нумерацию;

set hls — highlight search, подсвечивает искомые слова;

set ic — ignore case, игнорирует регистр букв при поиске;

syntax on — включает подсветку синтаксиса.

12. Полезные дополнения vimrc

Работа с файлами в windows(cp1251) кодировке

1
2
3
4
set fileencodings=cp1251,utf-8
if has("x11") == 0
  set enc=cp1251
endif

Добавление привычных комбинаций <ctrl>+c, ctrl+v, ctrl+a

1
2
3
4
5
6
7
8
9
function! CopyAll()
  let n = line('.')
  normal gg"+yG
  exec n
endfunction

vmap <C-c> "+y
map <C-v> <esc>"+gP
map <C-a> <esc>:call CopyAll()<cr>

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

1
2
3
4
"russian keys support
set langmap=йq,цw,уe,кr,еt,нy,гu,шi,щo,зp,фa,ыs,вd,аf,пg,рh,оj,лk,дl,яz,чx,сc
set langmap+=мv,иb,тn,ьm,ЙQ,ЦW,УE,КR,ЕT,НY,ГU,ШI,ЩO,ЗP,ФA,ЫS,ВD,АF,ПG,РH,ОJ,ЛK
set langmap+=ДL,ЯZ,ЧX,СC,МV,ИB,ТN,ЬM,х[,Х{,ъ],ж\\;,Ж:,э',Э\\",б\\,,Б<,ю.,Ю>,Ё~

Nazi-режим, с помощью которого можно бороться за чистоту кода. Подсвечивает лишние пробелы в конце строк.

1
2
3
4
5
6
7
8
9
function HlSpaces()
	highlight ExtraWhitespace ctermbg=red guibg=red
	"autocmd ColorScheme * highlight ExtraWhitespace ctermbg=red guibg=red
	au BufWinEnter * match ExtraWhitespace /\s\+$/
	au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
	au InsertLeave * match ExtraWhitespace /\s\+$/
endfunction

au FileType c call HlSpaces()

13. Плагины

Для упрощения работы в VIM в интернете можно найти множество плагинов. Их установка довольно проста (обычно нужно просто поместить файлы в папку ~/.vim/).

Из них можно выделить

omnicppcomplete

Плагин для автодополнения имён структур, функций. Информацию о которых получается из файла меток, который можно сгенерировать с помощью утилиты ctags.

snipmate

Плагин, содержащий в себе снипеты (короткие часто используемые куски программ, например определение функции main) для многих языков программирования. Добавить свои снипеты или изменить существующие можно в файлах .vim/snippets/*

NERDtree

Плагин отображает дерево каталогов начиная с выбранного корня. Довольно удобно для просмотра больших проектов.

14. Используемые источники

  1. Vim — Викиучебник / . — 2015. — http://ru.wikibooks.....
  2. Oualline, S. Vi iMproved (VIM) / S. Oualline. — New Riders.
  3. Orenstein, B. Write code faster: expert-level vim (Railsberry 2012) / B. Orenstein. — http://www.youtube.c....