Чому в Vim не рекомендуються клавіші зі стрілками?


125

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

Я чув це від випадкового оратора, але не мав можливості запитати його, чому. Крім того, якщо ви не використовуєте клавіші зі стрілками, як ви можете перемістити курсор у режимі " Вставка" ?


6
Цікаві історичні відповіді на це питання. Релігійні діатриби менше.
Ісаак Рабінович

5
Гарне питання. Це завжди клопочеться про vi [m], оскільки користувач клавіатури Dvorak - це справді гарно!
вім

32
Я пам’ятаю, коли вперше користувався vi, багато років тому, старший колега, який радив мені «Переконайтесь, що ви навчитесь користуватися клавішами h, j, k і l, тому що одного дня ви опинитесь на машині на сайті клієнта, де стрілка клавіші не працюють, і ви будете схожі на повну голову d ***, якщо навіть не можете працювати vi. "
Ergwun

1
У режимі вставки ви все одно можете перемістити курсор за допомогою Ctrl-O, а потім звичайну команду режиму, і він повернеться до режиму вставки. Також перевірте CTRL-G CTRL-J і CTRL-G CTRL-K, які перемістять курсор до наступного та попереднього рядка, у стовпці, який ви почали вставляти.
Бенуа

1
Протягом багатьох років я розвинув навантаження на шкідливі звички [m]. Я думаю, що мені потрібно використовувати це через дуже повільний зв'язок, щоб змусити мене використовувати кращі звички.
помічник

Відповіді:


172

Використання клавіш зі стрілками вважається поганою звичкою, тому що якщо ви використовуєте клавіші зі стрілками, ви, мабуть, не вистачаєте у багатьох чудових функцій vim.

Коли люди вперше починають використовувати vim, вони, як правило, залишаються у режимі вставки, оскільки це більше схоже на звичайне редагування тексту. Щоб бути ефективним у програмі vim, ви повинні знаходитись у режимі вставки лише тоді, коли ви фактично вводите текст. Якщо ви хочете перемістити курсор, ви повинні знаходитись у звичайному режимі. Ви майже повинні знаходитись у звичайному режимі за замовчуванням.

У звичайному режимі є мільйон ярликів для пересування. Ви можете використовувати hjklдля переміщення по одному простору за один раз, або ви можете переміщуватися словами, абзацами тощо. Якщо ви перебуваєте в звичайному режимі, немає сенсу використовувати клавіші зі стрілками, а не hjklвони знаходяться далі.

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

Наприклад, коли я вперше почав, скажіть, що хотів змінити текст у лапках:

String mystring = "I want to change this";

Я б перейшов у режим вставки, перемістився до кінця рядка за допомогою клавіш зі стрілками, натиснув назад, поки рядок не пропав, і ввів новий текст.

Набагато кращий спосіб - покласти курсор кудись у рядку (звичайний режим), а потім натиснути ci". Це буде change in ". Це видалить все між цитатами і переведе вас у режим вставки, щоб я міг ввести новий текст.


4
@ ott-- ci<і ci)працюйте також, і вам не потрібно рухати рукою від клавіатури до миші. Якщо ви хочете перейти до початку дужок, а потім змінити вміст f(ci(працює.
Меттью Фінлай

6
"покладіть курсор кудись у рядок" - і знову, тоді як у режимі вставки ви використовуєте стрілки, щоб потрапити туди, у звичайному режимі ви можете це зробити /wantі натисніть клавішу Enter, щоб приземлитися на слово "хочу", а потім зробіть ci".
Натан Лонг

8
Гей, це охайно! Який швидкий потужний спосіб переміщення курсору. Єдиний спосіб вдосконалити це був би якийсь спосіб магічно вказати на те, де ви хотіли курсор, і запропонувати йому просто перестрибнути туди. Може, ми можемо щось вигадати. Я думаю, ми повинні називати це «мишею».
Меттью Скаутен

18
@MatthewScouten Ніхто не стверджує, що vim простіший за миша. Трохи практики, але це набагато, набагато швидше. Використання миші - це як вказівка ​​та рохкання, щоб отримати точку впоперек. Vim дозволяє вам говорити в повному обсязі речень.
Декан

4
Порушення звичок - це чудова відповідь - але насильницьке недопущення когось від нормальної діяльності є фашистським. Гірше, зручність використання ( hjkl): відображення upі downдвома клавішами, які вертикально не відрізняються один від одного, не кажучи вже про лівий і правий клавіші ..... це трагічна демонстрація ідейно засліпленої зарозумілості.
Нова Олександрія

93

Ключове розміщення

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

Клавіатура

Оскільки vimвін походить від vi, він використовує ті самі ключі hjkl.

Нові звички

Заміна літер на клавішах зі стрілками дозволяє переміщатися по тексту, не відводячи руки від стандартної конфігурації набору тексту . Це, мабуть, більш ефективно та швидше, ніж переміщення руки, щоб натиснути клавіші зі стрілками. Як зазначено у посиланні №2 (див. Ресурси), це ще не кінець переваг цього: VIM має багато інших ярликів, до яких можна отримати доступ, не рухаючи руками.

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

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


2
Не кажучи вже про те, що клавіші hjkl набагато ефективніше, ніж переміщення рук до клавіш зі стрілками.
шістдесят футів

2
Це не відповідає на питання, лише пояснює, чому обрано hjkl .
Мацеманн

3
Це правдива та цікава історія, але ОП запитує, як перемістити курсор у режимі вставки . hjklне працюють у режимі вставки, тож як це відповідь на питання?
LarsH

3
@Kruug, перша частина питання полягає в тому, чому хтось сказав, що ніколи не використовуйте клавіші зі стрілками in vim. Те, що ви можете використовувати hjklvim, не говорить про те, чому хтось ніколи не повинен використовувати клавіші зі стрілками, так само як той факт, що я можу їздити на велосипеді на роботу, не пояснює, чому хтось скаже мені ніколи не бігати.
LarsH

1
Тепер я розумію, чому Vim використовує escape для виходу з режиму вставки ^^ Cool picture!
Етьєн

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


Спочатку я подумав, що ви збираєтесь сказати, що «hjkl» марні, але хороші рухи, слова / абзаци / пропозиції є набагато кориснішими, ніж мантра щодо руху одного символу.
Ксав’єр Т.

1
Дякую. Я мав подібну дискусію в НН днями, яка зірвалася з-за поганого формулювання. Зосередження своїх зусиль на hjkl це марно , але й hjklкорисні.
romainl

5
Те саме тут: врешті-решт мені сподобалась ваша відповідь, але я вважаю, що тон натрапив на непотрібність виклику / тролінгу / полум'я.
UncleZeiv

Не називайте їх марними, аргумент щодо швидкості - хороший, а те, як HJKL працює з іншими командами VIM таким чином, що клавіші зі стрілками також не є важливим.
Aviator45003

@TC Будь-які приклади, щоб зробити всю дискусію цікавішою?
romainl

18

Інші описали, чому переважні інші способи переміщення курсору, але мало відповідей на питання, чому вважається поганою ідеєю використовувати клавіші зі стрілками?

Я думаю, що головна причина (і @Squeezy на це дещо натякає) полягає в тому, що ще в часи терміналів, таких як VT100, клавіші зі стрілками створювали послідовність втечі, яку інтерпретувала запущена програма. (Оскільки клавіші зі стрілками не представлені в ASCII, введення клавіш зі стрілками повинно повідомлятися якимось "спеціальним" способом.) Послідовність виходу зазвичай була чимось на зразок

ESC [ A

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

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

В даний час поводження з терміналами та клавішами зі стрілками здається більш надійним, особливо в середовищі GUI. Але ті ж проблеми все ж виникають при використанні vim через SSH або Telnet.


14

Використання клавіш зі стрілками нахмуриться, тому що змушує вас переміщати пальці від головного дому при використанні макета QWERTY та з накладки символів (?) При використанні Дворака або будь-якого іншого макета.


4
Ого. Серйозно? Я не хочу вірити в це, оскільки це означатиме, що люди, які створили Vim, подумають, що їхні користувачі витрачають більше часу, набираючи текст, ніж думаючи.
Ренан

13
Чому рухати рукою означає думати?
EBGreen

8
ну, коли мені довелося це зробити в школі, вам довелося натиснути esc, перш ніж ви зможете скористатися навігацією hjkl, тому ви вже видалили ліву руку з домашнього ряду, щоб дістати рожевий колір до Esc. Я пам'ятаю, що для повернення одного пробілу та вставки символу вам потрібно було ввести "Esc: привіт", а потім ввести символ, який ви хотіли вставити. це не так корисно.
Френк Томас

1
@Renan - ви припускаєте, що "введення тексту" означає "вставлення тексту". У мене є пальці на домашній поспіль , коли я читаю і мислення теж, тому що клавіатура, як я переміщатися в Vim: пошук рухатися, відкривати інші файли для порівняння код, стрибаючи навколо , щоб виправити орфографічні помилки і т.д.
Nathan Довгий

2
@ Renan - 1) ви недооцінюєте заощадження та 2) дрібниці. Я бачив, як користувачі Vim живлення на дотик редагують 10-кратну швидкість, ніж інші розробники. З достатньою швидкістю редагування стає автоматичним і не заважає думкам чи потоку. Це приємно працювати таким чином, тому він плаває на моїм човні, але я ставлю на це, що це більший приріст продуктивності, ніж ви думаєте. Спробуйте переглянути кодери, як Гері Бернхардт, як приклад.
Натан Лонг

10

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


Я думаю 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ключ люто і багаторазово, як і всі інші.)


2
Пам'ятайте, що якщо viкоманда вставки команди вставки - це режим, то, щоб справедливо, ми повинні ідентифікувати всі такі режими в інших редакторах і називати їх модальними. Наприклад, коли ми натискаємо на Ctrl-X в Emacs, ми перебуваємо в "режимі", коли можна, наприклад, натиснути Ctrl-S, щоб зберегти документ, який не буде працювати поза цим "режимом".
Каз

5
  • клавіші зі стрілками можуть не працювати належним чином у певних умовах. hjkl - це нормальні символи, які добре розуміються всіма терміналами.
  • Ви не переміщуєте курсор у режимі "Вставка" (за винятком Backspace та виправлення короткого друку), ідея vi полягає у введенні режиму Insert лише для того, щоб щось ввести. Рух здійснюється в звичайному режимі
  • Якщо можете, вам слід уникати використання hjkl для переміщення куди завгодно , а натомість використовувати їх лише для вказівки. Існує чимало варіантів переїзду в vi , дивіться: http://vim.wikia.com/wiki/Moving_around

Насправді ви можете перемістити курсор у режимі вставки, принаймні ліворуч, за допомогою зворотної області. Але я згоден, ви не можете переміщати це вільно.
LarsH

Я намагався висловити, що ви ВЖЕ не хочете переміщувати курсор у режимі Вставка .
Squeezy

Вибачте, я неправильно зрозумів те, що ви написали так, що не можете переміщувати курсор у режимі вставки. Насправді я хочу перемістити курсор у режимі вставки: якщо я ввожу якийсь новий текст і натискаю неправильну клавішу, я хочу використати зворотну простір, щоб виправити його. Але поза цим обмеженим використанням я згоден.
LarsH

3

Так, з багатьох згаданих причин viспочатку було написано для використання hjkl, але " ніколи " - це досить велике твердження.

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

Єдина поважна причина, яку я можу придумати, щоб "ніколи не використовувати стрілки у Vim!" це означає, що ви можете використовувати машини, які не справляються зі стрілками. Це відчувається як досить тонка причина сказати " ніколи ".


3

якщо ви не використовуєте клавіші зі стрілками, як ви можете перемістити курсор у режимі "Вставка"?

Основна причина, чому я заважаю людям користуватися стрілками, явно полягає в тому, що це дозволяє пересуватися в режимі вставки.

Однією з найдивніших проблем з навчанням vim для новачків є те, що команда відміни vim функціонує шляхом скасування останньої дії , а не останнього натискання клавіші . Багато моїх друзів залишаються у режимі вставки весь час, тому що ніколи не залишають причин залишати його. Коли вони запитують мене "Як я скасувати?" Я відповідаю "натисніть букву u з командного режиму", вони засмучуються, коли vim видаляє весь файл.

"Vim - це досить нікчемний текстовий редактор, якщо він не може скасувати речі правильно".

Важко користуватися інструментом, перш ніж ви навчилися.

Vim стає корисним лише після того, як ви навчилися ним користуватися. Сила vim полягає в тому, як ви можете сказати йому "зробити це знову" або "скасувати цю річ" або "робити це лише тоді, коли я натисну цю гарячу клавішу макросу" через підсвідому м'язову пам'ять. Якщо "ця річ" стає "введіть весь файл від початку до кінця", я згоден, vim зовсім не так корисний.

З цієї причини слід вводити текст лише тоді, коли ви знаходитесь insert mode. Уникнення клавіш зі стрілками - це лише один із способів, який допоможе вам швидше стати кращим користувачем vim.


0

Запуск vim під час обстрілу на моєму пристрої Android, на якому працює ssh демон в kbox, привів мене до виходу із зони комфорту. Оскільки емулятор терміналів Anroid на пристрої використовує кнопки гучності для заміни комбінацій спеціальних клавіш (ctrl + що завгодно), деякі клавіші, які я зазвичай використовую на клавіатурі, не працюють у цій ситуації.

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

У будь-якому випадку клавіші зі стрілками все ще функціонують, як зазвичай, у моїй ситуації, але приємно знати, що мінімалістичні комбінації клавіш там є.


0

просто напишіть таку команду перед тим, як писати у vim: -

  1. вихід
  2. : встановити nocp

одна проблема з цим полягає в тому, що вам, можливо, доведеться писати це кожен раз.


добре, це буде корисно, коли ви хочете використовувати клавішу зі стрілкою в режимі вставки
0decimal0

0

Ось мої 2 ¢.

Робіть все, що вам комфортно. Якщо ви використовуєте різні редактори, можливо, простіше використовувати клавіші зі стрілками для послідовності.

З іншого боку, абсолютно геніальному vi (і vim) не потрібні спеціальні клавіші, за винятком, можливо. Можливо, ви могли зламати старий селектор IBM, який функціонує як термінал.

Інша річ, на яку слід стежити, - це те, що клавіші зі стрілками можуть працювати не так, як очікувалося. Я використовував термінали там, де вони не працювали. Я не впевнений, як саме вони реалізовані у Vim, але я впевнений, що це не рівномірно. Моя плямиста пам'ять навіть, схоже, нагадує одну реалізацію, де вони були реалізовані як макроси vim.


0

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

І це ключ до другої частини вашого запитання, вийдіть із режиму вставки, натиснувши ESC ліворуч та рухайтеся з hjkl правою. Зрештою, ви зможете це зробити, не пропускаючи ні ритму.

Це було сказано, що я ніколи не потрапляв з Vim, поки не спробував деякі згадані тут речі , найважливіше - розділ " Отримати ефективність: швидке відображення ".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.