Vim

Материал из Викиучебника — открытых книг для открытого мира
Vim

Vim (сокр. от Vi Improved, произносится «вим») — кошмар для случайного пользователя. Если его и удаётся закрыть, вздыхаешь с облегчением и твёрдой уверенностью, что ни разу в жизни больше не запустишь эту программу.

Пожалуй, нельзя просто запустить Vim и начать работать, требуется определённая подготовка. Зато стоит раз испытать его в деле, и поражаешься, как можно было без него обходиться.

Для быстрого ознакомления с функциональностью Vim запустите команду vimtutor.

Начнём с примера[править]

Типичная сессия работы с Vim выглядит так:

# vim httpd.conf

В открывшемся редакторе:

/SSLVerif
nwr1ZZ

Задачей было изменить значение параметра конфигурации Apache. В обычном редакторе подобный результат достигается командой вроде:

# editor_name httpd.conf

или сочетанием Ctrl + O и выбором файла из диалога открытия файла.

Ctrl + F SSLVerif ↵ Enter ↵ Enter Esc
Ctrl + 
Del 1
Ctrl + S
Alt + F4

Команды обычного редактора:

  • открыть файл «httpd.conf» одним из указанных способов;
  • Ctrl + F — открыть диалог поиска;
  • ввести «SSLVerif»;
  • ↵ Enter — фокус в диалоге поиска обычно стоит на поиске следующего вхождения искомого слова;
  • Esc — закрыть окно поиска;
  • Ctrl +  — снять фокус с найденного слова и перейти к следующему (в некоторых редакторах курсор проскакивает слово и переходит через слово — тогда нажимаем не отпуская Ctrl; в других одиночное нажатие приводит лишь к снятию фокуса и нужно повторно нажать );
  • Del ― удалить «0», остаётся напечатать «1»;
  • Ctrl + S — сохранить изменения;
  • Alt + F4 — закрыть файл и выйти.

Команды VIM:

  • / — перейти в режим поиска;
  • ↵ Enter — искать;
  • n — перейти к следующему вхождению искомой строки;
  • w — переместить курсор к следующему слову;
  • r — заменить знак под курсором;
  • ZZ — сохранить изменения и выйти;
  • ZQ — выйти без сохранения изменений.

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

Введение[править]

Здесь я делюсь опытом работы в Vim’е. Предполагается, читатель имеет установленные Vi и Vim, а также знаком с основами работы с UNIX-подобной системой.

Помнится, когда товарищ установил FreeBSD на мою домашнюю ЭВМ, некоторые файлы открывались непонятным мне образом. Избавляясь от этого несчастья, я понял, что происходит: в системе по умолчанию, в переменной окружения EDITOR, установлен редактор Vi, и тут же сменил его на 'ee' (easy editor). Это действительно простой редактор, затруднений с ним возникнуть не может, однако и свободы в нем не испытать. Но вскоре его стало не хватать.

Описание работы с редактором привожу в хронологическом порядке — от простого к сложному. Так как Vim на 99 % совместим с Vi, сначала дам краткое описание работы с Vi.

Легенда сокращений и специальных символов:

Строки, начинающиеся с символа «#», - командная строка
<ESC> - нажатие клавишу Escape (или Ctrl-[)
<CR> - ... Enter
<SHIFT> - ... Shift
^x - ... Ctrl-x

Vi[править]

Отличие Vi в том, что он имеет несколько режимов работы. При этом привычный нам режим ввода текста — не основной. Основным режимом в Vi считается режим, в котором клавиатура используется для управления редактором. В этом режиме можно быстро перемещаться по тексту, переключаться в другие режимы и выполнять другие операции.

Насколько Vi быстрее других редакторов? Давайте сравним. Вот, что нужно сделать «продвинутому» пользователю, чтобы поменять местами две буквы в обычном редакторе и в Vi:

Обычный редактор:

<Shift-Стрелка вправо>
<Ctrl-x>
<Стрелка влево>
<Ctrl-v>

Vi:

xp

Переключение режимов[править]

  • «Обычный режим» — перемещение по файлу, стирание текста и другие редактирующие функции. Это — основной режим, только из него можно сразу перейти в другие режимы. Для возврата в основной режим из любого другого режима:
<ESC>, иногда 2 раза
<Ctrl-[>
  • «Режим ввода» — ввод текста. Как только завершается ввод текста, принято возвращаться в обычный режим. Заметьте, что стирание и ввод текста происходит в двух разных режимах. Перейти в него из обычного режима можно разными способами, к примеру:
i — начать ввод перед курсором
o — начать ввод с новой строки
S — очистить текущую строку и начать ввод
  • «Командный режим» — команды (операции с файлом, поиск и замена, настройка редактора и т. д.). Переход в него из обычного режима:
:
  • «Режим поиска» — ввод поискового запроса. Из обычного режима:
/ — поиск от курсора до конца документа
? — поиск от курсора до начала документа
  • «Визуальный режим» — режим выделения текста. Из обычного режима:
v

Открыть/создать файл[править]

Опишем операции, которые можно производить с файлом.

# vi mamapapa.txt           - открыть один файл
# vi mamapapa.txt +11       - открыть файл и перейти к строке 11
# vi mamapapa.txt ++11      - если файл был отрыт на строке 1, открыть его на строке 12
# vi mama.txt papa.txt      - открыть файл mama.txt, после выхода из него открыть файл papa.txt
# vi -о mama.txt papa.txt   - открыть сразу все файлы

Файл открывается в обычном режиме с помощью команды vi. Строка статуса будет отображать название файла. Мы можем просмотреть файл, переместиться по содержимому, стереть текст, но ввести текст в этом режиме нельзя.

Создание файла происходит при помощи той же команды. Собственно создание файла происходит в момент сохранения.

Для открытия или создания нового файла в обычном режиме набираем

:e filename

или

:new filename

Перед этим нужно сохранить предыдущий файл:

:w            - сохранить файл с существующим именем
:w filename   - сохранить файл с новым именем

Перемещение по файлу[править]

Самые часто используемые в Vi клавиши — клавиши перемещения. Это знаменитые h, j, k, l, соответствующие стрелкам влево, вниз, вверх и вправо. Стрелочки тоже работают (при правильном указании терминала). Также можно использовать быстрые клавиши:

  • <Ctrl-f> — на страницу (экран) вниз;
  • <Ctrl-b> — на страницу (экран) вверх;
  • <Ctrl-d> — на полстраницы (экрана) вниз;
  • <Ctrl-u> — на полстраницы (экрана) вверх;
  • <Ctrl-y> — на строку вверх, без изменения положения курсора;
  • <Ctrl-e> — на строку вниз, без изменения положения курсора;
  • 0 («ноль») — в начало текущей строки;
  • ^ — в начало текущей строки (к первому непробельному символу);
  • $ — в конец текущей строки;
  • w — на слово вправо;
  • b — на слово влево;
  • W — до пробела вправо;
  • B — до пробела влево;
  • } — абзац вниз;
  • { — абзац вверх;
  • gg — в начало файла;
  • G — в конец файла;
  • <number>G — перейти на конкретную строку <number>;
  • /<text><CR> — перейти к <text>;
  • ?<text><CR> — то же, но искать назад;
  • n — повторить поиск;
  • N — повторить поиск назад;
  • [[ — в начало функции;
  • '' — к месту выполнения команды [[.

Перемещение по экрану[править]

Изменение положения экрана без изменения положения курсора. Сдвинуть страницу так, чтобы строка с курсором оказалась:

  • z- — внизу;
  • z[Enter] — вверху;
  • z. или zz — посредине.

Перемещение в пределах экрана:

  • H — на верхнюю строку (5H на пять строк ниже верхней строки);
  • M — на среднюю строку;
  • L — на последнюю строку (5L на пять строк выше нижней строки).

Редактирование файла[править]

В файле записан следующий текст:

— Винни, тебе что намазать на хлеб, мёду или сгущённого молока?

— И того, и другого, и можно без хлеба!
— Ну, если вы больше ничего не хотите…

— А что, что-то есть ещё?

Диалог симпатичный, но несколько несвязный. Давайте изменим его: для этого переходим в режим ввода. Самый простой способ — нажатие «i» из обычного режима, после чего можно смело приступать к вводу текста. <ESC> вернёт нас к обычному режиму.

Вводное замечание. Поскольку заглавные и строчные буквы команд соответствуют разным командам, следует быть внимательным к регистру ввода, учитывать, например, нажата ли клавиша <CAPS LOCK>. Используйте команду U, чтобы отменить ошибочные действия.

Другие важные команды:

Ввод текста[править]

Эти команды переводят редактор в режим ввода. Они экономят время на движение курсора или на перевод его на новую строку. В командах ввода возможны числовые аргументы (за исключением O и o). Например, команда 20iПривет<ESC> вставляет 20 слов «Привет». Перейти в режим ввода:

  • i — с текущей позиции;
  • a — после курсора;
  • I — в начало строки;
  • А — в конце строки;
  • o — с новой строки под курсором;
  • O — с новой строки над курсором;
  • s — заменить указанное количество символов, т. е. удалить это число символов и перейти в режим ввода. В отличие от команды с, которая может удалить кусок текста размером не меньше слова (cw), командой s можно удалить любое число символов. Например, 4s удалит четыре символа, начиная с того, который находится под курсором. Эта команда применяется для замены одного или нескольких символов другими символами;
  • S — удалить всю текущую строку и перейти в режим ввода. Число перед командой показывает, сколько нужно удалить строк, начиная с текущей. Например, 4S удалит четыре строки, включая текущую;
  • R — перейти в режим ввода с заменой текста. Аналог insert. Символы под курсором заменяются на вводимые. Команда применяется, когда неизвестно, сколько придётся изменить символов на другие (иначе можно было бы использовать команду s с указанием числа заменяемых символов, например, 7s). При удалении вводимых символов возвращаются те, которые были до ввода команды. Такой режим сохраняется до конца строки. При вводе новой строки, по нажатию Enter, происходит не переход на другую строку с тем же режимом замены текста, а создание новой строки;
  • r — заменить один символ. Заменяет символ, находящийся под курсором на символ который, следует за командой. При этом не происходит выхода из командного режима, т. е. не надо нажимать ESC после изменения текста. Например, команда ry изменит символ под курсором на «y». Числовой показатель указывает, сколько символов необходимо заменить на данный. Например, 3ry вставляет три символа «y».

Удаление[править]

  • x — удалить символ под курсором (<число>x — удалить указанное число символов начиная с того, который находится под курсором);
  • X — удалить символ влево (удалить символ перед курсором);
  • d — используется совместно с командами перемещения. Удаляет символы с текущего положения курсора до положения после ввода команды перемещения.
Удалить символы:
  • dw — с текущего до конца слова, включая пробел после слова;
  • de — до конца слова, но оставить пробел;
  • dE — с текущего до конца слова, включая символы пунктуации, но оставить пробел после слова;
  • d<число>d или <число>dd — число строк начиная с текущей;
  • db — с текущего до начала слова (в обратном направлении);
  • d0 — с начала строки до текущего положения курсора;
  • d$ или D — с текущего положения курсора до конца строки.
Удалить:
  • diw — слово под курсором;
  • dd — текущую строку;
  • d<число>d или <число>dd — число строк начиная с текущей.
  • с — команда, аналогичная d, но после удаления переходит в режим ввода (замена текста). Удобная альтернатива команде R. Удалить:
  • сс — текущую строку и перейти в режим ввода;
  • C — текст с текущего положения курсора до конца строки, аналогична команде с$ (где $ — символ конца строки).
  • yy (также Y) — копирование текущей строки в неименованный буфер;
  • y<число>y — копирование числа строк начиная с текущей в неименованный буфер;
  • p — вставка содержимого неименнованного буфера под курсором. В Vim девять ячеек буфера удаления, так что можно вставить не только последнее удаление, но сделанные ранее. Например, 4p вставит под курсор содержимое четвертого удаления начиная с последнего. Также чтобы поменять местами два символа, можно использовать комбинацию команд «удалить» — x (удаление в буфер) и «вставить» — p (вставить из буфера). Таким образом, поставив курсор на первую букву из двух, которые необходимо поменять местами, и нажав комбинацию клавиш xp, мы совершим необходимые действия;
  • P — вставка содержимого неименованного буфера перед курсором;
  • J — слияние текущей строки со следующей. Числовой аргумент перед командой показывает, сколько следующих линий необходимо объединить с текущей. Например, 2J объединит две следующие строки с текущей, на которой расположен курсор.

Отмена изменений[править]

  • u — отменить последнюю команду;
  • U — отменить все последние изменения в строке; если строка удалена, то применить эту команду к ней будет невозможно.

Команды u и U могут отменять друг друга.

  • <Ctrl-r> или :redo — перейти вперёд по изменениям;
  • . — повторить последнюю команду, включая ввод текста;
  • ~ (тильда) — изменить символы под курсором на противоположный регистр (заглавные на строчные и строчные на заглавные), может применяться числовой показатель. Например, команда 5~ поменяет пять символов, начиная с текущего под курсором, на противоположный регистр.

Конечно, запомнить все команды сразу трудно, даже не нужно, к тому же здесь перечислены не все. Уверяю, через некоторое время эти команды будут пользоваться спросом. Некоторые особенности использования редактора в режиме редактирования:

  • Любой удаляемый текст сохраняется временно в буфере. Из этого буфера его можно вставить в текст (см. команду p). Буфер изменяется также после применения команды y — копировать.
  • Любая команда редактирования хранится в буфере, пока не будет вызвана другая команда.

Наконец мы дошли к самому главному — командному режиму. Помним, как в него перейти? «:». Шифт-ж, если по-русски.

Запись/выход[править]

В режиме ввода предварительно нажмите <ESC>, чтобы перейти в обычный режим.

ZQ - выйти без сохранения

или

:q! - выйти без сохранения
ZZ - записать файл и выйти (если файл не изменяли, то записываться он не будет)

или

:wq - записать файл и выйти

или

:x - записать файл и выйти
:w<CR> - записать файл
:sav filename<CR> - "сохранить как"

или

:w filename<CR> - "сохранить как"
:w!<CR> - записать файл

Эта команда может помочь, если файл открыт в режиме «read-only», т. е. с опцией -R, если файл заблокирован другим пользователем, либо отсутствуют такие привилегии, либо ещё какая беда. При попытке записи без «!» будет выдано соответствующее предупреждение.

:w new_file<CR>

Создать новый файл «new_file» и записать в него текущее содержимое. Если файл существует, будет показано предупреждение. Дальше вы продолжаете работать со старым файлом — mamapapa.txt.

Если при попытке сохранения появляется сообщение, что места на диске не осталось, можно выйти в командную оболочку и освободить место на диске, стерев ненужные файлы. Для этого применяется команда:

:sh<CR> - переход в командную оболочку

Чтобы из командной оболочки вернуться в редактор, нажмите CTRL-D или введите exit.

:q<CR> - выйти из редактора.

Ничего не получится, если файл был изменен. В таких случаях после команды добавляют «!»:

:q!<CR> - выйти из файла, не сохраняя изменения
:qa!<CR> - выйти из всех файлов, не сохраняя изменения

Чтобы отменить сделанные в текущей сессии изменения и вернуться к первоначальному варианту файла, применяют команду:

:e!<CR> - отменить изменения в текущей сессии

Коэффициент повторения[править]

Почти все команды vi принимают так называемый коэффициент повторения. Попросту говоря, если перед командой в обычном режиме вы указываете число, то команда повторяется соответствующее количество раз. Например, команда «j» перемещает курсор на одну строку вниз — «3j» переместит курсор на 3 строки вниз. Результатом команды «iпривет<ESC>», как вы, наверное, догадались, будет вставка слова «привет» — «2iпривет<ESC>» вставит «приветпривет».

Дополнительные возможности[править]

Есть несколько вещей, без которых редактирование похоже на пытку:

^G - показать информацию о файле
:<number> - перейти на строку с номером <number>
<number>G - перейти на строку с номером <number>
:set number - отобразить слева нумерацию строк (:set nonumber - спрятать нумерацию)
:set relativenumber - отобразить слева нумерацию строк относительно текущего положения курсора (:set norelativenumber - спрятать) 
:set wrap - переносить длинные строки (:set nowrap - не переносить)
:sy[ntax] on/off - включить/выключить подсветку синтаксиса
:colorscheme <name> - задать цветовую тему (где <name> - имя темы, TAB работает как авто-дополнение)
:h или :help - список возможной помощи (:viusage, :exusage)
Привести концы строк в файле к виду DOS или UNIX соответственно:
:set fileformat=dos
:set fileformat=unix
Задать размер табуляции в 4 пробела:
:set tabstop=4
:set expandtab
Размер табуляции новой строки:
:set shiftwidth=4

Конвертация кодировки файла:

:set fenc=cp1251<CR>
:set fenc=koi8-r<CR>
:set fenc=ibm866<CR>
:set fenc=utf-8<CR>

Смена кодировки (возможна до внесения изменений в редактируемый файл, т. е. сразу после открытия):

:e ++enc=cp1251<CR>
:e ++enc=koi8-r<CR>
:e ++enc=ibm866<CR>
:e ++enc=utf-8<CR>

Vim[править]

Главные отличия от Vi[править]

  • Неограниченное число undo и redo (в 7-й версии появились деревья).
  • Многооконность.
  • Поддержка множества буферов (в 7-й версии появились закладки).
  • Подсветка синтаксиса.
  • Редактирование командной строкой.
  • Достраивание имён файлов.
  • Визуальное редактирование.
  • Кроссплатформенность.
  • Графический интерфейс (GUI).
  • Проверка орфографии.

Команды[править]

Переход к началу файла в Vim отличается от Vi:

gg

Переход к строке под номером <number>:

<number>gg

Слово под курсором[править]

Перейти к следующему вхождению слова под курсором:

*

Перейти к предыдущему вхождению слова под курсором:

#

Перейти к определению слова под курсором:

gd (go definition)

Перейти к редактированию файла (под курсором должен быть путь):

gf (go file)

Визуальный режим[править]

Это существенное расширение возможностей Vi, без которого не обходится ни один «нормальный» текстовой редактор. Режим предназначен для выделения блока текста и дальнейшей работы с ним и состоит из трех последовательных шагов:

  1. Пометка начала блока с помощью «v», «V» или CTRL-V. Блок помечается с того символа, на котором находится курсор (по умолчанию).
  2. Перемещение курсора в конец необходимого блока. Последний символ также будет включён в выделенный блок.
  3. Вызов необходимой команды.

Команда «v» предназначена для выделения текста посимвольно. Символы до и после курсора в строке не будут входить в выделение. Необходима в первую очередь для копирования участков текста в строке.

  • «V» — для выделения текста построчно.
  • CTRL-V — для выделения прямоугольного участка текста. Удобна в случае редактирования структурированного текста.

С выделенным участком текста можно производить стандартные действия по редактированию (копирование — «y», удаление — «d»). Напомню, что в Vim при удалении участка текста он автоматически помещается в специальный регистр, что равноценно «вырезанию» участка текста, который потом можно будет вставить с помощью команды «p» (вставка текста после курсора) или «P» (вставка текста перед курсором).

~/.vimrc[править]

vimrc — это файл конфигурации Vim. При запуске Vim сначала читает этот файл и применяет записанные в нем настройки. Рекомендуемое расположение этого файла для различных платформ:

Unix-like         $HOME/.vimrc
MS-DOS and Win32  $HOME/_vimrc или $VIM/_vimrc

Файл конфигурации используется для настройки различных аспектов поведения и внешнего вида Vim.

Комментарии в этом файле начинаются с символа «"» (двойная кавычка) и продолжаются до конца строки.

Для примера приводится выдержка из файла _vimrc автора:[править]

" установить keymap, чтобы по Ctrl+^ переключался на русский и обратно
set keymap=russian-jcukenwin 
" по умолчанию - латинская раскладка
set iminsert=0
" по умолчанию - латинская раскладка при поиске
set imsearch=0
" игнорировать регистр при поиске
set ic
" подсвечивать поиск
set hls
" использовать инкрементальный поиск
set is
" ширина текста 
set textwidth=70
" минимальная высота окна пусть будет 0 (по умолчанию - 1)
set winminheight=0
" всегда делать активное окно максимального размера
set noequalalways
set winheight=9999
" установить шрифт Courier New Cyr
set guifont=courier_new:h10:cRUSSIAN
" настраиваю для работы с русскими словами (чтобы w, b, * понимали
" русские слова)
set iskeyword=@,48-57,_,192-255
" задать размер табуляции в четыре пробела
set ts=4
" отображение выполняемой команды
set showcmd 
" перенос по словам, а не по буквам
set linebreak
set dy=lastline

Можно добавить привычное поведение и привычные сочетания клавиш.[править]

  • Например, можно будет прокручивать (скроллить) текст колёсиком мыши и вставлять выделенное в X`ах мышкой в Vim нажатием средней кнопки мыши (колёсика):
 set mouse=a
 map <S-Insert> <MiddleMouse>
 map! <S-Insert> <MiddleMouse>
  • По <F2> сохранение сделанных изменений:
imap <F2> <Esc>:w<CR>
map <F2> <Esc>:w<CR>
  • По <F3> вставка содержимого заданного файла в редактируемый текст. Требуется ввести имя файла. Работает автодополнение имени файла по <Tab> в текущем каталоге:
imap <F3> <Esc>:read 
map <F3> <Esc>:read 

Также возможен интересный приём работы:

:read !ls -la

Эта команда вставит в текущую позицию редактируемого текста весь вывод указанной после «!» команды (в нашем случае: ls -la).

  • По <F4> открывается новая вкладка (tab) и выводится список каталогов и файлов текущего каталога. Клавишами управления курсором можно выбрать каталог или файл. Нажатие <Enter> на каталог отобразит его содержимое в том же режиме (можно путешествовать по каталогам), а нажатие <Enter> на файле ― откроет его в этой же вкладке. Работает быстрый поиск-перемещение по «/».
imap <F4> <Esc>:browse tabnew<CR> 
map <F4> <Esc>:browse tabnew<CR>
  • По <F5> позволяет переключать вкладки справа налево, по порядку, отображая открытые в них файлы.
imap <F5> <Esc> :tabprev <CR>i
map <F5> :tabprev <CR>
  • По <F6> позволяет переключать вкладки слева направо, по порядку, отображая открытые в них файлы.
imap <F6> <Esc> :tabnext <CR>i
map <F6> :tabnext <CR>
  • Пользовательское меню. По <F9> позволяет приостановить работу Vim и вызвать соответствующие программы:
set wildmenu
set wcm=<Tab>
menu Exec.GForth    :!gforth % <CR>
menu Exec.Perl      :!perl % <CR>
menu Exec.Python    :!python % <CR>
menu Exec.Ruby      :!ruby % <CR>
menu Exec.bash      :!/bin/bash<CR>
menu Exec.xterm     :!xterm<CR>
menu Exec.mc        :!mc<CR>
menu Exec.xterm_mc  :!xterm -e mc<CR>
map <F9> :emenu Exec.<Tab>
Обратите внимание на, например, конструкцию :!python % <CR> — символ % будет заменён на имя текущего редактируемого файла. В итоге, Vim приостановит работу и вызовет python filename.ext (если вы редактировали filename.ext) в текущем терминале (в том же, где запущен Vim), а затем, после завершения работы python filename.ext, вернётся к редактированию файла. Не забудьте сохранить изменения перед вызовом. Впрочем, Vim должен будет вам напомнить о том, что изменения нужно сохранить, если вы этого не сделали.
Заметьте, что Exec. — это не специальная команда, а всего лишь идентификатор меню, объединяющая группу команд и их идентификаторы/названия пунктов меню.
  • Пользовательское меню. По <F10> позволяет вызвать меню различных вариантов завершения работы с Vim. Глоток воздуха для новичка:
set wildmenu
set wcm=<Tab>
menu Exit.quit     :quit<CR>
menu Exit.quit!    :quit!<CR>
menu Exit.save     :exit<CR>
map <F10> :emenu Exit.<Tab>
  • Позволяет по <Tab>, более привычному некоторым пользователям, вызывать автодополнение для текущего активного синтаксиса:
 function! InsertTabWrapper(direction)
    let col = col('.') - 1
    if !col || getline('.')[col - 1] !~ '\k'
        return "\<tab>"
    elseif "backward" == a:direction
        return "\<c-p>"
    else
        return "\<c-n>"
    endif
 endfunction
 inoremap <tab> <c-r>=InsertTabWrapper ("forward")<cr>
 inoremap <s-tab> <c-r>=InsertTabWrapper ("backward")<cr>
 

Дополнительно[править]

Для получения более подробной информации по файлу _vimrc можно набрать в командной строке Vim команду:

:help vimrc

Vim и русская раскладка клавиатуры[править]

В обычном режиме Vim по умолчанию ожидает, что консоль находится в режиме ввода латинских символов. Если вы, к примеру, редактируете с помощью Vim текст на русском языке или в смешанных кодировках, к примеру HTML-страницу на русском, то постоянная необходимость переключать системную клавиатурную раскладку очень быстро вам надоест. Существует несколько способов решить эту проблему.

Способ 1[править]

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

Для этого в файл конфигурации Vim, .vimrc или _vimrc в Microsoft Windows, нужно добавить следующие строки:

set keymap=russian-jcukenwin 
set iminsert=0

После этого системную раскладку клавиатуры можно оставить в режиме ввода латинских символов, а переключение между языками осуществлять уже внутри самого редактора с помощью команды Ctrl+^ или Ctrl+6 в версии для Windows.

Чтобы настроить переключение языков на другую кнопку (например на F12), можно использовать такие команды:

для режима ввода символов: 
imap <F12> {ctrl-k}{ctrl-6}{ctrl-6}

При этом {ctrl-k} нужно вводить нажатием клавиш <Ctrl> и k. Это означает, что сначала нажимается клавиша <Ctrl> и удерживается нажатой, затем нажимается клавиша k и после этого обе клавиши одновременно отпускаются. После нажатия {ctrl-k} появится подсвеченный значок вопроса, который потом заменится на код клавиши или комбинации, которую Вы введёте, в данном случае {ctrl-6}{ctrl-6}, что будет выглядеть как ^^.

для режима ввода командной строки:
cmap <F12> {ctrl-k}{ctrl-6}{ctrl-6}

В итоге, визуально в .vimrc это должно выглядеть так:

imap <F12> ^^
cmap <F12> ^^

Кроме этого, в версии для Windows Vim по умолчанию не настроен на использование кодировок клавиатуры, содержащих символы кириллицы, например CP1251 и KOI8-R (в версии же для Linux настройка по умолчанию корректна). Как следствие этого, Vim при редактировании русского текста будет неправильно обрабатывать команды перемещения по тексту, основанные на поиске слова, такие как w (одно слово вперёд), b (одно слово назад), * (найти в тексте слово под курсором) и т. п. Чтобы настроить Vim для корректной работы с этими командами независимо от языка, достаточно добавить в файл конфигурации _vimrc следующую строку:

set iskeyword=@,48-57,_,192-255

Однако вышеуказанная строка не позволяет изменять регистр русского текста в версии Vim для Windows. Для решения обеих этих проблем вместо вышеуказанной строки в файл конфигурации добавьте следующую строку:

language ctype Russian_Russia.1251

Способ 2[править]

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

Для этого в .vimrc добавьте следующую строчку:

Для стандартной раскладки (Windows, Linux):

set langmap=ёйцукенгшщзхъфывапролджэячсмитьбю;`qwertyuiop[]asdfghjkl\;'zxcvbnm\,.,ЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>

Для раскладки Mac:

set langmap=йцукенгшщзхъфывапролджэячсмитьбю/ЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/;qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP[]ASDFGHJKL:'ZXCVBNM,./

(Так как в Mac-раскладке символы под цифрами вводят другие символы, соответствующие английским, например, нажатие Shift+4 вводит «%» вместо «$», их не получится переназначить, поэтому способ 1 подходит лучше.)

После этого Vim будет нормально понимать команды, вводимые при включённой русской раскладке.

В старых версиях Vim с локалью UTF этот способ не работает и нужно каждый символ назначить индивидуально:

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

Возможно, это зависит от версии, у меня работает так и причём в UTF:

set langmap=ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;`qwertyuiop[]asdfghjkl;'zxcvbnm,.~QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>

Так как в последних версиях возможна проблема с парсером символа экранирования «\» ― его необходимо записывать как «\\» перед специальными символами «,», «;», «"» и «\». Потому в версии 7.3 правильная строка может быть такой:

set langmap=!\\"№\\;%?*ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;!@#$%&*`qwertyuiop[]asdfghjkl\\;'zxcvbnm\\,.~QWERTYUIOP{}ASDFGHJKL:\\"ZXCVBNM<>

Способы 3 и 4[править]

Использование плагинов ruscmd или vim-xkbswitch.

Вставка форматированного текста с отступами[править]

У начинающих часто возникает ситуация, когда при копировании форматированного текста с отступами — например части страницы из браузера или кода из документации — в Vim строки «съезжают» вправо. Это происходит потому, что редактор пытается помочь отформатировать текст «красиво» и копирует отступы с предыдущей строки в новую. Бороться с этим легко:

:set paste

…вставляем форматированный текст с отступами в режиме редактирования — например средней кнопкой мыши — и строки «съезжать» вправо не будут. После этого режим «вставки» можно отключить командой:

:set nopaste

Поиск в файлах с выводом в список[править]

В некоторых IDE есть очень удобная функция «Find In Files». Она ищет заданную строку или регулярное выражение в файлах в заданной папке и выводит результат поиска в виде списка. Если щёлкнуть по строке этого списка, то откроется файл в том месте, где была найдена заданная строка. Подобная функция есть и в Vim. Чтобы найти в файлах нужную строку, наберите команду:

:vimgrep /искомая строка/ Путь к файлам | :copen

Более конкретный пример:

:vimgrep /translator/ R:\projects\**\*.txt | :copen

Команда vimgrep ищет строку или регулярное выражение, заключённое между символами «//» в файле или файлах, и сбрасывает результаты в специальный буфер, а также открывает файл с первым найденным результатом. Команда copen открывает буфер с результатами поиска. Путь к файлам может указывать как на один файл, так и на набор файлов. Чтобы путь указывал на несколько файлов, используйте символы «?» и «*». Их значение такое же, как и в командной строке операционной системы. Используйте две звёздочки «**», чтобы поиск прошёл по всем подпапкам указанной папки. Пример использования «**»:

/usr/inc**/*.h

может означать:

/usr/include/types.h
/usr/include/sys/types.h
/usr/inc_old/types.h

Как открыть файл в нужной кодировке[править]

Автоматически[править]

При открытии файла Vim попытается определить кодировку и открыть файл в ней. Для этого пропишите в ~/.vimrc:

set encoding=utf-8                                  " set charset translation encoding
set termencoding=utf-8                              " set terminal encoding
set fileencoding=utf-8                              " set save encoding
set fileencodings=utf8,koi8r,cp1251,cp866,ucs-2le   " список предполагаемых кодировок, в порядке предпочтения

К сожалению, Vim не всегда удаётся определить кодировку файла правильно, и вместо осмысленного текста мы наблюдаем кракозябры.

Указать кодировку текста вручную[править]

Например, можно вручную указать кодировку cp1251 (MS Windows) уже открытому тексту:

:e ++enc=cp1251

Предварительно, перед открытием файла, указать ожидаемую кодировку[править]

Для этого установите переменную encoding (сокращённо enc). Например, установить кодировку ucs-2le (Unicode MS Windows):

:set enc=ucs-2le

После этого можно открывать файл. Он откроется в этой кодировке.

Пользовательское меню[править]

Часто для упрощения работы с файлами в различных кодировках в ~/.vimrc определяют специальное пользовательское меню, которое будет вызываться, например, по <F12>.

set wildmenu
set wcm=<Tab>
menu Encoding.koi8-r  :e ++enc=koi8-r<CR>
menu Encoding.cp1251  :e ++enc=cp1251<CR>
menu Encoding.cp866   :e ++enc=cp866<CR>
menu Encoding.ucs-2le :e ++enc=ucs-2le<CR>
menu Encoding.utf-8   :e ++enc=utf-8<CR>
map <F12> :emenu Encoding.<Tab>

Перемещаться по пунктам пользовательского меню можно по <Tab> или клавишами управления курсором.

Дополнительно[править]

Чтобы узнать список всех поддерживаемых кодировок, наберите команду:

:help encoding-values

Конвертация кодировки файла[править]

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

  • Текущая используемая в Vim кодировка задаётся переменной encoding (enc).
  • Кодировка отображения задаётся переменной termencoding (tenc).
  • Кодировка сохранения файла задается переменной fileencoding (fenc).

Кодировка файла encoding определяется при его открытии или берется из настроек системы. При отображении Vim транслирует текущую кодировку encoding в кодировку отображения termencoding. При сохранении в файл — конвертирует из текущей кодировки encoding в кодировку сохранения fileencoding.

Обычно encoding и fileencoding совпадают. Для того чтобы сохранить файл в другой кодировке, надо перед сохранением задать соответствующее значение переменной fileencoding.

Чтобы узнать список доступных значений переменных encoding и fileencoding, наберите команду:

:help encoding-values

Пример: как сконвертировать файл из MS Windows cp1251 в Linux utf-8[править]

  • Открываем файл в Vim:
vim filename.txt
  • Задаем текущую кодировку cp1251:
:e ++enc=cp1251
  • Текст конвертируется, и Vim отобразит изменения, если они произошли. Исходный файл не изменился.
  • Задаем кодировку сохранения файла utf-8:
:set fileencoding=utf-8
  • Задаем формат переводов строки (dos, unix или mac):
:set fileformat=unix
  • Сохраняем файл:
:w
  • Выходим:
:q

Пример: конвертировать файл из Linux utf-8 в MS Windows cp1251[править]

Обратная операция — конвертировать файл из Linux utf-8 в MS Windows cp1251 — будет такой:

vim filename.txt
:e ++enc=utf-8
:set fileencoding=cp1251
:set fileformat=dos
:w
:q

Vim для перевода или чтения английской документации[править]

Итак, чтобы можно было успешно читать и переводить документацию на английском языке, нужно, ИМХО, всего 3 вещи:

  • редактор;
  • переводчик;
  • проверка орфографии.

Если их удобно объединить, то можно получить хорошую среду для перевода или чтения.

Что возьмем[править]

В качестве редактора, естественно, возьмем Vim. Переводчик mueller, консольная версия, работает так:

% mueller sex
sex  [seks] _n. 1> _биол. пол; the weaker sex слАбый пол, жЕнщины; the sterner (или stronger) sex сИльный пол, мужчИны; the sex _шутл.  жЕнщины 2> секс 3> _at
tr. половОй, сексуАльный; sex instinct половОй инстИнкт; sex intergrade гермафродИт

И орфографмометр: это spell в Vim, словари скачаем с vim.org.

Как настроим[править]

Мне интересна возможность выпадающего списка при наведении на неизвестное слово мышкой. Для этого, после долгого чтения манов (или гугленья), узнаем, что с помощью команды system можно выполнить какое-то действие, вывод которой куда-либо записать. Пишем где-нибудь в ~/.vimrc:

function! MyBalloonExpr()
       return system("mueller ". v:beval_text)
endfunction
set bexpr=MyBalloonExpr()
set ballooneval
set balloondelay=100

Определили функцию MyBallonExpr, которая будет формировать строку mueller — слово, на которое навели — и выполнять. Результат выполнения будет выдавать в «балоне», выпадающем окошке, через 100 миллисекунд.

Естественно, вместо mueller вы можете поставить любую другую программу, которая переводит текст.

Рецепт для очень умелых ручек[править]

Если у вас нет консольной версии mueller, но есть много энтузиазма, можно поступить так:

  • идем на http://sourceforge.net/projects/mueller-dict/ и забираем оттуда mueller-dict-3.1.1.tar.gz;
  • извлекаем из архива файл mueller-base.dict.dz и кладем его, скажем, в ~/dict/;
  • там же создаем файл mueller-base.sh со следующим содержимым:
#!/bin/bash
# 
WORD=`echo $1 | sed -e 's/[A-Z]*/\L&/g;s/[,.;:]//g'`;
if [ -z $WORD ]; then exit; fi;
LINES=50;  
DICTIONARY="$HOME/dict/mueller-base.dict.dz"; 
# 
zgrep -aA$LINES '^'$WORD'$' $DICTIONARY | sed -e '/^$/d; 1s/^/ &/;/^[^ ]/,$d'
#
  • даем нашему новому консольному словарику право на исполнение:
$ chmod +x ~/dict/mueller-base.sh
  • и проверяем его работоспособность:
$ ~/dict/mueller-base.sh head
  • Для графической версии редактора, gvim, функция перевода в нашем ~/.vimrc должна выглядеть так:
function! MyBalloonExpr()
   return system("$HOME/dict/mueller-base.sh ". v:beval_text)
endfunction
set bexpr=MyBalloonExpr()
set ballooneval
set balloondelay=500

Примечание:

  • Естественно, что функция MyBalloonExpr() работает только в gVim, зато выглядит красиво. Наведите курсор на слово и оставьте неподвижным секунду-две (поначалу можно вообще убирать руку с мышки, позже приловчитесь).
  • LINES=50 ограничивает количество выводимых строчек. Можете подобрать цифру под свой монитор.
  • Рекомендую выставить balloondelay=500 миллисекунд. Да, помедленнее. Но мышка будет меньше цепляться за слова.
  • Для текстовой версии редактора (vim) придётся делать специальную функцию TranslateWord() и вешать её вызов на специальную функциональную клавишу, например <F9>:
function! TranslateWord()
   let s:dict    = "$HOME/dict/mueller-base.sh"
   let s:phrase  = expand("<cword>")
   let s:tmpfile = tempname()
   silent execute "!" . s:dict . " " . s:phrase . " > " . s:tmpfile
   execute "botright sp " . s:tmpfile
endfunction
map <F9> :call TranslateWord()<CR>

Примечание:

  • Это работает точно так же и в графической версии редактора, gvim. Поэтому метод можно считать универсальным, но он требует нескольких нажатий клавиш, и сплит-окно выглядит менее элегантно, чем подсказки.
  • Открывшееся окно с переводом можно закрыть стандартным способом ( :q ). Ну, а если вы воспользовались советом выше и забиндили на клавишу <F10> предложенное пользовательское меню, то алгоритм работы будет совсем простой: <F9> смотрим перевод <F10><Enter> вернули как было.
  • Этот метод использует временный файл.
  • Так как в этом методе нет необходимости в ограничении, чтоб подсказка помещалась на экран, то для LINES можно увеличить лимиты, хоть до LINES=500. Этот метод не имеет ограничений на количество выводимых строчек.

Строка статуса редактора[править]

Строка статуса редактора бывает очень полезна, если вам не жалко пары строчек на экране. Добавьте в ~/.vimrc:

set laststatus=2   " всегда показывать строку статуса
set statusline=%f%m%r%h%w\ %y\ enc:%{&enc}\ ff:%{&ff}\ fenc:%{&fenc}%=(ch:%3b\ hex:%2B)\ col:%2c\ line:%2l/%L\ [%2p%%]

…и у вас в предпоследней строке будет выводиться что-то вроде этого:

.vimrc [vim] enc:utf-8 ff:unix fenc:utf-8       (ch: 92 hex:5C) col:26 line:158/168 [94%]

Комментарий:

%f — имя файла и путь к нему относительно текущего каталога;
%m — флаг модификации/изменения, выводит [+] если буфер изменялся;
%r — флаг «только для чтения», выводит [RO], если буфер только для чтения;
%h — флаг буфера помощи, выводит [help], если буфер со справкой Vim;
%w — флаг окна превью, выводит [Preview];
'\ ' — экранированный символ пробела. Пробел можно указывать только экранированным, иначе произойдёт ошибка синтаксиса;
%y — тип файла в буфере, например [vim];
enc:%{&enc} — отображение кодировки encoding (enc). Обратите внимание: «enc:» — текст, «%{&enc}» — вывод значения внутренней переменной (enc);
ff:%{&ff} — отображение формата перевода строки fileformat (ff);
fenc:%{&fenc} — отображение кодировки сохранения в файл fileencoding (fenc);
%= — далее выравнивать вправо;
ch:%3b — код символа под курсором в десятичной системе счисления, минимум 3 символа;
hex:%2B — код символа под курсором в шестнадцатеричной системе счисления, минимум 2 символа;
col:%2c — курсор в колонке, минимум 2 символа;
line:%2l/%L — курсор в строке (минимум 2 символа)/всего строк в файле;
%2p — число процентов в строках, где находится курсор (0 % — начало файла; 100 % — конец файла), минимум 2 символа;
%% — так как символ «%» используется для переменных, вывод символа «%» в строке статуса нужно делать особым образом — %%.

Подробнее о формате вывода statusline смотрите в справке:

:help statusline

Проверка орфографии[править]

Пользовательское меню[править]

Часто бывает удобно оформить процедуры, связанные с проверкой орфографии, в виде пользовательского меню:

set wildmenu
set wcm=<Tab>
" проверка орфографии:
menu SetSpell.ru  :set spl=ru spell<CR>
menu SetSpell.en  :set spl=en spell<CR>
menu SetSpell.off :set nospell<CR>
map <F7> :emenu SetSpell.<Tab>
" выбор альтернатив:
imap <F8> <Esc> z=<CR>i
map <F8> z=<CR>

Здесь по <F7> вызывается подменю: проверить орфографию русского [ru], английского языка [en] или отключить проверку орфографии [off].

По <F8> для слова под курсором можно найти корректную альтернативу из словаря. Порядок работы следующий:

  • наводим курсор на выбранное слово (или подсвеченное проверкой орфографии слово);
  • нажимаем <F8> и видим список альтернатив. Каждый вариант в списке помечен цифрой;
  • находим понравившийся вариант и запоминаем его номер;
  • смело начинаем набирать запомненный номер, неважно, одна это цифра или две;
  • снова нажимаем <F8>.

Слово под курсором будет заменено альтернативой с указанным номером. Последовательность: <F8><одна-или-две-цифры><F8>.

Как это работает?[править]

Попробуйте на примере слова «шпоргалка»:

  • Откройте Vim, перейдите в режим редактирования и наберите слово «шпоргалка».
  • Выйдите из режима редактирования в командный режим (обычно <Esc><Esc>).
  • Установите курсор на слово «шпоргалка».
  • Нажмите последовательно два символа «z» и «=» (два символа: z=).
  • Как результат, вы увидите экран с альтернативами, подобранными для слова под курсором. Нажатие любой клавиши скроет этот экран, но безопасными и не оставляющими следов в буфере клавиатуры будут либо <Esc><Esc>, либо <Enter>.
  • Запоминаем, что хорошей альтернативой слову «шпоргалка» было слово «шпаргалка», под номером «1».
  • А теперь магия! Нажимаем последовательно три символа: «1», «z» и «=» (три символа: 1z=).
  • Слово под курсором «шпоргалка» заменено на «шпаргалка».
  • С использованием пользовательского меню, операция будет выглядеть, как три нажатия на кнопки: <F8>1<F8>.

Теперь мы с вами знаем, что если навести на слово «шпоргалка» курсор и нажать три магических символа 1z=, то ошибочное слово будет волшебным образом заменено на правильное («шпаргалка»). А если нажать четыре магических символа 39z=, то слово «шпоргалка» под курсором будет волшебным образом заменено, скорее всего, на слово «прогулка» (если у вас стоят словари той же версии, что и у меня).

А теперь самая главная тайна: для того чтобы все вышеуказанное работало, проверка орфографии русского языка должна быть включена.

На всякий случай напоминаю, что выход без сохранения изменений:

:q!<Enter>

Выход с сохранением изменений:

:x<Enter>

Влияние Vim[править]

Существуют браузеры и расширения для браузеров, делающее управление ими похожим на управление текстовым редактором Vim, например:

  • Vimperator — расширение для Mozilla Firefox.
  • Pentadactyl — расширение для Mozilla Firefox, форк Vimperator.
  • Vimium — расширение для браузеров на базе Chromium.
  • Conkeror — лёгкий веб-браузер на основе движка Gecko.
  • Luakit — лёгкий, быстрый браузер для UNIX-систем, использующий движок WebKit.

Ссылки[править]