Thursday, February 22, 2007

Эффективная работа с vim

Попытался сделать перевод интересной статьи. Оригинал лежит здесь

"Для меня vi это Дзен.
Использование vi - это практика дзена.
Каждая команда является коаном.
Полный смысла для пользователя,
Бессмысленный для непосвященного.
Вы познаете истину каждый раз когда вы его используете."

--reddy@lion.austin.com

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

В этом учебном пособии <c-x> означает Ctrl-X, те удерживая клавишу Ctrl нажмите клавишу x. Вы можете получить информацию о большинстве команд, используемых здесь, набрав :help command в редакторе vim, где command - это команда по которой в хотите получить справку.

Эффективное перемещение

Опасайтесь режима вставки

В основном, вы должны тратить как можно меньше времени в режиме вставки, потому что этот режим дйствует как тупой редактор. Именно поэтому новички проводят так много времени в режиме вставки -- он делает использование vim проще. Но настоящая мощь vim скрыта в использовании командного режима! Вы поймете: чем вы лучше знаете vim, тем меньше времени вы будете проводить в режиме вставки.

Используйте h, j, k и l

Первым шагом к эффективному редактированию будет отвыкание от использования клавиш курсора. Одним из преимуществ модульного дизайна vim - это то что вам нет надобности перемещать свои руки назад-впред между клавишами курсора и обычными клавишами; когда в в режиме команд буквы h, j, k, l соответствуют направлениям влево, вниз, вверх и вправо. Конечно, необходимо некоторое время для практики, но вы увидите разницу в скорости как только попробуете.

Когда вы редактируете e-mail или иной текст форматированный абзацами, вы можете заметить что клавиши курсора пропускают больше линий чем вы ожидаете. Это происходит потому что абзацы для vim являются одной длинной линией. Для перемещения по одной экранной линии вместо целого абзаца перед нажатием клавиш h, j, k, l нажмите клавишу g.

Используйте комбинации для перемещения курсора в текущей строке

Большинство редакторов имеют только простые команды для перемещения курсора (влево, вправо, вверх, вниз, в начало линии и в ее конец, и тп). Vim имеет очень продвинутые команды для управления курсором; эти команды называются комбинациями(orig: "motions"). Когда курсор передвигается от одной точки текста в другой, текст между этими точками (включая их самих) считается "пропущенным"(orig: "moved over")(этот термин будет важен позже)

Вот несколько ииз наиболее полезных движений:

fxпередвинуть курсор вперед (forward) к следующему вхождению символа x в текущей строке(конечо же x - может быть любым символом который вам нравится). Это безумно полезная команда. Вы можете напечатать ; для того что бы повторить последнюю команду f, которю вы ввели.
txтоже что и описанно выше, но при этом курсор устаналивается прямо перед символом, а не на сам символ. (Это также может оказаться реально полезным)
Fxпередвинуть курсор назад (backward) к спредыдущему вхождению символа x в текущей строке
wпередвинуть курсор вперед на одно слово
bпередвинуть курсор назад на одно слово
0передвинуть курсор на начало текущей строки
^передвинуть курсор на первый символ в текущей строке
$передвинуть курсор на конец текущей строки
(передвинуть курсор вперед к следующему предложению. (Полезно при редактировании e-mail и текстовых документов)
)передвинуть курсор назад на одно предложение.

Эффективно передвигаемся по файлу

Vim имеет множество команд, которые могут вас послать в любое место, которое вы захотите в вашем файле - очень редко возникает необходимость прокручивать вручную сквозь дебри текста. Нижеперечисленные сочетания клавиш не являются двиениями, потому что они перемещают вас по файлу, а не по строке.
<c-f>передвинуться вперед(forward) на один экран
<c-b>переместиться назад(backward) на один экран
Gпередвинуть курсор в конец файла
numGпередвинуть курсор на линию номер num( например, 10G передвинуть курсор на линию номер 10)
ggпереместить курсор в начало файла
Hпередвинуть курсор наверх экрана
Mпередвинуть курсор в центр экрана
LL - передвинуть курсор вниз экрана
*перейти в следующее упоминание текущего слова в файле(Например, если курсор указывает на слово "вася", то он переместится на следующее упоминание этого слова в вашем файле)
#тоже самое что и *, но передвигает на предыдущее упоминание
/textначиная от курсора ищет следующее упоминание строки text и переходит к ней. Для выполнения поиска необходимо нажать enter. Для повторного выполнения последнего поиска нажмите n (next)
?textтоже что и /text, но поиск идет в обратную сторону
maсоздать закладку с именем a, указывающую на текущую позицию курсора. Закладна может быть названа любой строчной буквой. Закладка - как суслик - вы ее не видите, а она есть.
`aперейти к закладке a. Обратите внимание: это обратная кавычка, а не одинарная. Она распположена в левой верхней части клавиатуры.
`.перейти к линии которую вы редактировали последней. Это очень полезно! Если вам необходимо просмотреть файл для поиска чего-либо вы можете вернуться на позицию в которой вы вносили последние изменения без установки закладок.

Печатаем эффективно

Используем автозавершение слов.

Vim имеет очеть хорошую систему автодополнения слов. Это означает что вы можете напечатать часть длинного слова, нажимаете клавишу и vim завершает слово за вас. Например если у вас есть переменная называющаяся iAmALongAndAwkwardVarName где-либо в вашем коде, вы вроятнее всего не очень захотите печатать целиком такое имя при каждом использовании.

Для использования автозавершения слов просто напечатайте несколько первых букв (например iAmAL) и нажмите <c-n&rt; либо <c-p&rt. Если vim не выдал вам необходимого варианта слова сразу, продолжайте попытки -- vim будет циклично пытаться подставить все окончания слов, которые могут подойти.

Эффективный переход в режим вставки

Большинство новых пользователей vim переходят в режим вставки с помощью нажатия клавиши i. Это работает, но часто довольно неэффективно, поэтому vim имеет несколько команд для перехода в режим вставки. Перечислим несколько самых популярных:
iвставить текст слева от текущего
Iвставить текст в начало строки
aвставить текст справа от текущего символа
Aвставить текст в конец текущей строки
oсоздать новую строку под текущей и вставить текст в новую строку
Oсоздать новую строку над текущей и вставить текст в новую строку
c{motion}удалить текст помеченый как "пропущенный" и вставить текст для замены. Например c$ удалит текст от позиции курсора до конца строки и перейдет в режим вставки. Удаленный текст перенесется в буфер обмена и в последствии может быть вставлен
d{motion}тоже что и c{motion}, но без перехода в режим вставки

Эффективно передвигаем блоки текста

Используйте визуальное выделение и подходящий режим выделения

В отличие от оригинального редакттора vi, vim позволяет вам выделять текст и производить операции с ним. Существуют три основных режима визуального выделения (режимы подсветки текста). Эти режимы активируются следующим образом:

vпосимвольный режим выделения. Этот режим используется большинством людей, поэтому попробуйте попрактиковаться перед тем как пробовать остальные.
Vпострочный режим выделения. В этом режиме выделяются всегда целые линии. Это намного удобнее в случае если вы хотите выделить несколько линий
<c-v>блочный режим выдделения. Безумно мощное средство, доступное в небольшом количестве редакторов. Вы можете выделить прямоугольный блок с любым текстом внутри и он будет подсвечен.

Все обычные команды управления курсором также работают. Например команда vwww -- переведет vim в режим посимвольного визуального редактирования и выделит следующие три слова. Команда Vjj -- переведет vim в режим посимвольного визуального редактирования и выделит текущую строку и две строки под ней.

Вырезание и вставка из режима визуального выделения

Вероятно, после того как вы выделите какой-то участок текста, у вас возникнет желание что-либо с ним сделать, иначе зачем бы вам понадобилось его выделять? Вот несколько полезных команд которые можно использовать над выделенным участком текста:

dвырезать(удалить) выделенный текст и поместить его в буфер обмена
yскопировать (yank) помеченный текст в буфер обмена
cвырезать помеченный текст и поместить его в буфер обмена. Эта команда действует аналогично команде d, но оставляет редактор в режиме вставки

Вырезание и вставка из режима невизуального выделения

Если вы знаете что вам необходимо вырезать или скопировать, то вы можете совершить данные операции без перехода в режим визуального выделения. Это сбережет ваше время

dd{motion} - вырезать текст помеченный как "пропущенный" и поместить его в буфер обмена. Например команда dw вырежет слово, а команда dfS вырежет текст начиная с позиции курсора и заканчивая следующим символом S, который встретится в текущей строке, включая сам символ S
y{motion}скопировать "пропущенный" текст
c{motion}вырежет "пропущенный" текст и оставит редактор в режиме вставки
ddвырежет текущую строку
yyскопиует текущую строку
ccвырежет текущую строку и оставит редактор в режиме вставки
Dвырежет текст от позиции курсора и до конца текущей строки
YY - скопировать весь текст, подобно yy. (Это конечно нестандартно, вы можете использовать y$ для действияя которое вы могли ожидать от команды Y)
Cвырезать текст от курсора до конца строки и оставить редактор в режиме вставки
xвырезать текущий символ (действует подобно backspaсe)
sвырезать текущий символ и оставить редактор в режиме вставки

Вставка

Вставка - это просто. Поместите курсор в место куда вы хотите вставить текст и нажмите на клавишу p

Использования нескольких буферов обмена

Большинство из редакторов меют только один буфер обмена. У vim их же намноо больше. Буферы обмена вв vim называются регистрами(registers). Вы можете получить список всех зарегистрированых буферов обмена и их содержимое ввев команду :reg. Обычно вы будете использовать регистры в строчном формате; регистры в прописном формате используются для внутренних нужд vim и могут быть иногда полезными.

Для того что бы использовать определенный регистр для операций копирования/вставки, просто введите "a перед командой копирования/вставки, где a - имя регистра который вы хотите использовать. Например для того что бы скопировать текущую строку в регистр k, вы должны ввести команду "kyy (второй вариант v"ky. Кто знает почему это работает? Эта строка останется в регистре k пока вы не скопируете что-либо другое в регистр k. Для вставки текста из регистра k, вы должны ввести "kp.

Избегайте повторения своих дейcтвий

Удивительная команда .

В vim, нажатие . (точка) будет вызывать повторение последней введенной команды. Например, если последняя команда была dw(удалить слово), после нажатия . в режиме команд vim удалит еще одно слово.

Использование счетчиков

Счетчики - это очередной мощный и сохраняющий ваше время инструмент. Любые команды могут быть предварены числом. Это число указывает сколько раз необходимо повторить команду. Вот несколько примеров:
3jпереведет курсор на 3 строки вниз
10ddудалить 10 строк
y3f&qoute;скопирует текст от курсора до третьей кавычки после курсора на текущей строке.

Также счетчики полезны для расширения границ "пропусков" (motion).

Запись макросов

Иногда вы можете заметить что вы выполняете одни и теже действия над блоками текста. Vim позволяет вам записать макрос для выполнения операций.
qregisterначать запись макроса в именованный регистр. Например, qa начинает запись и сохраняет макрос в регистр a
qзакончить запись макроса
@registerвыполнить макрос сохраненный в именованном регистре. Например @a выполнит макрос записанный в регистре a.

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

Написание програмного кода в vim

Vim - прекрасный редактор для програмного кода потому что в нем присутствует множество специальных команд, которые предназначены специально для облегчения жизни программистов. Вот несколько полезных из них:
]pподобно p, но автоматически подбирает отступ для вставки кода. Испытайте эту команду!
%переместите курсор на скобку, квадратную скобку или фигурную скобку и нажатие на % переместит курсор на соответствующую парную скобку. Прекрасное средство для исправления проблем, при разборе кода, связанных с большими блоками кода или логики
>>сдвинуть вправо выделенный текст (сделать отступ). Если текст не выделен то сдвинется вся строка
<< - тоже самое что и >>, но сдвиг происходит влево
gdперейти к обьявлению функции или переменной на которой в данный момент стоит курсор
Kперейти к man-странице слова под курсором. (Например если курсор у вас стоит на слове sleep, то вы увидете man-страницу для sleep)

Technorati Tags: , ,

13 коммент.:

Дмитрий said...

s/c-f&rt/c-f>/ :)
и
s/y3&qoute/y3f&qoute;/ судя по описанию.

Очень познавательно, литературу такого толка куда приятнее читать в русском варианте. Может заодно подскажете, как научить vim7 понимать русские буквы под ms-windows? Из коробки не работают ни команды перевода регистра, ни переходы по словам.

fatroom said...

> Может заодно подскажете, как научить vim7 понимать русские буквы под ms-windows?

К сожалению нет :( основная ось у меня линукс :( vim для винды никогда не пробовал.

Anonymous said...

Почти в тему: недавно наткнулся на интересную демку emacs.
http://mathrick.org/files/emacs-demo.gif

wd said...

>s/c-f&rt/c-f>/ :)

>s/y3&qoute/y3f&qoute;/ судя по описанию.

аналогично для ctrl-n и crtl-p для автопродолжения.

Anonymous said...

Хорошая статья. Коротко, но охватывает основные операции, которые необходимо выполнять в редакторе. Добавил её в закладки броузера :-)
Спасибо!

Taras said...

А куда Vim складывает записанные в регистры qa ... qz макросы? Как долго они там хранятся?

fatroom said...

@taras,
Не уверен точно, но быстрое гугление дало ответ ~/.vimrc
Думаю что ttl вечен :)

Anton said...

Спасибо! Vim самое оно

phil pirj said...

Шикарно, лучше vimtutor'а

sobakal said...
This comment has been removed by the author.
sobakal said...

Спасибо за познавательную статью. Перевод хорош.
Вот только символа &rt не существует в природе, а существует &gt - &GreaterThan

Виктор Погребняк said...
This comment has been removed by the author.
Виктор Погребняк said...

Неплохой бриф, но в разделе о перемещении очень не хватает инфы про e (перемещение в конец слова), а в разделах о вставке про I, A, S, ну и про r и R не упомянуто вовсе.