"Ніколи не використовуйте клавіші зі стрілками у Vim!"
Я чув це від випадкового оратора, але не мав можливості запитати його, чому. Крім того, якщо ви не використовуєте клавіші зі стрілками, як ви можете перемістити курсор у режимі " Вставка" ?
"Ніколи не використовуйте клавіші зі стрілками у Vim!"
Я чув це від випадкового оратора, але не мав можливості запитати його, чому. Крім того, якщо ви не використовуєте клавіші зі стрілками, як ви можете перемістити курсор у режимі " Вставка" ?
Відповіді:
Використання клавіш зі стрілками вважається поганою звичкою, тому що якщо ви використовуєте клавіші зі стрілками, ви, мабуть, не вистачаєте у багатьох чудових функцій vim.
Коли люди вперше починають використовувати vim, вони, як правило, залишаються у режимі вставки, оскільки це більше схоже на звичайне редагування тексту. Щоб бути ефективним у програмі vim, ви повинні знаходитись у режимі вставки лише тоді, коли ви фактично вводите текст. Якщо ви хочете перемістити курсор, ви повинні знаходитись у звичайному режимі. Ви майже повинні знаходитись у звичайному режимі за замовчуванням.
У звичайному режимі є мільйон ярликів для пересування. Ви можете використовувати hjkl
для переміщення по одному простору за один раз, або ви можете переміщуватися словами, абзацами тощо. Якщо ви перебуваєте в звичайному режимі, немає сенсу використовувати клавіші зі стрілками, а не hjkl
вони знаходяться далі.
Існує думка, що якщо ви використовуєте клавіші зі стрілками, ви використовуєте vim "неправильно". Правда полягає в тому, що vim має дійсно круту криву навчання, тому під час навчання ви робіть все, що робить вас здоровим. Коли я вперше почав використовувати vim, я все робив «неправильно», і у мене не було проблем з порушенням звичок, коли я дізнався більше команд vim.
Наприклад, коли я вперше почав, скажіть, що хотів змінити текст у лапках:
String mystring = "I want to change this";
Я б перейшов у режим вставки, перемістився до кінця рядка за допомогою клавіш зі стрілками, натиснув назад, поки рядок не пропав, і ввів новий текст.
Набагато кращий спосіб - покласти курсор кудись у рядку (звичайний режим), а потім натиснути ci". Це буде change
in
"
. Це видалить все між цитатами і переведе вас у режим вставки, щоб я міг ввести новий текст.
ci<
і ci)
працюйте також, і вам не потрібно рухати рукою від клавіатури до миші. Якщо ви хочете перейти до початку дужок, а потім змінити вміст f(ci(
працює.
/want
і натисніть клавішу Enter, щоб приземлитися на слово "хочу", а потім зробіть ci"
.
hjkl
): відображення up
і down
двома клавішами, які вертикально не відрізняються один від одного, не кажучи вже про лівий і правий клавіші ..... це трагічна демонстрація ідейно засліпленої зарозумілості.
Коротше кажучи, 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
знайдіть своє місце в нашому інструментосмузі, оскільки нам завжди доводиться рухатися двома символами чи лініями, але вони частіше, ніж дерево, яке ховає ліс. Будьте обережні, коли люди проповідують проти стріл: те, що вони вам можуть придбати, може бути зовсім не кращим.
hjkl
це марно , але й hjkl
корисні.
Інші описали, чому переважні інші способи переміщення курсору, але мало відповідей на питання, чому вважається поганою ідеєю використовувати клавіші зі стрілками?
Я думаю, що головна причина (і @Squeezy на це дещо натякає) полягає в тому, що ще в часи терміналів, таких як VT100, клавіші зі стрілками створювали послідовність втечі, яку інтерпретувала запущена програма. (Оскільки клавіші зі стрілками не представлені в ASCII, введення клавіш зі стрілками повинно повідомлятися якимось "спеціальним" способом.) Послідовність виходу зазвичай була чимось на зразок
ESC [ A
залежно від властивостей вашого терміналу, з'єднання та режиму курсору . Якщо ваша оболонка або ваша програма не були налаштовані належним чином для терміналу, вони б не зрозуміли послідовність виходу як клавішу зі стрілкою.
Коли я був у коледжі, входив до Ultrix за допомогою терміналів VT100, якщо я натиснув стрілку під час in vi у режимі вставки, ESC
інтерпретуватимуться як «вийти з режиму вставки», а далі наступні [ A
інтерпретувались як команди у звичайному режимі . Очевидно не те, що користувач хоче чи очікує!
В даний час поводження з терміналами та клавішами зі стрілками здається більш надійним, особливо в середовищі GUI. Але ті ж проблеми все ж виникають при використанні vim через SSH або Telnet.
Використання клавіш зі стрілками нахмуриться, тому що змушує вас переміщати пальці від головного дому при використанні макета QWERTY та з накладки символів (?) При використанні Дворака або будь-якого іншого макета.
Клавіші зі стрілками виявляють проблему - це вже було відомо vi - на повільних з'єднаннях, як на модемі 1200 бод. Стрілка перекладається на послідовність ESC типу ESC a
. Тепер, коли час між ESC і час стає занадто довгим, ви в кінцевому підсумку чуєте 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, привів мене до виходу із зони комфорту. Оскільки емулятор терміналів Anroid на пристрої використовує кнопки гучності для заміни комбінацій спеціальних клавіш (ctrl + що завгодно), деякі клавіші, які я зазвичай використовую на клавіатурі, не працюють у цій ситуації.
Наприклад, клавіша Вставка не працює в цьому середовищі, тому я використовую I
для переходу в режим вставки. Клавіша Esc, яку я зазвичай використовую для виходу з режиму вставки, також не працює, тому я ctrl + [
замість цього використовую для втечі. Клавіші додому та кінця не працюють, як я звик. Натомість я покладаюся на ярлики 0
та $
ярлики, з якими я ніколи не переймався, щоб досягти початку чи кінця рядка.
У будь-якому випадку клавіші зі стрілками все ще функціонують, як зазвичай, у моїй ситуації, але приємно знати, що мінімалістичні комбінації клавіш там є.
Ось мої 2 ¢.
Робіть все, що вам комфортно. Якщо ви використовуєте різні редактори, можливо, простіше використовувати клавіші зі стрілками для послідовності.
З іншого боку, абсолютно геніальному vi (і vim) не потрібні спеціальні клавіші, за винятком, можливо. Можливо, ви могли зламати старий селектор IBM, який функціонує як термінал.
Інша річ, на яку слід стежити, - це те, що клавіші зі стрілками можуть працювати не так, як очікувалося. Я використовував термінали там, де вони не працювали. Я не впевнений, як саме вони реалізовані у Vim, але я впевнений, що це не рівномірно. Моя плямиста пам'ять навіть, схоже, нагадує одну реалізацію, де вони були реалізовані як макроси vim.
Назва гри з розширеними текстовими редакторами, здається, "рухається поспіхом" і зменшує витрачені / повторювані рухи. Існує деякий час , втрачений при переході від буквених клавіш на клавіші зі стрілками ( в залежності від розмірів клавіатури) , а потім назад до будинку поспіль. Але якщо ви можете дістатись до клавіші ESC лівою рукою в режимі перемикання на ружовий або безіменний палець, стає одним рухом рідини, і протягом сеансу редагування буде підвищена швидкість.
І це ключ до другої частини вашого запитання, вийдіть із режиму вставки, натиснувши ESC ліворуч та рухайтеся з hjkl правою. Зрештою, ви зможете це зробити, не пропускаючи ні ритму.
Це було сказано, що я ніколи не потрапляв з Vim, поки не спробував деякі згадані тут речі , найважливіше - розділ " Отримати ефективність: швидке відображення ".