114

"Никогда не используйте клавиши со стрелками в Vim!"

Я слышал это от случайного оратора, но у меня не было возможности спросить его, почему. Кроме того, если вы не используете клавиши со стрелками, как вы можете переместить курсор в режиме вставки ?

14 ответов14

169

Использование клавиш со стрелками считается плохой привычкой, потому что если вы используете клавиши со стрелками, вы, вероятно, упускаете многие из приятных функций vim.

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

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

Существует мнение, что если вы используете клавиши со стрелками, вы используете vim "неправильно". Правда в том, что у vim действительно крутая кривая обучения, поэтому, пока вы учитесь, делайте все, что вам хочется. Когда я впервые начал использовать vim, я делал все "неправильно", и у меня не было никаких проблем, чтобы избавиться от привычек, как только я узнал больше команд vim.

Например, когда я только начинал, скажем, что я хотел изменить текст в кавычках:

String mystring = "I want to change this";

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

Гораздо лучший способ - поместить курсор в любое место строки (обычный режим), а затем нажать c i ". Это change in " . Он удалит все между кавычками и переведет вас в режим вставки, чтобы я мог ввести новый текст.

91

Ключ Размещение

Короче говоря, Vim использует клавиши hjkl в качестве интерфейса навигации, потому что это остаток старого терминала "ADM-3A", на котором эти клавиши отмечены стрелками.

клавиатура

Поскольку vim является производным от vi , он использует те же ключи hjkl.

Новые привычки

Буквенная замена клавиш со стрелками позволяет перемещаться по тексту, не отрывая рук от стандартной конфигурации ввода. Это, возможно, более эффективно и быстрее, чем перемещать руку, нажимая клавиши со стрелками. Как указано в ссылке № 2 (см. Ресурсы), это еще не все преимущества: VIM имеет множество других ярлыков, к которым вы можете обращаться, не двигая руками.

Ресурсы и режим вставки

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

51

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

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

Большую часть времени они настаивают на использовании hjkl .

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

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

Удар правой стрелки 13 раз неэффективен и скучен. Является ли это , что лучше забивать l ключ 13 раз? Нет, это одинаково глупо.

Удерживание стрелки вправо до достижения цели менее скучно, но подвержено ошибкам и почти так же неэффективно, как 13 попаданий, из-за необходимого и недетерминированного замедления в конце. Является ли это , что лучше держать клавишу нажатой l Нет, конечно нет.

К счастью, большинство GUI-инструментариев предоставляют такие комбинации, как Ctrl+Right которые позволяют нам перемещаться слово за словом или переходить к EOL, к следующему абзацу или как угодно. Эти ярлыки помогают нам перемещаться намного быстрее и разумнее, чем с помощью одной стрелки. У нас то же самое с hjkl? Нет, мы не Мы можем использовать счет, если мы хотим, но кто хочет считать символы для каждого движения? Делать 14k с помощью relativenumber - это здорово, но как насчет горизонтальных движений? Для больших движений hjkl на самом деле хуже, чем модификаторы + стрелки. И угадай что? Большие движения - это то, что нам нужно больше всего.

Но мы счастливчики, наш любимый редактор имеет множество движений, которые вращаются вокруг стрелок и hjkl: bBeEwW/?*#{}() и так далее. Эти команды неизмеримо более мощные, чем hjkl и по большей части гораздо более логичные и интуитивно понятные, если вы привыкли к Ctrl+Right и друзьям.

Переход от <Right><Right><Right><Right><Right><Right><Right><Right><Right> для lllllllll или даже 9l до смешного бессмысленно.

Переключение с <Right><Right><Right><Right><Right><Right><Right><Right><Right> на <C-Right> значительно лучше. Оттуда переключение на w происходит легко и быстро. Не нужно <nop> ваши стрелки!

Если эти команды более полезны, более мощны и интуитивно понятны, чем hjkl , почему, черт возьми, так много блоггеров и комментаторов настаивают на замене стрелок на hjkl?

Я имею. Без понятия.

В заключение, у hjkl есть свое место в нашем инструментальном поясе, потому что мы всегда должны двигаться на 2 символа или строки, но они чаще, чем дерево, скрывающее лес. Остерегайтесь людей, проповедующих против стрел: то, что они приготовили для вас, может быть вовсе не лучше.

16

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

Я думаю, что главная причина (и @Squeezy несколько намекала на это) заключается в том, что еще во времена терминалов, подобных VT100, клавиши со стрелками создавали escape-последовательность, которая интерпретировалась запущенной программой. (Так как клавиши со стрелками не представлены в ASCII, набор клавиш со стрелками должен передаваться каким-то "особым" способом.) Последовательность побега обычно была чем-то вроде

ESC [ A

в зависимости от свойств вашего терминала, вашего соединения и режима курсора. Если ваша оболочка или ваша программа не были правильно сконфигурированы для терминала, они не воспримут escape-последовательность как клавишу со стрелкой.

Когда я учился в колледже, входя в Ultrix через терминалы VT100, если я нажал стрелку в режиме vi в режиме вставки, ESC будет интерпретироваться как "выйти из режима вставки", а затем следующие [ A были интерпретированы как нормальные Команды Очевидно, не то, что пользователь хочет или ожидает!

В настоящее время обработка терминалов и клавиш со стрелками представляется более надежной, особенно в средах с графическим интерфейсом. Но те же проблемы все еще возникают при использовании vim через SSH или Telnet.

14

Использование клавиш со стрелками не одобряется, потому что это заставляет вас убирать пальцы с homerow при использовании раскладки QWERTY и с панели символов (?) при использовании Дворжака или любого другого макета.

10

Клавиши со стрелками показывают проблему - это было уже известно в vi - при медленных соединениях, как при модеме 1200 бод. Стрелка переводит в последовательность ESC, как ESC a . Теперь, когда время между ESC и a становится слишком длинным, вы в конечном итоге слышите BEL (или видите вспышку) с последующим режимом добавления. Это не будет появляться с ключами hjkl .

5
  • клавиши со стрелками могут не работать в определенных условиях. hjkl - нормальные символы и хорошо поняты всеми терминалами.
  • Вы не перемещаете курсор в режиме вставки (за исключением Backspace и исправления короткой опечатки), идея vi состоит в том, чтобы войти в режим вставки только для ввода чего-либо. Движение выполняется в обычном режиме
  • Если вы можете, вы должны избегать использования hjkl для перемещения везде, где это применимо, и вместо этого используйте их только для указаний. Существует множество вариантов перехода в vi, см. Http://vim.wikia.com/wiki/Moving_around.
5

По второму вопросу:

[I] Если вы не используете клавиши со стрелками, как вы можете перемещать курсор в режиме вставки?

Для того, кто является хозяином, и, следовательно, кто презирает клавиши со стрелками, концепция "моды" также не существует.

Мастер добавляет новый текст , используя не режим вставки, а скорее полные команды вставки или замены , которые начинаются с кода операции , такие как i o или cw , что сопровождается текстом полезной нагрузки, и заканчивали ESC Команды имеют синтаксис, и поэтому машина принимает состояния, принимая синтаксис команд, но в основной модели редактора они не создают режим. То, что ученики наивно называют "режимом", для мастера является незавершенным командным состоянием, самой отвратительной ситуацией, которую мастер избегает.

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

Кроме того, поскольку мастер редко отвлекается таким образом, чтобы оставить команду незавершенной, мастер редко, если вообще когда-либо, заставляет редактор издавать звуковой сигнал из-за ввода избыточного ESC выданного "на всякий случай".

(Однако, когда сеть отстает или машина перегружена, мастер нажимает на клавишу ESC яростно и многократно, как и все остальные.)

3

если вы не используете клавиши со стрелками, как вы можете переместить курсор в режиме вставки?

Основная причина, по которой я отговариваю людей от использования клавиш со стрелками, заключается в том, что они явно позволяют перемещаться в режиме вставки.

Одна из самых странных проблем с изучением vim для новичков состоит в том, что команда отмены vim работает, отменяя последнее действие, а не последнее нажатие клавиши. Многие из моих друзей все время остаются в режиме вставки, потому что нет причины выходить из него. Когда меня спрашивают: «Как мне отменить?«Я отвечаю" нажми букву u из командного режима ", они расстраиваются, когда vim удаляет весь файл.

«Vim - довольно бесполезный текстовый редактор, если он не может ничего исправить».

Трудно использовать инструмент, пока вы не узнали, как.

Vim становится полезным только после того, как вы научитесь его использовать. Сила vim заключается в том, как вы можете сказать ему "сделать это снова" или "отменить это" или «сделать это только тогда, когда я нажму эту макро-горячую клавишу» через подсознательную мышечную память. Если "эта вещь" становится "печатать весь файл от начала до конца", я согласен, vim не так уж полезен.

По этой причине вам следует вводить текст только в insert mode . Уклонение от клавиш со стрелками - это только один способ помочь вам стать лучшим пользователем vim, быстрее.

3

Да, по многим причинам, упомянутым выше, vi изначально был написан для использования hjkl , но « никогда » - довольно большое утверждение.

Я склонен модифицировать vim (и другие инструменты, которые я использую), чтобы вести себя так, как я хочу. Это прекрасно работает на моей машине, но как разработчик встраиваемых систем, я не всегда могу выбрать то, что находится на машинах, которые я поддерживаю. Я сталкиваюсь с более старыми машинами, у которых есть только навигация hjkl в vi . Я заканчиваю тем, что получаю контрольные коды, вставленные в мой файл на секунду или две, пока я не нарушу привычку и не переключусь на hjkl .

Единственная веская причина, по которой я могу придумать, - никогда не использовать клавиши со стрелками в Vim!"так что вы можете использовать машины, которые не могут обрабатывать клавиши со стрелками. Это похоже на довольно тонкую причину, чтобы сказать « никогда ».

0

просто напишите следующую команду перед тем, как писать в vim:-

  1. ESC
  2. : установить NOCP

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

0

Вот мои 2 ¢.

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

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

Еще одна вещь, на которую следует обратить внимание, это то, что клавиши со стрелками могут работать не так, как ожидалось. Я использовал терминалы, где они не работали. Я не уверен точно, как они реализованы в Vim, но я уверен, что он не одинаков. Моя пятнистая память даже напоминает одну реализацию, в которой они были реализованы как макросы vim.

0

Название игры с улучшенными текстовыми редакторами, кажется, "движется в спешке" и уменьшает потерянное / повторяющееся движение. Существует некоторое время , потерянное при переходе от буквенных клавиш на клавиши со стрелками ( в зависимости от размеров клавиатуры) , а затем обратно к дому подряд. Но если вы сможете добраться до клавиши ESC левой рукой, то переключение режимов мизинца или безымянного пальца станет одним плавным движением, и в течение сеанса редактирования будет увеличение скорости.

И это ключ ко второй части вашего вопроса: выйдите из режима вставки, нажав ESC левой и двигайтесь с помощью hjkl правой. В конце концов вы сможете сделать это, не пропуская ни секунды.

Тем не менее, я ничего не получил с Vim, пока не попробовал некоторые из вещей, упомянутых здесь, наиболее важным из которых является раздел « Получить эффективные: сочетания клавиш »

0

Запуск vim на моем Android-устройстве, на котором запущен демон ssh в kbox, заставил меня выйти из зоны комфорта. Поскольку эмулятор терминала Android на устройстве использует кнопки громкости для замены специальных комбинаций клавиш (Ctrl + что угодно), некоторые клавиши, которые я обычно использую на клавиатуре, не работают в этой ситуации.

Например, клавиша Insert не работает в этой среде, поэтому я использую I для переключения в режим вставки. Клавиша Esc, которую я обычно использую для выхода из режима вставки, также не работает, поэтому вместо нее я использую ctrl + [ . Клавиши Home и End не работают, как я привык. Вместо этого я полагаюсь на сочетания клавиш 0 и $ с которыми раньше никогда не сталкивался, чтобы достичь начала или конца строки.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .