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


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

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


112


Источник


Исторические ответы на этот вопрос интересны. Религиозные диатрибы меньше. - Isaac Rabinovitch
Хороший вопрос. Это всегда меня беспокоит о vi [m], как пользователь клавиатуры Dvorak, это действительно отстой! - wim
Я помню, когда я впервые использовал vi, старший коллега, который советовал мне: «Обязательно изучите использование клавиш h, j, k и l, потому что однажды вы окажетесь на машине на клиентском сайте, где стрелка ключи не работают, и вы будете выглядеть как полная голова d ***, если вы даже не сможете работать с vi ». - Ergwun
В режиме вставки вы можете перемещать курсор, используя Ctrl-O, а затем команду обычного режима, и она вернется в режим вставки. Также проверьте CTRL-G CTRL-J и CTRL-G CTRL-K, который переместит курсор на следующую и предыдущую строку, в колонку, которую вы начали вставлять. - Benoit
На протяжении многих лет я развивал нагрузку на плохие привычки vi. Я думаю, мне нужно использовать его в очень медленной связи, чтобы заставить меня использовать лучшие привычки. - aidan


Ответы:


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

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

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

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

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

String mystring = "I want to change this";

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

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


168



@ ott-- ci< а также ci) работайте также, и вам не нужно перемещать руку с клавиатуры на мышь. Если вы хотите перейти к началу скобок и затем изменить содержимое f(ci( работает. - Matthew Finlay
«поместите курсор в любом месте строки» - и снова, в то время как в режиме вставки вы должны использовать стрелки, чтобы попасть туда, в обычном режиме вы могли бы сделать /want и нажмите enter, чтобы приземлиться на слово «хотите», затем сделайте ci", - Nathan Long
Эй, это просто! Какой быстрый мощный способ перемещения курсора. Единственный способ улучшить это было бы каким-то образом, чтобы волшебным образом указать, где вы хотите курсор, и просто прыгайте туда. Может быть, мы что-то придумаем. Я думаю, мы должны назвать это «мышкой». - Matthew Scouten
@MatthewScouten Никто не утверждает, что vim проще, чем мышь. Однако с небольшой практикой это намного быстрее. Использование мыши - это то же самое, что указывать и хрюкать, чтобы понять вашу точку зрения. Vim позволяет говорить в полном объеме. - Dean
Разрывные привычки - прекрасные ответы, но насильственное предотвращение кого-либо из нормальной деятельности является фашистским. Хуже того, удобство использования of (hjkl): отображение up а также down до 2 клавиш, которые по вертикали неразличимы друг от друга, не говоря уже о левом и правом ключах ..... это трагический демонстрация идеологически ослепленного высокомерия. - New Alexandria


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

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

Keyboard

поскольку vim получена из vi, он использует те же клавиши hjkl.

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

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

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

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


89



Не говоря уже о том, что клавиши hjkl намного эффективнее, чем перемещение рук к клавишам со стрелками. - sixtyfootersdude
Это не отвечает на вопрос, только объясняет, почему hjklвыбран. - Matsemann
Это истинная и интересная история, но OP спрашивает, как вы перемещаете курсор в режиме вставки, hjkl не работают в режиме вставки, так как это ответ на вопрос? - LarsH
@Kruug, первая часть вопроса - почему кто-то сказал никогда не использовать клавиши со стрелками в vim. Тот факт, что вы можете использовать hjkl в vim не говорит, почему кто-то никогда не должен использовать клавиши со стрелками, так же как тот факт, что я могу ездить на велосипеде на работу, не объясняет, почему кто-то сказал мне никогда не бегать трусцой. - LarsH
Теперь я понимаю, почему Vim использует escape для выхода в режим вставки ^^ Прохладный рисунок! - Étienne


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

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

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


50



Сначала я думал, что вы скажете, что «hjkl» бесполезны, но хорошие ловушки, движения слов / абзацев / предложений гораздо полезнее, чем мантра о движе нии одного символа. - Xavier T.
Благодарю. У меня была аналогичная дискуссия по ХН на днях, которая сорвалась из-за плохой формулировки. Сосредоточение усилий на hjkl  является бесполезный, но hjkl являются полезными. - romainl
То же самое: в конце мне понравился ваш ответ, но я думаю, что тон натолкнулся на то, что он излишне разглагольствовал / троллинг / пылал. - UncleZeiv
Оооо, спасибо, Дэниел. - romainl
Не называйте их бесполезными, аргумент о скорости является хорошим, и то, как HJKL работает с другими командами VIM так, что клавиши со стрелками не являются важными. - Aviator45003


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

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

ESC [ A

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

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

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


16





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


14



Вау. Шутки в сторону? Я не хочу верить в это, поскольку это будет означать, что люди, которые разработали Vim, подумают, что их пользователи тратят больше времени на ввод, чем на размышление. - Renan
Почему перемещение рук означает мысль? - EBGreen
хорошо, когда мне приходилось делать это в школе, вам нужно было ударить esc, прежде чем вы сможете использовать навигацию hjkl, поэтому вы уже удалили левую руку из домашней строки, чтобы получить свой мизинец до Esc. Я помню, что, чтобы вернуться в одно пространство и вставить персонажа, вам нужно было ввести «Esc: h i», а затем ввести символ, который вы хотели вставить. Это не очень полезно. - Frank Thomas
@Renan - вы предполагаете, что «набрав» означает «вставлять текст». У меня есть пальцы на домашнем ряду, когда я читаю и думаю тоже, потому что клавиатура - это то, как я проводить в Vim: поиск для перемещения, открытие других файлов для сравнения кода, перескакивание для исправления орфографических ошибок и т. д. - Nathan Long
@Renan - 1) вы недооцениваете сбережения и 2) мелочи складываются. Я видел, как пользователи Vim с сенсорным вводом изменяют скорость в 10 раз быстрее других разработчиков. При достаточной скорости редактирование становится автоматическим и не прерывает мысли или поток. Очень приятно работать таким образом, так что он плавает на моей лодке, но я бы сказал, что это повышает производительность, чем вы думаете. Попробуйте посмотреть на таких кодеров, как Gary Bernhardt. - Nathan Long


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


10



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


Что касается второго вопроса:

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

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

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

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

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

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


5



Помните, если viВставка команды ввода вставки - это режим, тогда, честно говоря, мы должны идентифицировать все такие режимы в других редакторах и называть их модальными. Например, когда мы нажимаем Ctrl-X в Emacs, мы находимся в «режиме», в котором можно, например, нажать Ctrl-S, чтобы сохранить документ, который не будет работать за пределами этого «режима». - Kaz


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

5



Фактически вы можете перемещать курсор в режиме вставки, по крайней мере влево, используя обратное пространство. Но я согласен, что вы не можете передвигать его свободно. - LarsH
Я попытался выразить, что вы не хотите перемещать курсор в Режим вставки вообще. - Squeezy
Извините, я неправильно понял, что вы написали, говоря, что вы не может переместите курсор в режиме вставки. На самом деле, я хочу переместить курсор в режиме вставки: если я вхожу в какой-то новый текст, и я нажимаю неправильный ключ, я хочу использовать backspace для его исправления. Но, кроме этого ограниченного использования, я согласен. - LarsH


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

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

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


3





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

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

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

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

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

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

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


3