題 為什麼在Vim中不建議使用箭頭鍵


“切勿在Vim中使用箭頭鍵!”

我是從一位隨機發言者那裡聽到的,但沒有機會問他為什麼。此外,如果您不使用箭頭鍵,如何移動光標 插入 模式?


114


起源


對這個問題的歷史回答很有意思。宗教譴責少了。 - Isaac Rabinovitch
好問題。這總是讓我覺得vi [m],作為一個Dvorak鍵盤用戶真的很糟糕! - wim
我記得多年前第一次使用vi時,一位資深同事告訴我“確保你學會使用h,j,k和l鍵,因為有一天你會在箭頭的客戶端站點上找到機器鑰匙不起作用,如果你甚至不能工作,你就會看起來像一個完整的頭部。“ - Ergwun
在插入模式下,您仍然可以使用Ctrl-O然後使用普通模式命令移動光標,它將返回插入模式。還要檢查CTRL-G CTRL-J和CTRL-G CTRL-K,它們會將光標移動到您開始插入的列的下一行和上一行。 - Benoit
多年來,我養成了許多不良習慣。我想我需要在一個非常慢的連接上使用它,迫使我使用更好的習慣。 - aidan


答案:


使用箭頭鍵被認為是一個壞習慣,因為如果你使用箭頭鍵,你可能會錯過許多vim的可愛功能。

當人們第一次開始使用vim時,他們傾向於保持插入模式,因為這更像傳統的文本編輯。但是,要在vim中有效,只有在實際輸入文本時才應該處於插入模式。如果要移動光標,則應處於正常模式。默認情況下,您應該處於正常模式。

在正常模式下,有一百萬個快捷方式可供移動。您可以使用 hjkl 一次移動一個空格,或者你可以按單詞,段落等移動。如果您處於正常模式,則使用箭頭鍵而不是使用箭頭鍵是沒有意義的 hjkl 因為他們離得更遠了。

有一種態度,如果你使用箭頭鍵,你使用vim“錯誤”。事實是,vim有一個非常陡峭的學習曲線,所以當你學習的時候做任何讓你保持理智的事情。當我第一次開始使用vim時,我做了所有“錯誤”的方式,一旦我學會了更多vim的命令,我就沒有任何打破習慣的問題。

例如,當我第一次開始時,說我想更改引號中的文本:

String mystring = "I want to change this";

我將進入插入模式,使用箭頭鍵移動到字符串的末尾,按退格鍵直到字符串消失,然後輸入新文本。

更好的方法是將光標放在字符串中的任何位置(正常模式),然後按 C一世。這將 change  in  "。它將刪除引號之間的所有內容並將您置於插入模式,以便我可以輸入新文本。


170



@ ott-- ci< 和 ci) 同樣工作,你不必將手從鍵盤移動到鼠標。如果要導航到括號的開頭,然後更改內容 f(ci( 作品。 - Matthew Finlay
“把你的光標放在字符串中的任何地方” - 再次,而在插入模式下,你會使用箭頭到達那裡,在正常模式下你可以做 /want 然後點擊“想要”這個詞進入登陸狀態 ci"。 - Nathan Long
嘿,這很整潔!這是一種快速有效的移動光標的方法。改善它的唯一方法是神奇地指向你想要光標的位置,然後讓它跳到那裡。也許我們可以發明一些東西我認為我們應該把它稱為“鼠標”。 - Matthew Scouten
@MatthewScouten沒有人聲稱vim比鼠標簡單。通過一些練習,它會更快,更快。使用鼠標就像指點和咕嚕聲,以獲得你的觀點。 Vim讓你用完整的句子說話。 - Dean
打破習慣是一個很好的答案 - 但強行阻止某人進行正常活動是法西斯主義。更糟糕的是 可用性 (的hjkl):映射 up 和 down 對於兩個垂直無法區分的鍵,更不用說從左右鍵.....它是一個 悲慘 表現出意識形態盲目的傲慢。 - New Alexandria


關鍵位置

簡而言之, Vim 使用 hjkl 鍵作為導航界面是因為它是舊的“ADM-3A”終端的殘餘,這些鍵用箭頭標記。

Keyboard

以來 vim 源於 vi,它使用相同的hjkl鍵。

新習慣

基於字母的箭頭鍵替換允許您 導航文本,而無需離開標準鍵入配置。這可以說比移動手按箭頭鍵更有效,更快。正如參考文獻#2(參見資源)中所述,這並不是優勢的結束:VIM還有許多其他快捷方式,您可以在不移動的情況下訪問它們。

資源和插入模式

對於問題的兩個部分,有一些非常詳細和準確的答案:在箭頭鍵替換方面,我已經以快速和簡要的方式回答,但是 為您的插入問題,請參閱下面列出的資源。


90



更不用說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 實際上比修飾符+箭頭更糟糕。 你猜怎麼著?大運動是我們最需要的。

但我們是幸運的混蛋,我們最喜歡的編輯有幾十個動作圍繞兩個箭頭運行圓圈   hjklbBeEwW/?*#{}() 等等。這些命令是 沒法比 比賦予權力更多 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.
謝謝。前幾天我對HN進行了類似的討論,因為措詞不好而出軌了。專注於一個人的努力 hjkl  是 沒用但是 hjkl 很有用。 - romainl
同樣在這裡:最後我喜歡你的答案,但我認為這種語氣是不必要的咆哮/拖釣/燃燒。 - UncleZeiv
不要稱它們無用,關於速度的爭論是好的,HJKL以箭頭鍵不同的方式處理其他VIM命令的方式也很重要。 - Aviator45003
@ T.C。任何使整個辯論更有趣的例子? - romainl


其他人已經描述了為什麼其他的移動光標的方法是首選的,但很少有人回答這個問題,為什麼使用箭頭鍵被認為是個壞主意呢?

我認為主要原因(和@Squeezy有點暗示這一點)是在VT100這樣的終端時代, 箭頭鍵產生了一個轉義序列 這是由正在運行的程序解釋的。 (由於箭頭鍵沒有用ASCII表示,箭頭鍵的輸入必須以某種“特殊”方式傳達。)轉義序列通常類似於

ESC [ A

取決於您的終端,您的連接和您的 光標模式。如果沒有為終端正確配置shell或程序,則他們不會將轉義序列理解為箭頭鍵。

當我在大學時,通過VT100終端登錄Ultrix,如果我在插入模式下在vi中按箭頭, ESC 將被解釋為“退出插入模式”,然後是以下內容 [ A 被解釋為正常模式命令。顯然不是用戶想要或期望的東西!

如今,終端和箭頭鍵的處理似乎更加強大,尤其是在GUI環境中。但是通過SSH或Telnet使用vim時仍然會出現同樣的問題。


16





使用箭頭鍵是不受歡迎的,因為在使用Dvorak或其他任何佈局時,它會強制您在使用QWERTY佈局和字符板(?)時將手指從主頁移開。


14



哇。真的嗎?我不想相信這一點,因為這意味著設計Vim的人會認為他們的用戶花在打字上的時間多於思考。 - Renan
為什麼移動你的手意味著思考? - EBGreen
好吧,當我不得不在學校做這件事時,你必須在使用hjkl導航之前打esc,所以你已經從主行中移除了你的左手以使你的小指達到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和a之間的時間過長時,你最終會聽到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]如果不使用箭頭鍵,如何在插入模式下移動光標?

對於一個掌握並且因此不屑箭頭鍵的人來說,“模式”的概念同樣不存在。

主設備使用非插入模式添加新文本,而是完全插入或替換 命令 以操作碼開頭,例如 io 要么 cw 其後是有效負載文本,並以 ESC。命令具有語法,因此機器在接受命令語法時遍歷狀態,但在編輯器的主模型中,這些不會產生模式。學徒天真地稱之為“模式”,是指主人未完成的命令狀態,即主人避免的最可惡的情況。

每當主設備實現時,在插入或替換命令的中間,必須插入或刪除該文本而不是光標指示的下一個字符位置,主設備終止插入命令,並釋放其中的幾十個高效運動命令(訴諸於低級 hjkl 如果 一種更強大的方式顯然不適用)。

此外,由於主人很少會以一種未完成命令的方式分散注意力,因此主人很少(如果有的話)導致編輯人員因多餘的輸入而發出嗶嗶聲 ESC 發布“以防萬一”。

(然而,當網絡滯後或機器陷入困境時,主人就會摔倒 ESC 像其他人一樣瘋狂地重複關鍵。)


5



記住,如果 vi插入命令條目是一種模式,那麼公平地說,我們必須在其他編輯器中識別所有這些模式並將它們稱為模態。例如,當我們在Emacs中按Ctrl-X時,我們處於“模式”,例如,可以按Ctrl-S來保存文檔,這不會在“模式”之外工作。 - Kaz