Перемещение по одной строчке
Если вам нужно перепрыгнуть больше пары строк, то перемещение по одной строке клавишами
j
или k
неэффективно. В Vim существует много способов перемещения по вертикали. Я считаю, что два наиболее полезных — прыжок по параграфам и по экранам. Это зависит от того, как далеко и как точно вам нужно двигаться.{
— Перейти к началу предыдущего абзаца или блока кода.
}
— Перейти в конец следующего абзаца или блока кода.
Ctrl+F
— Перейти вперёд на один экран.
Ctrl+B
— Перейти назад на один экран.
Если вы точно знаете, куда нужно переместиться, то можно использовать навигацию через поиск: поиск вперёд клавишей
/
, а назад — ?
.Также всегда полезно вернуться на предыдущее место, что достаточно легко сделать двумя кавычками или
gi
: возврат к последнему месту, где вы вводили текст. Если хотите, можно даже перемещаться между всеми местами, где вводился текст, с помощью g;
и g,
.Перемещение по одному символу
Точно также и перемещение по одному символу клавишами
h
и l
часто является пустой тратой времени, когда у нас есть t
и f
:t<char>
— Переместиться вперёд до следующего появления символа.
f<char>
— Переместиться вперёд за следующее вхождение символа.
T<char>
— Переместиться назад до предыдущего вхождения символа.
F<char>
— Переместиться назад за предыдущее вхождение символа.
Перемещение по словам клавишами
w
, W
, b
, B
, e
и E
тоже лучше. И здесь полезна навигация с поиском, и не забывайте, что вы можете копировать, удалять и изменять текст вперёд или назад к результату поиска:y/search<Enter>
y?search<Enter>
d/search<Enter>
d?search<Enter>
c/search<Enter>
c?search<Enter>
Поиск слова под курсором
Не утруждайте себя набором слова или копированием/вставкой, просто нажмите
*
или #
. Поразительно, насколько быстрее становится работа, когда освоишь эти горячие клавиши.Удаление и вставка
Нет необходимости удалять текст с целью его замены, перейдя в режим вставки:
d2wi
Быстрее и аккуратнее использовать изменения клавишу
c
:c2w
Так вся операция становится повторяемой с помощью точки (
.
).Использование клавиш со стрелками
Vim позволяет использовать клавиши со стрелками для перемещения в нормальном режиме и в режиме вставки, но если вы привыкли использовать для навигации
hjkl
, то стрелки уже кажутся какими-то неуклюжими, потому что в течение всей сессии Vim пальцы находятся в центре клавиатуры, что удобно для слепой печати. Аналогично и клавиши Home и End: хотя они работают как в большинстве редакторов, но нет особой причины их использовать, когда ближе эквиваленты ^
и $
.Таким образом, целесообразно отучить себя от клавиш со стрелками, отключив их хотя бы временно:
noremap <Up> <nop>
noremap <Down> <nop>
noremap <Left> <nop>
noremap <Right> <nop>
Слепая печать центральными клавишами не только даёт преимущество скорости, но и позволяет лучше себя чувствовать, потому что запястья отдыхают перед клавиатурой и не перемещаются слишком далеко, а некоторых людям это даже помогает уберечься от туннельного синдрома.
Перемещение в режиме вставки
Дополнительное преимущество слепого набора в центральной строке в том, что вы избавляетесь от привычки перемещаться в режиме вставки: для этого предназначен нормальный режим. Как только нужно куда-то переместиться, вы переходите в нормальный режим и перемещаетесь гораздо более эффективно. Это также помогает сделать операции вставки более атомарными и, следовательно, более удобными для повтора.
Нажатие Esc
Клавиша Escape на современных клавиатурах намного дальше от центрального ряда, чем на клавиатуре Билла Джоя, когда он разрабатывал vi. Обычно нажатие Escape не требуется:
Ctrl+[
намного ближе и удобнее, вы довольно быстро измените свои привычки. Как вариант можно рассмотреть вопрос о сопоставлении в операционной системе на Esc довольно бесполезной клавиши Caps Lock или даже необычных сочетаний, таких как jj
. Хотя это немного радикальное предложение, но хорошо работает для многих людей:inoremap jj <Esc>
Перемещение к началу или концу строки, затем вставка
Просто используйте
I
и A
. К тому же, они делают действие повторяемым для других строк, где может понадобиться такая же операция.Вход в режим вставки, затем создание новой строки
Используйте
o
и O
, чтобы создать новую строку ниже и выше, соответственно, и одновременно войти в режим вставки на ней.Вход в режим вставки для удаления текста
Здесь довольно очевидное противоречие. Вместо этого удалите текст, переместившись в него и используя
d
с соответствующим движением или текстовым объектом. Опять же, такое действие повторяемо и означает, что вы не удерживаете Backspace. Вообще, если вы удерживаете какую-то клавишу в Vim, вероятно, есть более быстрый способ.Повтор команд или поисков
Просто введите
@:
для команды или n/N для поиска; Vim не забывает последний поиск. Если это была не самая последняя команда или поиск, но она точно есть в истории, введите q:
или q/
, найдите её в списке и нажмите Enter.Повторные замены
Введите
&
для повтора на текущей строке последней замены. Можете повторить её на всех строках, набрав g&
.Повторный вызов макросов
Просто введите
@@
.На самом деле это всего лишь несколько распространённых способов, чтобы увеличить скорость и общую эффективность работы с редактором без установки плагинов или существенных переназначений клавиш. См. также вики с советами по Vim, там есть несколько других действительно полезных примеров.
Комментарии (47)
Juralis
28.02.2019 17:37Мне кажется, что тут описаны какие-то совсем тривиальные действия, доступные в любом приличном ide, но только делаются они совершенно контринтуитивно. В принципе, «привычные» сочетания клавиш — тоже всего лишь привычные. Но в чем тут соль? Чего из описанного я не могу сделать в jetbrains? Где преимущество vim?
skymal4ik
28.02.2019 18:18Ну не много где такое же управление как в vim. И да, многие продукты копируют стиль vim.
Его плюс в том, что он, например, есть на каждой Linux машине, и работает в терминале (привет, ssh).
Мне, как инженеру-админу очень удобно например. И код подправить, и конфиг написать.
И грузится он моментально в отличие от ide.Juralis
01.03.2019 01:10Ну, как я понимаю, главным преимуществом вима заявляется скорость. Так-то nano тоже везде есть. И конфигурации править в нем тоже можно. Но никто же через ssh не редактирует код так, чтобы там надо было десятипальцевой печатью пользоваться?
powerman
01.03.2019 03:50Скорость имеет значение, но она точно не главное преимущество. Скорость важна ровно настолько, чтобы не испытывать раздражение от тормозов: быстро работает подсветка синтаксиса, быстро открываются большие файлы, быстро можно попасть в нужное место файла… но всё это отдельные и не очень критичные кусочки общей картины.
А общая картина в том, что vim позволяет легко сделать абсолютно что угодно. Любая сложная операция над текстом выполняется нажатием нескольких кнопок. В результате нет задержки между "решил что-то сделать" и "уже готово", что позволяет работать с текстом вообще не чувствуя препятствия в виде "приложения текстовый редактор" между собой и текстом. Конечно, у этого есть цена, и она довольно высока: нужные кнопки надо знать, vim надо настроить под себя, надо подобрать к нему плагины, изредка эти плагины надо сначала написать. Но если текстовый редактор — это одно из основных приложений, в которых проводится большая часть времени, то оно того стоит.
И вот здесь проявляется принципиальное отличие между большинством редакторов. Vim и Emacs достаточно сложные, чтобы их было возможно настроить под себя и освоить до такой степени, чтобы действительно перестать воспринимать редактор как помеху, чтобы он стал уютным и удобным чудо-инструментом, невероятно облегчающим ежедневные задачи. А все остальные популярные редакторы и близко не обладают такой сложностью и гибкостью, поэтому ими проще начать пользоваться, но уютными они не станут никогда и всегда будут где-то мешать, в большей или меньшей степени — в зависимости от сложности и разнообразия выполняемых с текстом операций.
0xd34df00d
01.03.2019 19:39быстро работает подсветка синтаксиса, быстро открываются большие файлы
В коде на плюсах это сломалось в районе 2011-2012 года.
Не подумайте, я сам любитель вима (вернее, его биндингов).
Vim и Emacs достаточно сложные, чтобы их было возможно настроить под себя и освоить до такой степени, чтобы действительно перестать воспринимать редактор как помеху, чтобы он стал уютным и удобным чудо-инструментом, невероятно облегчающим ежедневные задачи.
Только если начинать делать из них IDE, то они начинают тормозить. Емакс у меня тормозил ну просто сразу, а vim… Ну, hie жрёт по 4-6 гигов на проект, idris-vim начинает лагать на файлах больше пары сотен строк.
Нет счастья.
powerman
01.03.2019 23:57Если не пытаться делать "вообще совсем полноценный IDE", а ограничиться "самое важное и основное от IDE" — то в среднем оно вполне летает и разницы по скорости с vim "из коробки" практически не заметно. Но, да, это сильно зависит от языка, и скорость работы и поддержка IDE-шных фич сильно отличается. Для Go — всё просто супер.
Mor-J
28.02.2019 18:23Дело в том, что это статься не про преимущества вима, статья всего лишь показывает новичкам, чего им стоит остерегаться и к чему приучаться, чтобы стать умельцами этого редактора. Чтобы люди прекратили приходить в вим и использовать его как блокнот, только с hjkl вместо стрелок. А если Вы хотите найти причины, зачем вам стоит на вим перейти, для этого существуют многие другие статьи, хотя лично меня убедили видео, как другие люди со скоростью света редактируют tex, это было невероятно круто. (-:
Juralis
01.03.2019 01:07Большую часть времени я всё же думаю над тем, что написать в коде или в тексте, а не собственно пишу. В этом смысле, не особо понятно, зачем мне редактировать текст быстрее, чем сейчас. По крайней мере, освоение 10-пальцевого метода печати покрыло бы нужду с значительным избытком, но не привязывало бы меня к одному конкретному редактору. К чему все эти «скорости»? Потоковый перегон речи в текст? А для этого точно нужен вим?
powerman
01.03.2019 03:58Суть не в скорости набора текста, а в скорости преобразования мыслей в результат. Мысль "надо переставить этот абзац выше, перед предыдущим" может быть реализована нажатием нескольких кнопок. Равно как и мысль "надо скопировать содержимое этого блока for в вот тот if". Равно как и мысль "надо отсортировать поля в объявлении этой структуры". Равно как и мысль "надо добавить json-теги полям этой структуры". Когда такие преобразования выполняются моментально, то не происходит прерывания процесса обдумывания реальной задачи ради обдумывания последовательности действий, которые надо выполнить в текстовом редакторе, чтобы получить результат, и ожидания пока все эти действия будут выполнены.
nlykl
28.02.2019 21:20Vim для тех, кто владеет слепой десятипальцевой печатью, а также не задумывается при использовании его команд. В таком случае скорость работы с текстом просто умопомрачительная. В JetBrains, как и во многих других популярных программах можно включить эмуляцию Vim.
habr.com/ru/post/307084
Смысл в том, что с vi ваша клавиатура превращается в специализированный геймпад для редактирования текста с практически сотней кнопок, каждая из которых имеет как минимум две функции — с шифтом и без шифта; таким образом, у вас уже под две сотни функций доступных по нажатию одной кнопки (не считая шифта) (прим. пер.: что-то много автор насчитал, можно смело на два делить). Мощные сами по себе команды можно комбинировать друг с другом для получения наилучшего результата. Во время ввода это стандартная клавиатура, но при возврате в командный режим это идеальная машина для редактирования текста
Juralis
01.03.2019 01:13Я регулярно пишу как код, так и тексты. Довольно много. И даже десятипальцевый метод ввода для меня избыточен, так как большую часть времени всё же думаю. Мне не понятна область применения программы. Хорошо, конечно, что и такое есть, но выглядит это чем-то из прошлого века без видимых преимуществ.
nlykl
01.03.2019 02:26Даже если не нужна высокая скорость, десятипальцевый метод гораздо лучше, так как не нужно напрягать глаза и кивать головой. Процесс обучения нудный и раздражающий, но если осилите, обычный способ набора будет восприниматься как пытка.
Мне же захотелось пойти дальше, и я начал изучать Vim. Не могу сказать, что владею им в совершенстве, но уже сейчас при работе в других редакторах чувствую себя связанным по рукам и ногам. Редактором дело не ограничилось, и я перевел на аналогичное управление браузер, IDE и для программу для просмотра PDF и djvu.
powerman
01.03.2019 04:00Суть не в том, что десятью пальцами текст набирается быстрее. Суть в том, что при этом учишься слепому набору. А слепой набор позволяет преобразовывать мысли в текст не отвлекаясь на рассматривание клавиатуры и постоянное переключение внимания между клавиатурой, экраном и мыслями.
andreylartsev
01.03.2019 19:49«Преимущество Vim» в статье не перечислены ) На мой вкус они следующие:
— это редактор который работает в текстовой консоли через ssh)
— Им действительно можно пользоваться когда у вас плохая связь с удаленным узлом где вы пытаетесь поправить конфигурационный файлик или посмотреть логи) все вот эти странные команды: типа перейти на 5 слов вперёд или на четыре строки вниз — помогают )
— VIMом можно открыть на редактирование текстовый файлик размером 1Gb )
… откровенно говоря не знаю чем ещё можно.
Конечно команды VIM это суровое легаси, но просто дизайн и идеология в нем от VI который в свою очередь задумывался во времена зелёных терминалов и тогда видеть на экране текст который ты редактируешь это было высшим достижением человеческой мысли)
Тогда VI конкурировал по юзаблити с перфокартами)powerman
02.03.2019 00:03Насчёт "суровое легаси" я не уверен. Я вчера спросил жену, зачем она много лет назад поставила под виндой Vim… я ожидал услышать про какие-то киллер-фичи Vim по сравнению с виндовыми редакторами, но ответ был неожиданным: "мне надоело постоянно набирать :wq при попытке выйти из Блокнота". :) Суть в том, что это "суровое легаси", как ни странно, достаточно мнемонично и въедается в мышечную память, и в результате это не столько легаси, сколько вполне актуальный и эффективный в наши дни способ управления редактором.
Cheater
28.02.2019 18:06+1Вместо этого удалите текст, переместившись в него и используя d с соответствующим движением
Кстати ИМХО использовать операции с движениями не всегда лучше, чем лупить по одной и той же клавише. У повторного нажатия клавиши огромное преимущество — 0 ментального усилия, не нужно думать, какой текстовый объект скормить команде. С этой точки зрения jjjjj, как ни странно, лучше чем 5j. Парадокс — при маленьких перемещениях вверх-вниз удобнее повторно жать j, чем использовать префикс, а при больших перемещениях не знаешь префикс — тоже приходится искать более удобную альтернативу, например поиск.
Примерно то же с удалением — при правке небольшого неструктурированного куска порой приятнее x/X, чем d с аргументом.questor
28.02.2019 18:16вот тоже иногда думаю, что 5j надо ещё подумать, на сколько j сместиться… но так и не пришёл к какому-то однозначному выводу: то так попробую, то эдак… как в том анекдоте про мешающую спать бороду не могу выбрать что лучше.
powerman
28.02.2019 18:27Согласен, но есть нюанс: при работе на удалённом сервере и в условиях диких тормозов (либо из-за сети, либо из-за гигантского loadavg на сервере) промахи из-за лишнего нажатия обходятся слишком дорого (по времени), но зато очень легко посчитать на сколько строк/символов надо сместиться/удалить/заменить и использовать префикс для точной и быстрой навигации.
Mor-J
28.02.2019 18:28Мне кажется, это значит, что вы ещё не привыкли к виму. (-: Однажды я открыл его и понял, что текстовые объекты и движения стали моим способом мыслить о строчках и буквах передо мною: когда я вижу интересующий меня объект, я вижу его как слово, СЛОВО, строку или text-object, а например думать про движения в рамках 5j помогает опция 'relativenumber'.
sigprof
28.02.2019 18:39В случае с Vim есть ещё вариант «войти в визуальный режим (
v
/V
/^V
), выделить нужный текст, выполнить операцию» — с одной стороны, это позволяет перед выполнением операции убедиться в том, что выделено именно то, что нужно, с другой стороны, в случае, если для выделения достаточно одной команды движения, это значит, что нажатиеv
было лишним. Хотя привычка использоватьv
иV
мешает, если приходится редактировать что-то в среде, где полноценный Vim недоступен, а есть только базовый vi.
powerman
28.02.2019 18:22Я vim использую уже лет 20 примерно, но никогда не понимал ни тяги к
hjkl
, ни смысла отказываться от навигации стрелками в режиме вставки. Более того, я ещё и на Ctrl/Alt/Shift-стрелки навесил разные полезняшки.
И не надо рассказывать, как это замедляет работу — нажать
Up
из режима вставки точно не медленнее, даже с учётом перемещения кисти на стрелки и обратно, чемEsc
,k
,i
. Более того, обычно смысл выходить из режима вставки для навигации объясняется тем, что просмотр текста и внесение изменений — это разные задачи. Это правда, и именно поэтому перенос руки на стрелки и обратно при переключении между этими задачами работает ничуть не хуже (а как по мне — даже лучше), чемEsc
иi
. Плюс когда рука на стрелках то легко доступны дополнительные кнопки навигацииPgUp
,Home
, etc. плюс комбинации с Ctrl/Alt/Shift — и хотя по возможностям это далеко от того, что может вытворять vim в командном режиме, но в 99% случаев этого более чем достаточно.
Плюс к этому есть и другие причины, по которым перемещение руки на стрелки не является проблемой: при работе в браузере (например, написании этого комментария) и других приложениях (мессенджерах, etc.) всё-равно приходится пользоваться стрелками (поэтому проще использовать один подход везде), при программировании большую часть времени мы читаем код и думаем, а не быстро редактируем текст, так что постоянно держать обе руки в середине клавиатуры большую часть времени бессмысленно и неудобно.
deniss-s
28.02.2019 21:19Может кто-нибудь знает какой-нибудь plugin или имеет готовый remap чтобы при смене раскладки команды работали. Например чтобы клавиши
ролд
работали какhjkl
.artemisia_borealis
28.02.2019 22:08попробуйте
set langmap =йцукенгшщзхъ;qwertyuiop[]
(таких пар строк может быть несколько)
set langmap+=ЙЦУКЕНГШЩЗХЪ;QWERTYUIOP{}
И вообще покурите langmap.
(но у меня замечание есть: не удаётся сделать langmap для 'б' и 'Ю')
funca
28.02.2019 22:54В VSCode классная эмуляция Vim. С ним проблема выбора: IDE или нормальный редактор — наконец-то отпала.
arheops
01.03.2019 13:59Если вам чтото надо повторить много раз, логичнее использовать регекспы.
Вообще непонятно почему выход-вход в режим редактирования быстрее передвижения руки на стрелку.
Комуто удобнее так, кому то этак.
ferzisdis
01.03.2019 16:43По своему опыту работы с vim (точнее эмуляцией vim на VisualStudio), постоянно сталкиваюсь с одной очень неудобной ситуацией: когда нужно скопировать один кусок текста и вставить с заменой в нескольких местах. После первой вставки с заменой, в буфер помещается заменяемый текст, поэтому приходится повторно копировать кусок. Выглядит это примерно следующим образом: yaw (скопировал) vaw(выделил другое слово) p(вставил) yaw(копирую заново в буфер) и т.д. Я знаю, что есть специальная команда вроде «0p, которая выполняет вставку из определенного буфера, однако само сочетание „0p набирать не очень удобно.
Интересно, с какими неудобствами сталкивались Вы и как их преодолели?
P.S: Почему автор в статье не обратил внимание на одну из важнейших команд — .(точка), которая повторяет предыдущее действие.Cheater
01.03.2019 17:12Макрос? Запишите действия по замене слова, затем повторите через @@. При необходимости перезабейте @@ на более удобную.
nexmean
02.03.2019 17:40Можно загнать текст в нестандартный буфер (
"ayy
например) и вставлять от туда. Так заменяемый текст не будет затирать вставляемый.
Veliant
Не ошибка ли?
Это одна и та же клавиша.
Talkerbox
и как вы тогда набираете их в тексте?
Veliant
С Shift'ом же. Только тогда это будет обозначаться комбинацией Shift+/
sigprof
Это верно далеко не для всех раскладок клавиатуры (в том числе и для языков на базе латиницы — см., например, множество национальных вариантов QWERTY, а ведь есть ещё вариации QWERTZ и AZERTY).
nlykl
В русской раскладке нет.