20
июля
2

Использование Vim в повседневной работе



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

«Вечная» отмена изменений

Начиная с версии 7.3. стала доступной так называемая «вечная» отмена изменений (undo-persistence). После включения данной функции все изменения, которые производились в документе, можно откатить даже после сохранения и закрытия этого файла. История изменений автоматически сохраняется в отдельном скрытом файле с расширением «.un~» в той же директории, где находится редактируемый документ. Либо в отдельной директории, которую можно задать в настройках; тогда название файла будет состоять из пути к редактируемому файлу, используя в качестве разделителя символ «%» вместо «/». Для включения всего этого пропишем в vimrc:

set undofile #включить "вечную" отмену изменений
set undodir=~/.vim/undo/  #директория для файлов с историей изменений 

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

Режим «вклейки»

Не менее полезным будет познакомиться с так называемым режимом «вклейки», который включается командой «set paste». Это полезно использовать в терминале, когда нужно скопировать некоторый текст с другого окна и вставить в Vim во избежание непредвиденных эффектов. Vim с GUI (графическим интерфейсом) может различать вставляемый текст и обычно сделает это правильно без опции ‘paste’. Данная опция игнорируется, если редактор запущен с GUI. Даже если опция установлена в vimrc, то она будет работать только в терминале.

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

Когда опция ‘paste’ установлена, то следующие несколько других опций отключаются:
— мапинг в командном и режиме вставки
— использование аббревиатур
а следующие опции устанавливаются в «0»:
— ‘textwidth’
— ‘wrapmargin’
— ‘autoindent’
— ‘smartindent’
— ‘softtabstop’
— ‘revins’
— ‘ruler’
— ‘showmatch’
— ‘formatoptions’
За счет отключения вышеприведенных опций на то время, когда фрагмент текста нужно перенести с системного буфера в редактируемый документ, сохраняется его изначальное форматирование, которое требуется.
Включение/отключение режима «вклейки» (set paste / set nopaste) не удастся для удобства «повесить» на какие-нибудь клавиши или комбинации клавиш, так как команда :map в данном режиме не работает. Разработчиками Vim предусмотрена специальная опция для указания клавиши управления режимом «вклейки» — ‘pastetoggle’ или ‘pt’, которая по умолчанию содержит пустую строку.
Присваивание ей какой-то {keys} равносильно заданию:

:map {keys} :set invpaste<CR> 

с той лишь разницей, что это будет работать, когда опция ‘paste’ установлена.
‘pastetoggle’ работает в режиме вставки и нормальном режиме редактора, но не в режиме командной строки.
Для установки клавиши <F7> в качестве переключателя режима вклейки пропишем в vimrc следующее:

set pastetoggle=<F7> 

Теперь перед вставкой фрагмента текста из внешнего буфера достаточно нажать <F7> для получения в подавляющем большинстве случаев ожидаемого результата. Об активации режима вклейки будет свидетельствовать надпись «— INSERT (paste) —» в режиме вставки.
Если Vim работает с графическим интерфейсом (gvim), то у него есть доступ к Х-буферу и можно вставлять текст с помощью комбинации клавиш «+gP.

Комментирование нескольких строк в коде скрипта

a) переходим в визуальный режим выделения прямоугольного участка текста нажатием Ctrl+v. Выделяем блок текста включая начало строк. Далее нажатием «I» перемещаемся в начало строки с переходом в режим вставки и вводим символ комментария.

б) в визуальном режиме выделяем текст построчно с помощью Shift+v, затем переходим в командный режим и набираем команду замены:

:'<,'>s/^/#/ 

где «#» — символ комментария.

Настройка отступов и табуляции

Это является достаточно важным моментом при наборе и редактировании текста в редакторе. Хотелось бы выделить основные опции, которые на это влияют.

‘Textwidth’ и ‘wrapmargin’

‘textwidth’ или ‘tw’ (по умолчанию 0) — это максимальная ширина текста, который вводится. Длинные строки будут прерваны после пробельного символа по достижению этой ширины. Нулевое значение отключает это. Если ‘textwidth’ ровняется нулю, то может быть задействована опция ‘wrapmargin’.
‘wrapmargin’  или ‘wm’ (по умолчанию 0) — количество символов от правой границы окна, набор текста по достижению которой будет продолжен в следующей строке. Когда ‘textwidth’ не равняется нулю данная опция не используется.
Выбираем опцию, которую будем использовать и соответствующее значение и добавляем в конфигурационный файл, например:

set textwidth=80 

что даст автоматический переход текста на новую строку, чтобы длина текущей не превышала 80 символов.
Данные опции по установке фиксированной ширины строки работают только при наборе текста, а если происходит редактирование над уже набранным, автоматический перенос строк осуществляться не будет.
Чтобы переформатировать выделенный текст в визуальном режиме под заданную ширину строк нужно использовать последовательное нажатие клавиш «gq» после выделения фрагмента текста. Комбинацией клавиш gq{перемещение} будут отформатированы строки над которыми произойдет перемещение. «gqq» отформатирует текущую строку; «gqj» — текущую и следующие строки. Если нужно произвести действие над всем текстом, то сначала его нужно выделить, а потом нажать «gq» либо без режима выделения — «gggqG», что означает перейти в начало документа «g», активировать переформатирование «gq» и применить его к концу редактируемого файла «G».
Еще представляет некоторый интерес опция ‘wrap’ (по умолчанию включена), которая отвечает за изменения отображения текста. Она не изменяет текст, находящийся в буфере, как это делает ‘textwidth’. Когда включена, то длинные строки для ширины открытого окна будут перенесены и их продолжения отобразятся на следующей строке.

Autoindent и smartindent

‘autoindent’ или ‘ai’ (по умолчанию отключена) — для новой строки копирует отступ текущей при нажатии клавиши ввода (<CR>,<Enter>) в режиме вставки или когда используется команда «o» или «O». Если отступ не нужен для новой строки его можно убрать с помощью <BS> or CTRL-D в режиме вставки.
Когда autoindent включено, то при форматировании командой «gq» используется отступ первой строки.
‘smartindent’ или ‘si’ (по умолчанию отключена) — умный авто-отступ (smart autoindenting) при старте с новой строки. По большей части нужен при редактировании каких-либо скриптов. Обычно ‘autoindent’ также должен быть включен, когда используется ‘smartindent’. При включении этой опции, к примеру, автоматическая работа происходит с фигурными скобками, в закомментированом тексте на новой строки выставляется символ комментария.

set autoindent
set smartindent 

Табуляция и другие настройки

‘tabstop’  или ‘ts’ (default 8 ) — количество пробелов в месте нажатия клавиши <Tab>. Влияет как на уже существующие табуляции, так и на новые. При изменении значения сразу применяется к тексту.
Командой :retab можно заменить все существующие в документе символы табуляции на пробелы.
‘shiftwidth’ или ‘sw’ (default 8 ) — количество позиций символов, вставляемых при (auto) отступе. Используется также командами «<<«, «>>» и другими подобными.
‘expandtab’  или ‘et’ (default off) — в режиме вставки использует соответствующее количество пробелов для замены пространства, вставляемого по нажатии клавиши <Tab>. Используется также в отступах в командах ‘>’ и ‘<‘, а также когда включен ‘autoindent’.

set tabstop=4
set shiftwidth=4
set expandtab 

Перемещение по документу с таблицами и схемами

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

:set virtualedit=all 

Аналоги терминальных комбинаций клавиш и наиболее популярные команды

Очень полезным при наборе в командной строке редактора или строке поиска помнить о поддерживаемых комбинациях клавиш, таких же, что работают в терминале:
<Ctrl+b> — переместить курсор в начало строки;
<Ctrl+e> — в конец строки;

В режиме вставки:
<Ctrl+t> — вставить табуляцию в начало текущей строки;
<Ctrl+d> — удалить табуляцию из начала текущей строки;
<Alt+b> — переместить курсор на слово влево;
<Ctrl+End> — в конец файла;
<Ctrl+Home> — в начало файла;

Общие:
<Ctrl+Left> — переместить курсор на слово влево;
<Ctrl+Right> — на слово вправо;
<Ctrl+h> — удаляет последний символ;
<Ctrl+w> — удаляет слово, находящееся перед курсором;
<Ctrl+u> — удаляет все символы от начала строки до курсора;

Значительно проще управляться с клавиатурой становиться зная аналоги стандартных клавиш. Приведу соответствия ниже:
<Ctrl+[> – <Esc>
<Ctrl+i> – <TAB>
<Ctrl+h> – <<BackSpace>
<Ctrl+m> – <Enter>

Наиболее употребляемые в повседневном использовании клавиатурные комбинации и команды:
g~~ — инвертировать регистр (без «g» применяется к символу под курсором);
gf — открыть файл с именем, находящимся под курсором;
>> — добавить отступ для текущей строки;
<< — убрать отступ;
Ctrl+g — вывести информацию об редактируемом файле;
% — найти парную скобку для находящейся под курсором;
0 — перейти в начало строки;
( — начало предложения;
) — конец предложения;
{ — начало абзаца;
} — конец абзаца;
H/M/L — переместить курсор в отображаемом тексте на первую/центральную/последнюю строку соответственно;
`. — перейти к строке, которая редактировалась последней;
` дважды — переход между двумя последними позициями курсора;
‘ дважды — переход между двумя строками, где находились позиции курсора;
{1-100}% — перемещает курсор в соответствующее положение в документе;
x — удалить символ под курсором;
. — повтор последней команды;
ZZ и ZQ — соответствуют командам :wq и :q! в командном режиме;
:n,m w outfile — записать в outfile с n-ой по m-ую строки;
:w file — сохранение всего буфера в файл file;
:r infile — вставить содержимое файла infile;
:args — посмотреть список открытых файлов;
:sh — открыть терминал (после выхода происходит возврат обратно в редактор);
:set number / :set nonumber — включить/отключить нумерацию строк;
:!command — выполнить внешнюю команду command;
:n — перейти на строку под номером n;

Понравилась статья?
Подписаться на RSS feed
2 комментария:
  1. yozhik 6 мая, 2012

    можно писать
    :set num / set nonum
    не обязательно полностью

  2. TheAthlete 15 июля, 2015

    я пользуюсь командами
    :set nu/nonu

Оставить комментарий