"Никогда не используйте клавиши со стрелками в Vim!"
Я слышал это от случайного оратора, но у меня не было возможности спросить его, почему. Кроме того, если вы не используете клавиши со стрелками, как вы можете переместить курсор в режиме вставки ?
"Никогда не используйте клавиши со стрелками в Vim!"
Я слышал это от случайного оратора, но у меня не было возможности спросить его, почему. Кроме того, если вы не используете клавиши со стрелками, как вы можете переместить курсор в режиме вставки ?
Ответы:
Использование клавиш со стрелками считается плохой привычкой, потому что если вы используете клавиши со стрелками, вы, вероятно, упускаете многие из прекрасных функций vim.
Когда люди впервые начинают использовать vim, они, как правило, остаются в режиме вставки, поскольку это больше похоже на обычное редактирование текста. Однако, чтобы быть эффективным в vim, вы должны находиться в режиме вставки только тогда, когда вы фактически вводите текст. Если вы хотите переместить курсор, вы должны быть в обычном режиме. По умолчанию вы должны быть в нормальном режиме.
В обычном режиме есть миллион ярлыков для перемещения. Вы можете использовать hjklдля перемещения по одному пробелу за раз, или вы можете перемещаться по словам, параграфам и так далее. Если вы находитесь в обычном режиме, нет смысла использовать клавиши со стрелками, hjklпоскольку они находятся дальше.
Существует мнение, что если вы используете клавиши со стрелками, вы используете vim "неправильно". Правда в том, что у vim действительно крутая кривая обучения, поэтому, пока вы учитесь, делайте все, что вам хочется. Когда я впервые начал использовать vim, я делал все «неправильно», и у меня не было никаких проблем, чтобы избавиться от привычек, как только я узнал больше команд vim.
Например, когда я только начинал, скажем, что я хотел изменить текст в кавычках:
String mystring = "I want to change this";
Я бы вошел в режим вставки, переместился бы в конец строки с помощью клавиш со стрелками, нажимал клавишу Backspace, пока строка не исчезла, и вводил новый текст.
Гораздо лучший способ - поместить курсор в любое место строки (обычный режим), а затем нажать ci". Это будет change in ". Он удалит все между кавычками и переведет вас в режим вставки, чтобы я мог ввести новый текст.
ci<и ci)работать так же, и вам не нужно перемещать руку с клавиатуры на мышь. Если вы хотите перейти к началу скобок, а затем изменить содержание f(ci(работает.
/wantи нажать клавишу ввода, чтобы получить слово «хочу», а затем сделать ci".
hjkl): сопоставление upи down2 клавиши, которые неотличимы по вертикали друг от друга, не говоря уже о левой и правой клавишах ... это трагическая демонстрация идеологически ослепленного высокомерия.
Короче говоря, Vimв hjklкачестве интерфейса навигации используются клавиши, потому что это остаток старого терминала "ADM-3A", на котором эти клавиши отмечены стрелками.

Поскольку он
vimявляется производным от негоvi, он использует те же ключи hjkl.
Буквенная замена клавиш со стрелками позволяет перемещаться по тексту, не отрывая рук от стандартной конфигурации ввода . Возможно, это более эффективно и быстрее, чем перемещать руку, нажимая клавиши со стрелками. Как указано в ссылке № 2 (см. Ресурсы), это еще не все преимущества: VIM имеет множество других ярлыков, к которым вы можете обращаться, не двигая руками.
Есть несколько очень подробных и точных ответов на 2 части вашего вопроса: что касается замены клавиши со стрелкой, я ответил быстро и кратко, однако для вашего вопроса вставки , пожалуйста, обратитесь к ресурсам, перечисленным ниже.
hjklне работает в режиме вставки, так как это ответ на вопрос?
hjklв vim, не говорит, почему кто-то никогда не должен использовать клавиши со стрелками, так же как тот факт, что я могу ездить на велосипеде на работу, не объясняет, почему кто-то сказал бы мне никогда не бегать.
Эту глупую мантру часто повторяют машинистки на ощупь, для которых домашний ряд похож на второй позвоночник, или машинистка на ощупь, которые хотят выглядеть круто. Для тех, кто не печатает на ощупь, домашний ряд просто не такой уж особенный, и легкое перемещение правой руки для достижения стрелок вообще не проблема.
Важно учитывать то, что люди, которые повторяют эту мантру, предлагают использовать вместо этого.
Большую часть времени они настаивают на использовании 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 символа или линии, но это чаще всего дерево, которое скрывает лес. Остерегайтесь людей, проповедующих против стрел: то, что они приготовили для вас, может быть вовсе не лучше.
hjkl это бесполезно , но и hjklполезны.
Другие описали, почему другие способы перемещения курсора предпочтительнее, но мало что сказано для ответа на вопрос, почему считается плохой идеей использовать клавиши со стрелками?
Я думаю, что главная причина (и @Squeezy несколько на это ссылается) заключается в том, что еще во времена терминалов, подобных VT100, клавиши со стрелками создавали escape-последовательность, которая интерпретировалась запущенной программой. (Так как клавиши со стрелками не представлены в ASCII, ввод клавиш со стрелками должен передаваться каким-то «особым» способом.) Экранирующая последовательность обычно была чем-то вроде
ESC [ A
в зависимости от свойств вашего терминала, вашего соединения и режима курсора . Если ваша оболочка или ваша программа не были настроены должным образом для терминала, они не воспримут escape-последовательность как клавишу со стрелкой.
Когда я учился в колледже, входя в Ultrix через терминалы VT100, если бы я нажимал стрелку в режиме vi в режиме вставки, ESCэто интерпретировалось бы как «выйти из режима вставки», а затем следующие команды [ Aинтерпретировались как команды обычного режима. , Очевидно, не то, что пользователь хочет или ожидает!
В настоящее время обработка терминалов и клавиш со стрелками представляется более надежной, особенно в средах с графическим интерфейсом. Но те же проблемы все еще возникают при использовании vim через SSH или Telnet.
Использование клавиш со стрелками не одобряется, потому что это заставляет вас отодвигать пальцы от homerow при использовании раскладки QWERTY и от панели символов (?) При использовании Dvorak или любой другой раскладки.
Клавиши со стрелками показывают проблему - это было уже известно в vi - при медленных соединениях, как при модеме 1200 бод. Стрелка переводит в последовательность ESC, как ESC a. Теперь, когда время между ESC и a становится слишком длинным, вы в конечном итоге слышите BEL (или видите вспышку), а затем режим добавления. Это не появится с hjklключами.
ESC [ Aэто то, что вы имеете в виду?
ESC [ Aстрелка - терминал DEC VT-100 (терминал ANSI был сильно производным от терминала DEC VT-100). IIRC, ESC Aбыл стрелкой ADM-3A или, возможно, стрелкой DEC VT-52. Точка остается той же самой, однако ESCсимвол, отправленный как часть клавиши со стрелкой, был легко перепутан с ESCнапечатанным вручную.
По второму вопросу:
[I] Если вы не используете клавиши со стрелками, как вы можете перемещать курсор в режиме вставки?
Для того, кто является хозяином, и, следовательно, кто презирает клавиши со стрелками, концепция «моды» также не существует.
Мастер добавляет новый текст , используя не режим вставки, а скорее полные вставки или замены команд , которые начинаются с кода операции , такие как i, oили , cwчто сопровождается текстом полезной нагрузки, и завершается ESC. Команды имеют синтаксис, и поэтому машина принимает состояния, принимая синтаксис команд, но в основной модели редактора они не вызывают режим. То, что ученики наивно называют «режимом», является для мастера незавершенным командным состоянием, самой отвратительной ситуацией, которую мастер избегает.
Всякий раз, когда мастер понимает, в то время как в середине команды вставки или замены этот текст должен быть вставлен или удален, кроме как в следующей позиции символа, указанной курсором, мастер завершает команду вставки и высвобождает одну из десятков эффективных команды движения (прибегая к непритязательному, hjklесли более мощный способ явно не применим).
Кроме того, поскольку мастер редко отвлекается таким образом, чтобы оставить команду незавершенной, мастер редко, если вообще когда-либо, заставляет редактор ESCиздавать звуковой сигнал из-за ввода лишнего, выданного «на всякий случай».
(Однако, когда сеть отстает или машина перегружена, мастер ESCнажимает на ключ яростно и многократно, как и все остальные.)
viввод команды вставки является режимом, то, если честно, мы должны определить все такие режимы в других редакторах и назвать их модальными. Например, когда мы нажимаем Ctrl-X в Emacs, мы находимся в «режиме», в котором, например, можно нажать Ctrl-S, чтобы сохранить документ, который не будет работать вне этого «режима».
Да, по многим причинам, упомянутым выше, viизначально был написан для использования hjkl, но « никогда » - довольно большое утверждение.
Я склонен модифицировать vim(и другие инструменты, которые я использую), чтобы вести себя так, как я хочу. Это прекрасно работает на моей машине, но как разработчик встраиваемых систем, я не всегда могу выбирать, что находится на машинах, которые я поддерживаю. Я сталкиваюсь со старыми машинами, у которых есть hjklнавигация только viпо случаю. Я заканчиваю тем, что получаю контрольные коды, вставленные в мой файл на секунду или две, пока я не нарушу свою привычку и не переключусь на hjkl.
Единственная веская причина, по которой я могу придумать: «Никогда не используйте клавиши со стрелками в Vim!» так что вы можете использовать машины, которые не могут обрабатывать клавиши со стрелками. Это похоже на довольно тонкую причину, чтобы сказать « никогда ».
если вы не используете клавиши со стрелками, как вы можете переместить курсор в режиме вставки?
Основная причина, по которой я отговариваю людей от использования клавиш со стрелками, заключается в том, что они явно позволяют перемещаться в режиме вставки.
Одна из самых странных проблем с изучением vim для новичков состоит в том, что команда отмены vim работает, отменяя последнее действие , а не последнее нажатие клавиши . Многие из моих друзей все время остаются в режиме вставки, потому что нет причины выходить из него. Когда меня спрашивают "Как мне отменить?" Я отвечаю «нажми букву u из командного режима», они расстраиваются, когда vim удаляет весь файл.
«Vim - довольно бесполезный текстовый редактор, если он не может ничего исправить».
Трудно использовать инструмент, пока вы не узнали, как.
Vim становится полезным только после того, как вы научитесь его использовать. Сила vim в том, как вы можете сказать ему «сделать это снова» или «отменить это» или «сделать это только тогда, когда я нажму эту макро-горячую клавишу» через подсознательную мышечную память. Если «эта вещь» становится «печатать весь файл от начала до конца», я согласен, vim не так уж и полезен.
Именно по этой причине вы должны вводить текст только тогда, когда вы внутри insert mode. Мы обнаружили, что отказ от клавиш со стрелками поможет вам быстрее стать лучшим пользователем vim.
Запуск vim на моем Android-устройстве, на котором запущен демон ssh в kbox, заставил меня немного выйти из зоны комфорта. Поскольку эмулятор терминала Android на устройстве использует кнопки громкости для замены специальных комбинаций клавиш (Ctrl + что угодно), некоторые клавиши, которые я обычно использую на клавиатуре, не работают в этой ситуации.
Например, клавиша Вставка не работает в этой среде, поэтому я использую Iдля переключения в режим вставки. Клавиша Esc, которую я обычно использую для выхода из режима вставки, также не работает, поэтому ctrl + [вместо нее я использую escape. Клавиши Home и End не работают, как я привык. Вместо этого я полагаюсь на ярлыки 0и $ярлыки, с которыми никогда раньше не сталкивался, чтобы достичь начала или конца строки.
В любом случае, клавиши со стрелками все еще работают как обычно в моей ситуации, но приятно знать, что минималистские сочетания клавиш есть.
Вот мои 2 ¢.
Делай то, что тебе удобно. Если вы используете разные редакторы, может быть проще использовать клавиши со стрелками для согласованности.
С другой стороны, это замечательно, что vi (и vim) не нужны никакие специальные ключи, кроме, возможно,. Вероятно, вы могли бы взломать старый выбор IBM для работы в качестве терминала.
Другая вещь, на которую следует обратить внимание, это то, что клавиши со стрелками могут работать не так, как ожидалось. Я использовал терминалы, где они не работали. Я не уверен точно, как они реализованы в Vim, но я уверен, что он не одинаков. Моя пятнистая память даже напоминает одну реализацию, где они были реализованы как макросы vim.
Название игры с улучшенными текстовыми редакторами, кажется, «движется в спешке» и уменьшает потерянное / повторяющееся движение. Существует некоторое время , потерянное при переходе от буквенных клавиш на клавиши со стрелками ( в зависимости от размеров клавиатуры) , а затем обратно к дому подряд. Но если вы сможете добраться до клавиши ESC левой рукой, то переключение режимов мизинца или безымянного пальца станет одним плавным движением, и в течение сеанса редактирования будет увеличение скорости.
И это ключ ко второй части вашего вопроса: выйдите из режима вставки, нажав ESC левой и двигайтесь с помощью hjkl правой. В конце концов вы сможете сделать это, не пропуская ни секунды.
Тем не менее, я ничего не получил с Vim, пока не попробовал некоторые из вещей, упомянутых здесь , наиболее важным из которых является раздел « Получить эффективные: сочетания клавиш »