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

Перемещение по одной строчке


Если вам нужно перепрыгнуть больше пары строк, то перемещение по одной строке клавишами 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)


  1. Veliant
    28.02.2019 17:08

    Не ошибка ли?

    поиск вперёд клавишей /, а назад — ?

    Это одна и та же клавиша.


    1. Talkerbox
      28.02.2019 17:18
      +1

      и как вы тогда набираете их в тексте?


      1. Veliant
        28.02.2019 18:30

        С Shift'ом же. Только тогда это будет обозначаться комбинацией Shift+/


        1. sigprof
          28.02.2019 18:44

          Это верно далеко не для всех раскладок клавиатуры (в том числе и для языков на базе латиницы — см., например, множество национальных вариантов QWERTY, а ведь есть ещё вариации QWERTZ и AZERTY).


    1. nlykl
      28.02.2019 21:02

      В русской раскладке нет.


  1. alexesDev
    28.02.2019 17:32

    Вместо Esc есть ctrl+c


    1. Alukardd
      28.02.2019 23:45

      Это не равнозначные команды.


  1. Juralis
    28.02.2019 17:37

    Мне кажется, что тут описаны какие-то совсем тривиальные действия, доступные в любом приличном ide, но только делаются они совершенно контринтуитивно. В принципе, «привычные» сочетания клавиш — тоже всего лишь привычные. Но в чем тут соль? Чего из описанного я не могу сделать в jetbrains? Где преимущество vim?


    1. skymal4ik
      28.02.2019 18:18

      Ну не много где такое же управление как в vim. И да, многие продукты копируют стиль vim.

      Его плюс в том, что он, например, есть на каждой Linux машине, и работает в терминале (привет, ssh).
      Мне, как инженеру-админу очень удобно например. И код подправить, и конфиг написать.

      И грузится он моментально в отличие от ide.


      1. Juralis
        01.03.2019 01:10

        Ну, как я понимаю, главным преимуществом вима заявляется скорость. Так-то nano тоже везде есть. И конфигурации править в нем тоже можно. Но никто же через ssh не редактирует код так, чтобы там надо было десятипальцевой печатью пользоваться?


        1. powerman
          01.03.2019 03:50

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


          А общая картина в том, что vim позволяет легко сделать абсолютно что угодно. Любая сложная операция над текстом выполняется нажатием нескольких кнопок. В результате нет задержки между "решил что-то сделать" и "уже готово", что позволяет работать с текстом вообще не чувствуя препятствия в виде "приложения текстовый редактор" между собой и текстом. Конечно, у этого есть цена, и она довольно высока: нужные кнопки надо знать, vim надо настроить под себя, надо подобрать к нему плагины, изредка эти плагины надо сначала написать. Но если текстовый редактор — это одно из основных приложений, в которых проводится большая часть времени, то оно того стоит.


          И вот здесь проявляется принципиальное отличие между большинством редакторов. Vim и Emacs достаточно сложные, чтобы их было возможно настроить под себя и освоить до такой степени, чтобы действительно перестать воспринимать редактор как помеху, чтобы он стал уютным и удобным чудо-инструментом, невероятно облегчающим ежедневные задачи. А все остальные популярные редакторы и близко не обладают такой сложностью и гибкостью, поэтому ими проще начать пользоваться, но уютными они не станут никогда и всегда будут где-то мешать, в большей или меньшей степени — в зависимости от сложности и разнообразия выполняемых с текстом операций.


          1. 0xd34df00d
            01.03.2019 19:39

            быстро работает подсветка синтаксиса, быстро открываются большие файлы

            В коде на плюсах это сломалось в районе 2011-2012 года.


            Не подумайте, я сам любитель вима (вернее, его биндингов).


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

            Только если начинать делать из них IDE, то они начинают тормозить. Емакс у меня тормозил ну просто сразу, а vim… Ну, hie жрёт по 4-6 гигов на проект, idris-vim начинает лагать на файлах больше пары сотен строк.


            Нет счастья.


            1. powerman
              01.03.2019 23:57

              Если не пытаться делать "вообще совсем полноценный IDE", а ограничиться "самое важное и основное от IDE" — то в среднем оно вполне летает и разницы по скорости с vim "из коробки" практически не заметно. Но, да, это сильно зависит от языка, и скорость работы и поддержка IDE-шных фич сильно отличается. Для Go — всё просто супер.


        1. wolandtel
          01.03.2019 06:31

          В смысле, никто не редактирует?


    1. Mor-J
      28.02.2019 18:23

      Дело в том, что это статься не про преимущества вима, статья всего лишь показывает новичкам, чего им стоит остерегаться и к чему приучаться, чтобы стать умельцами этого редактора. Чтобы люди прекратили приходить в вим и использовать его как блокнот, только с hjkl вместо стрелок. А если Вы хотите найти причины, зачем вам стоит на вим перейти, для этого существуют многие другие статьи, хотя лично меня убедили видео, как другие люди со скоростью света редактируют tex, это было невероятно круто. (-:


      1. n0dwis
        28.02.2019 20:45

        Ссылочку на видео не дадите?


      1. Juralis
        01.03.2019 01:07

        Большую часть времени я всё же думаю над тем, что написать в коде или в тексте, а не собственно пишу. В этом смысле, не особо понятно, зачем мне редактировать текст быстрее, чем сейчас. По крайней мере, освоение 10-пальцевого метода печати покрыло бы нужду с значительным избытком, но не привязывало бы меня к одному конкретному редактору. К чему все эти «скорости»? Потоковый перегон речи в текст? А для этого точно нужен вим?


        1. powerman
          01.03.2019 03:58

          Суть не в скорости набора текста, а в скорости преобразования мыслей в результат. Мысль "надо переставить этот абзац выше, перед предыдущим" может быть реализована нажатием нескольких кнопок. Равно как и мысль "надо скопировать содержимое этого блока for в вот тот if". Равно как и мысль "надо отсортировать поля в объявлении этой структуры". Равно как и мысль "надо добавить json-теги полям этой структуры". Когда такие преобразования выполняются моментально, то не происходит прерывания процесса обдумывания реальной задачи ради обдумывания последовательности действий, которые надо выполнить в текстовом редакторе, чтобы получить результат, и ожидания пока все эти действия будут выполнены.


          1. Juralis
            01.03.2019 04:33

            Быстро сделал пару мелких правок, а потом всё равно сидишь и думаешь. Куда так торопиться-то?


            1. powerman
              01.03.2019 04:35

              Не "торопиться", а "не отвлекаться".


    1. nlykl
      28.02.2019 21:20

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

      habr.com/ru/post/307084

      Смысл в том, что с vi ваша клавиатура превращается в специализированный геймпад для редактирования текста с практически сотней кнопок, каждая из которых имеет как минимум две функции — с шифтом и без шифта; таким образом, у вас уже под две сотни функций доступных по нажатию одной кнопки (не считая шифта) (прим. пер.: что-то много автор насчитал, можно смело на два делить). Мощные сами по себе команды можно комбинировать друг с другом для получения наилучшего результата. Во время ввода это стандартная клавиатура, но при возврате в командный режим это идеальная машина для редактирования текста


      1. Juralis
        01.03.2019 01:13

        Я регулярно пишу как код, так и тексты. Довольно много. И даже десятипальцевый метод ввода для меня избыточен, так как большую часть времени всё же думаю. Мне не понятна область применения программы. Хорошо, конечно, что и такое есть, но выглядит это чем-то из прошлого века без видимых преимуществ.


        1. nlykl
          01.03.2019 02:26

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

          Мне же захотелось пойти дальше, и я начал изучать Vim. Не могу сказать, что владею им в совершенстве, но уже сейчас при работе в других редакторах чувствую себя связанным по рукам и ногам. Редактором дело не ограничилось, и я перевел на аналогичное управление браузер, IDE и для программу для просмотра PDF и djvu.


        1. powerman
          01.03.2019 04:00

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


    1. andreylartsev
      01.03.2019 19:49

      «Преимущество Vim» в статье не перечислены ) На мой вкус они следующие:
      — это редактор который работает в текстовой консоли через ssh)
      — Им действительно можно пользоваться когда у вас плохая связь с удаленным узлом где вы пытаетесь поправить конфигурационный файлик или посмотреть логи) все вот эти странные команды: типа перейти на 5 слов вперёд или на четыре строки вниз — помогают )
      — VIMом можно открыть на редактирование текстовый файлик размером 1Gb )
      … откровенно говоря не знаю чем ещё можно.
      Конечно команды VIM это суровое легаси, но просто дизайн и идеология в нем от VI который в свою очередь задумывался во времена зелёных терминалов и тогда видеть на экране текст который ты редактируешь это было высшим достижением человеческой мысли)
      Тогда VI конкурировал по юзаблити с перфокартами)


      1. powerman
        02.03.2019 00:03

        Насчёт "суровое легаси" я не уверен. Я вчера спросил жену, зачем она много лет назад поставила под виндой Vim… я ожидал услышать про какие-то киллер-фичи Vim по сравнению с виндовыми редакторами, но ответ был неожиданным: "мне надоело постоянно набирать :wq при попытке выйти из Блокнота". :) Суть в том, что это "суровое легаси", как ни странно, достаточно мнемонично и въедается в мышечную память, и в результате это не столько легаси, сколько вполне актуальный и эффективный в наши дни способ управления редактором.


  1. Cheater
    28.02.2019 18:06
    +1

    Вместо этого удалите текст, переместившись в него и используя d с соответствующим движением

    Кстати ИМХО использовать операции с движениями не всегда лучше, чем лупить по одной и той же клавише. У повторного нажатия клавиши огромное преимущество — 0 ментального усилия, не нужно думать, какой текстовый объект скормить команде. С этой точки зрения jjjjj, как ни странно, лучше чем 5j. Парадокс — при маленьких перемещениях вверх-вниз удобнее повторно жать j, чем использовать префикс, а при больших перемещениях не знаешь префикс — тоже приходится искать более удобную альтернативу, например поиск.

    Примерно то же с удалением — при правке небольшого неструктурированного куска порой приятнее x/X, чем d с аргументом.


    1. questor
      28.02.2019 18:16

      вот тоже иногда думаю, что 5j надо ещё подумать, на сколько j сместиться… но так и не пришёл к какому-то однозначному выводу: то так попробую, то эдак… как в том анекдоте про мешающую спать бороду не могу выбрать что лучше.


      1. nekipelov
        28.02.2019 18:36

        set rnu
        И больше не надо думать, vim покажет номер строки.


        1. Dreyk
          28.02.2019 21:56

          все равно надо отнимать в уме


          1. nlykl
            28.02.2019 22:49

            Зачем? Номер же относительный, от положения курсора.


    1. powerman
      28.02.2019 18:27

      Согласен, но есть нюанс: при работе на удалённом сервере и в условиях диких тормозов (либо из-за сети, либо из-за гигантского loadavg на сервере) промахи из-за лишнего нажатия обходятся слишком дорого (по времени), но зато очень легко посчитать на сколько строк/символов надо сместиться/удалить/заменить и использовать префикс для точной и быстрой навигации.


    1. Mor-J
      28.02.2019 18:28

      Мне кажется, это значит, что вы ещё не привыкли к виму. (-: Однажды я открыл его и понял, что текстовые объекты и движения стали моим способом мыслить о строчках и буквах передо мною: когда я вижу интересующий меня объект, я вижу его как слово, СЛОВО, строку или text-object, а например думать про движения в рамках 5j помогает опция 'relativenumber'.


    1. sigprof
      28.02.2019 18:39

      В случае с Vim есть ещё вариант «войти в визуальный режим (v / V / ^V), выделить нужный текст, выполнить операцию» — с одной стороны, это позволяет перед выполнением операции убедиться в том, что выделено именно то, что нужно, с другой стороны, в случае, если для выделения достаточно одной команды движения, это значит, что нажатие v было лишним. Хотя привычка использовать v и V мешает, если приходится редактировать что-то в среде, где полноценный Vim недоступен, а есть только базовый vi.


  1. 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.) всё-равно приходится пользоваться стрелками (поэтому проще использовать один подход везде), при программировании большую часть времени мы читаем код и думаем, а не быстро редактируем текст, так что постоянно держать обе руки в середине клавиатуры большую часть времени бессмысленно и неудобно.


  1. maslyaev
    28.02.2019 18:31

    Является ли золотая комбинация <Esc>:wq<Enter> антипаттерном vim?


    1. Talkerbox
      28.02.2019 18:46

      ZZ по мне быстрее


    1. Alghazanth
      28.02.2019 19:20

      Вместо неё удобнее использовать :x, кмк.


  1. deniss-s
    28.02.2019 21:19

    Может кто-нибудь знает какой-нибудь plugin или имеет готовый remap чтобы при смене раскладки команды работали. Например чтобы клавиши ролд работали как hjkl.


    1. artemisia_borealis
      28.02.2019 22:08

      попробуйте
      set langmap =йцукенгшщзхъ;qwertyuiop[]
      set langmap+=ЙЦУКЕНГШЩЗХЪ;QWERTYUIOP{}
      (таких пар строк может быть несколько)

      И вообще покурите langmap.
      (но у меня замечание есть: не удаётся сделать langmap для 'б' и 'Ю')


    1. powerman
      28.02.2019 23:55

      Я для этого написал ruscmd, он более продвинутый по сравнению с вышеупомянутым вариантом на langmap.


    1. LennyB
      02.03.2019 13:37

      set keymap=russian-jcukenwin в .vimrc


  1. funca
    28.02.2019 22:54

    В VSCode классная эмуляция Vim. С ним проблема выбора: IDE или нормальный редактор — наконец-то отпала.


  1. arheops
    01.03.2019 13:59

    Если вам чтото надо повторить много раз, логичнее использовать регекспы.

    Вообще непонятно почему выход-вход в режим редактирования быстрее передвижения руки на стрелку.
    Комуто удобнее так, кому то этак.


  1. ferzisdis
    01.03.2019 16:43

    По своему опыту работы с vim (точнее эмуляцией vim на VisualStudio), постоянно сталкиваюсь с одной очень неудобной ситуацией: когда нужно скопировать один кусок текста и вставить с заменой в нескольких местах. После первой вставки с заменой, в буфер помещается заменяемый текст, поэтому приходится повторно копировать кусок. Выглядит это примерно следующим образом: yaw (скопировал) vaw(выделил другое слово) p(вставил) yaw(копирую заново в буфер) и т.д. Я знаю, что есть специальная команда вроде «0p, которая выполняет вставку из определенного буфера, однако само сочетание „0p набирать не очень удобно.
    Интересно, с какими неудобствами сталкивались Вы и как их преодолели?

    P.S: Почему автор в статье не обратил внимание на одну из важнейших команд — .(точка), которая повторяет предыдущее действие.


    1. Cheater
      01.03.2019 17:12

      Макрос? Запишите действия по замене слова, затем повторите через @@. При необходимости перезабейте @@ на более удобную.


    1. nexmean
      02.03.2019 17:40

      Можно загнать текст в нестандартный буфер ("ayy например) и вставлять от туда. Так заменяемый текст не будет затирать вставляемый.