Pull to refresh

эффективное использование vim: «from the very begining»

Reading time 7 min
Views 26K
«Для меня vi это Дзен.
Использование vi — это практика дзена.
Каждая команда является коаном.
Полный смысла для пользователя,
Бессмысленный для непосвященного.
Вы познаете истину каждый раз когда вы его используете.»
--reddy@lion.austin.

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



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

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

Итак, для vim имеет три режима:
решим комманд — копирование\вставка\удаление\форматирование текст и тп
режим вставки — режим ввода текста
режим выделения — ясно из названия =)
Esc — отмена текущего действия\выход в режим команд

При открытии файла вы автоматически попадаете в режим команд, с него и начнем.

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


ты используешь h/j/k/l для перемещения?
или до сих пор живешь в мире «GUIarrows ?»
если да — переучись
сохрани для себя бесконечные километры движений до стрелок и «home» клавиш


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

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



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

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



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

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


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



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



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

Для использования авто-завершения слов просто напечатайте несколько первых букв (например iAmAL) и нажмите >c-n< либо >c-p<.

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


Сколькими методами ты можешь перейти в режим вставки?
давай посмотрим i I o O s S a A c C?
и r R для полного ассортимента
и это только одиночные буквы....

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


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


как ты двигаешься
в начало\конце файла? gg/G
на 100, 1546, n-ю строку? 100G, 1546G, nG
на первый не пустой символ в строке? ^
в следуйщей строке? >CR<
в предыдущей? — (минус)


Vim имеет множество команд, которые могут вас послать в любое место (так что не обижайтесь если что=), в вашем файле — очень редко возникает необходимость прокручивать вручную сквозь дебри текста.
Вот несколько ииз наиболее полезных движений:

&gtc-f&rt передвинуться вперед(forward) на один экран
&gtc-b&rt переместиться назад(backward) на один экран
G передвинуть курсор в конец файла
numG передвинуть курсор на линию номер num( например, 10G передвинуть курсор на линию номер 10)
gg переместить курсор в начало файла
H передвинуть курсор наверх экрана
M передвинуть курсор в центр экрана
L передвинуть курсор вниз экрана


так же вы можете расставлять метки в буфере:
m — создать метку , указывающую на текущую позицию курсора.
` — установить курсор на метке . Обратите внимание — ковычка обратная `
' — установить курсор на одну линию с меткой `. или '. — установить курсор в позицию где были произведены последние изменения (разницу между ` и ' см выше)
`` — переход между двумя последними позициями


— метка будет локальной
— глобальной
:marks — выводит список все меток

Для тех кто намертво сегодня ночью решил таки слезть с notepad++ (простите, для тех кто еще не сталкивался с метками) я хотел бы привести небольшой псевдо пример, забегая немного на перед:

только напишу, что
u — undo
>c-R< — rendo

открываем c:\windows\system.ini
5G — идем на 5-ю сточку
ma — ставим марку «a»
15G — идем на 15-ю стоку
c'a — меняем текст по своему усмотрению

после произведенных изменений идем в режим команд (Esc)
10G — см выше
mb — см выше
d'b — d = delete

опять идем в режим вставки
>c-v< — режим выделения (о нем чуть позже, просто хочу показать всю мощь вима)
4j — j — сдвиг курсора вниз nj — означает повторить сдвиг n раз
4>> — сдвиг текста вправо, n>> аналогично nj
20G — идем на 20-ю строчку
='a — чудеса авто-форматирования? =)

идем в режим вставки
:q! — выйти не сохраняя изменений
если вы считаете что вим уже освоен — нужно вводить просто :wq (не советую, но попробовать можно)



Поиск слов в тексте



* перейти в следующее упоминание текущего слова в файле(Например, если курсор указывает на слово «вася», то он переместится на следующее упоминание этого слова в вашем файле)
# тоже самое что и *, но передвигает на предыдущее упоминание
/text начиная от курсора ищет следующее упоминание строки text и переходит к ней. Для выполнения поиска необходимо нажать enter. Для повторного выполнения последнего поиска нажмите n (next)
?text тоже что и /text, но поиск идет в обратную сторону


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



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



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

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

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

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



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

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

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



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

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

Для вставки поместите курсор в место куда вы хотите вставить текст и нажмите на клавишу p

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



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



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

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



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


всем спасибо за внимание
если честно — то я хотел написать больше (не затронул тему макросов, регистров, дополнительных модулей и тп), но из ходя из объема, я думаю пока что будет достаточно
если у меня хватит кармы — обещаю напсать продолжение =)

от себя добавлю — тяжело в учении легко в бою, по началу для меня вим казался чем-то ужасно сложным и нагроможденным, постоянно чего-то хотел, не давал просто вводить текст =)
сейчас — я просто не могу набирать текст где-то в блокноте и тп. Даже почту отсылаю через вим.

ps незаметно для всех хочу подблагодорить человека кто в первый познакомил меня linux'oм и с vim'ом, можно сказать благодоря ему родилась эта статья, thank you Roman Romanchuck, к сожелению давно с тобой не общался
pss просьба — не пинайте сильно, плохо пишу, но стараюсь!!
Tags:
Hubs:
+74
Comments 114
Comments Comments 114

Articles