Почему клавиши со стрелками не рекомендуются в Vim

125

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

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

Yoland Yan
источник
6
Исторические ответы на этот вопрос интересны. Религиозный епископ меньше.
Исаак Рабинович
5
Хороший вопрос. Это всегда вызывает у меня беспокойство по поводу vi [m], поскольку пользователь клавиатуры Dvorak это действительно отстой!
Вим
32
Я помню, как много лет назад, когда я впервые использовал vi, старший коллега советовал мне: «Убедитесь, что вы научились использовать клавиши h, j, k и l, потому что однажды вы окажетесь на компьютере на клиентском сайте, где стрелка ключи не работают, и вы будете выглядеть как полноценная голова d ***, если не можете даже работать vi. "
Эргвун
1
В режиме вставки вы все еще можете переместить курсор, используя Ctrl-O, затем команду нормального режима, и он вернется в режим вставки. Также проверьте CTRL-G CTRL-J и CTRL-G CTRL-K, которые переместят курсор на следующую и предыдущую строку в столбце, который вы начали вставлять.
Бенуа
1
За эти годы у меня появилось множество вредных привычек. Я думаю, что мне нужно использовать это по очень медленной связи, чтобы заставить меня использовать лучшие привычки.
aidan

Ответы:

172

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

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

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

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

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

String mystring = "I want to change this";

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

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

декан
источник
4
@ ot-- ci<и ci)работать так же, и вам не нужно перемещать руку с клавиатуры на мышь. Если вы хотите перейти к началу скобок, а затем изменить содержание f(ci(работает.
Мэтью Финлей
6
«поместите курсор в любое место строки» - и снова, тогда как в режиме вставки вы будете использовать стрелки, чтобы попасть туда, в обычном режиме вы можете сделать это /wantи нажать клавишу ввода, чтобы получить слово «хочу», а затем сделать ci".
Натан Лонг
8
Эй, это аккуратно! Какой быстрый и мощный способ перемещения курсора. Единственный способ улучшить его - это каким-то образом волшебным образом указать, где вы хотели курсор, и просто прыгнуть туда. Может быть, мы можем что-то придумать. Я думаю, что мы должны назвать это "мышью".
Мэтью Скотен,
18
@ MatthewScouten Никто не утверждает, что vim проще, чем мышь. Однако, немного потренировавшись, все намного быстрее. Использование мыши похоже на наведение и хрюканье, чтобы донести свою точку зрения. Vim позволяет вам говорить полными предложениями.
Дин
4
Отказ от привычек - прекрасный ответ, но насильственное препятствование нормальной деятельности - это фашист. Хуже того, удобство использования ( hjkl): сопоставление upи down2 клавиши, которые неотличимы по вертикали друг от друга, не говоря уже о левой и правой клавишах ... это трагическая демонстрация идеологически ослепленного высокомерия.
Новая Александрия
93

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

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

клавиатура

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

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

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

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

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

Кристиан Стюарт
источник
2
Не говоря уже о том, что клавиши hjkl намного эффективнее, чем переводить руки на клавиши со стрелками.
sixtyfootersdude
2
Это не отвечает на вопрос, а только объясняет, почему выбран hjkl .
Мацеманн
3
Это правдивая и интересная история, но ОП спрашивает, как вы перемещаете курсор в режиме вставки . hjklне работает в режиме вставки, так как это ответ на вопрос?
LarsH
3
@Kruug, первая часть вопроса - почему кто-то сказал никогда не использовать клавиши со стрелками в vim. Тот факт, что вы можете использовать hjklв vim, не говорит, почему кто-то никогда не должен использовать клавиши со стрелками, так же как тот факт, что я могу ездить на велосипеде на работу, не объясняет, почему кто-то сказал бы мне никогда не бегать.
LarsH
1
Теперь я понимаю, почему Vim использует escape для выхода из режима вставки ^^ Классная картинка!
Этьенн
56

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

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

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

romainl
источник
Сначала я подумал, что вы собираетесь сказать, что «hjkl» бесполезны, но хороший улов, движения слова / абзаца / предложения гораздо полезнее, чем мантра относительно движения одного символа.
Ксавье Т.
1
Благодарю. У меня была похожая дискуссия о HN на днях, которая сошла с рельсов из-за плохой формулировки. Сосредоточение своих усилий на hjkl это бесполезно , но и hjklполезны.
Ромен
5
То же самое и здесь: в конце концов, мне понравился твой ответ, но я думаю, что тон выглядел как излишне разглагольствовавший / троллинг / пылающий.
UncleZeiv
Не называйте их бесполезными, аргумент о скорости хорош, и способ, которым HJKL работает с другими командами VIM так, как это делают клавиши со стрелками, также важен.
Aviator45003
@TC Какие-нибудь примеры, чтобы сделать дискуссию более интересной?
romainl
18

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

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

ESC [ A

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

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

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

оборота LarsH
источник
14

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

pdoherty926
источник
4
Ух ты. Шутки в сторону? Я не хочу в это верить, поскольку это будет означать, что люди, создавшие Vim, будут думать, что их пользователи тратят больше времени на печатание, чем на размышления.
Ренан
13
Почему движение руки подразумевает мышление?
EBGreen
8
ну, когда я должен был сделать это в школе, тебе пришлось нажать esc, прежде чем ты смог использовать навигацию hjkl, так что ты уже убрал левую руку от домашнего ряда, чтобы доставить мизинец к Esc. Я вспоминаю, что для возврата на один пробел и вставки символа вам нужно было ввести «Esc: hi», а затем ввести символ, который вы хотите вставить. это не так полезно.
Фрэнк Томас
1
@Renan - вы предполагаете, что «печатать» означает «вставлять текст». У меня тоже есть пальцы на домашнем ряду, когда я читаю и размышляю, потому что клавиатура - это то, как я перемещаюсь в Vim: поиск для перемещения, открытие других файлов для сравнения кода, прыжки вокруг для исправления орфографических ошибок и т. Д.
Натан Long
2
@Renan - 1) вы недооцениваете экономию и 2) мелочи складываются. Я видел, как опытные пользователи Vim с сенсорным набором текста редактируют со скоростью, в 10 раз превышающей скорость других разработчиков. На достаточной скорости редактирование становится автоматическим и не прерывает мысли или поток. Работать так приятно, так что моя лодка действительно плавает, но я бы поспорил, что это намного больше, чем вы думаете. Попробуйте в качестве примера посмотреть на таких кодеров, как Гари Бернхардт.
Натан Лонг
10

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

ott--
источник
Я думаю, ESC [ Aэто то, что вы имеете в виду?
LarsH
2
ESC [ Aстрелка - терминал DEC VT-100 (терминал ANSI был сильно производным от терминала DEC VT-100). IIRC, ESC Aбыл стрелкой ADM-3A или, возможно, стрелкой DEC VT-52. Точка остается той же самой, однако ESCсимвол, отправленный как часть клавиши со стрелкой, был легко перепутан с ESCнапечатанным вручную.
RBerteig
@RBerteig: Полезно знать.
LarsH
5

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

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

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

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

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

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

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

Kaz
источник
2
Помните, что если viввод команды вставки является режимом, то, если честно, мы должны определить все такие режимы в других редакторах и назвать их модальными. Например, когда мы нажимаем Ctrl-X в Emacs, мы находимся в «режиме», в котором, например, можно нажать Ctrl-S, чтобы сохранить документ, который не будет работать вне этого «режима».
Каз
5
  • клавиши со стрелками могут не работать в определенных условиях. hjkl - нормальные символы и хорошо поняты всеми терминалами.
  • Вы не перемещаете курсор в режиме вставки (за исключением Backspace и исправления короткой опечатки), идея vi заключается в том, чтобы войти в режим вставки только для ввода чего-либо. Движение выполняется в обычном режиме
  • Если вы можете, вы должны избегать использования hjkl для перемещения везде, где это применимо, и вместо этого используйте их только для указаний. Существует множество вариантов перехода в vi , см. Http://vim.wikia.com/wiki/Moving_around.
Squeezy
источник
На самом деле вы можете переместить курсор в режиме вставки, по крайней мере, влево, используя клавишу Backspace. Но я согласен, что вы не можете двигаться свободно.
LarsH
Я пытался выразить, что вы вообще не хотите перемещать курсор в режиме вставки .
Squeezy
Извините, я неправильно понял, что вы написали, что вы не можете перемещать курсор в режиме вставки. На самом деле я хочу переместить курсор в режиме вставки: если я ввожу какой-то новый текст и нажимаю не ту клавишу, я хочу использовать клавишу Backspace для ее исправления. Но помимо этого ограниченного использования, я согласен.
LarsH
3

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

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

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

kmort
источник
3

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

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

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

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

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

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

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

Conrad.Dean
источник
0

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

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

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

iyrin
источник
0

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

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

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

0decimal0
источник
ну, это было бы полезно, если вы хотите использовать клавишу со стрелкой в ​​режиме вставки
0decimal0
0

Вот мои 2 ¢.

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

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

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

Дэвид Э.
источник
0

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

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

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

Виджей Эдвин
источник