這位老兄說半天都沒說到點子上,聽着讓人着急。 Vim 最大的特點是對結構化文字內容的編輯是最高效率的編輯器,沒有之一,而不是什麼所謂的不用鼠標,適合在 terminal 等理由。這裏的評論說 vim 效率低那只是他不會正確使用。 Vim 的命令,主要是 normal 模式下的,實際上是一個編輯操作描述語言,最常見的語法是,操作 + 目標。 我舉一些實際例子,比如有這一行代碼: printf("hello, world!"); 現在光標在字母p那邊,如果我想修改那段string成爲 “how are you!”,一般編輯器怎麼做呢,用鼠標或者方向鍵,把光標定位到 h 字母那裏,然後選中 "" 內所有文字,或者連續按 刪掉,然後打入 how are you!。這些都是很具體的操作,注意力需要放在光標放在那裏,按多按少都不行。 而你實際上需要做的,用文字描述起來,實際上是“把雙引號裏面的內容修改”,用 vim 的語言(命令)操作,是這樣的: 操作命令 c 是 change 的意思,就是刪掉原來內容。 目標 i" 是 inside " 的意思,就是描述一個被 “” 包括起來的內容。 那麼按照我前面說的語法,操作 + 目標,就是 ci" 也就是說,我在 vim 裏面,想要做這個修改,在 normal 模式下,我只需要輸入 ci",vim 就會把 "" 裏面的內容刪掉,並且把光標移動到 "“ 中間(| 代表輸入光標), printf("|"); 然後你就可以直接打新的內容了。 如果我需要把 () 裏面的內容刪掉再寫新的東西呢,好辦,語法是一樣的,操作 + 目標 操作還是 c,change 目標是 i( ,意思是 inside ( 所以只需要打 ci( 這個命令,vim 就會變成這個狀態(| 代表光標) printf(|); 也就是說,你想要什麼操作,用 vim 的語言描述出來(輸入指令),就行,非常直觀,把文字描述直接翻譯即是需要的操作,比如: 編輯 HTML 時,我要修改整個 tag 裏面的內容,怎麼操作呢,你只要知道目標 t 代表 tag 就行了,所以命令就是 cit (意思就是 change inside tag) 如果刪掉整個 tag,刪除的操作是 d (delete),所以是 dat (delete all tag,a 代表 all,和 inside 相對,a 包括邊界,比如 ,i 只操作兩個 tag 之間,a 就包括了) 。 如果要複製整個 tag,複製的操作是 y (yank),就是 yat 除了 i 和 a,還有很多描述目標的,比如 Vim 的 normal 模式裏面的所有移動光標的命令都可以作爲目標使用,比如前進一個 word 的 w,如果我要修改這個 w,那麼組合命令就是 cw,比如移動到文件最後一行的命令是 G,那麼我要刪除現在到文件結尾的所有內容就是 dG。在比如,小寫字母改大寫,操作命令是 gU (go upper),那麼我把整個文件內容改大寫,只需要 gggUG: gg 是移動到第一行的命令,然後是 操作+目標,gU (小寫改大寫) + G (移動到文件末) 你完全可以舉一反三,回到那個 C 語言的例子: printf("hello, world!"); 如果我要改成 printf("HELLO, WORLD!"); 就可以這樣做:gUi" gU (go upper)i (inside)"(雙引號) Vim 編輯的語法就是這麼簡單直觀且精準,如果你知道越多操作和目標的命令,就可以隨意組合隨心所欲,如果有人跟你說,vim 的命令很多很亂很難記,那是他沒找對方式,根本不懂原理,歡迎來杠。 這位老兄竟然沒提到,Bram 長期通過 vim 的開屏宣傳支持捐贈幫助烏干達兒童。 最後,今天聽到這個才知道這個消息,RIP Bram Moolenaar
@laoming
11 ай бұрын
感谢精彩的留言!🌹🌹🌹🙏🏻🙏🏻🙏🏻
@8pm
11 ай бұрын
@@laoming 老鳴兄客氣了,vim 的 model editing 非常適合編輯修改結構化的文件內容,我舉的例子只是冰山一角,很多人覺得需要記太多熱鍵其實只是沒有從我說的這個角度理解,理解了會發現一點都不難記憶,都是很直觀的。c 是 change,d 是 delete,y 是 yank,w 是 word,類似的目標還有很多,在 vim 裏面 :help objects 能看到: v_aquote| a" double quoted string |v_a'| a' single quoted string |v_a(| a( same as ab |v_a)| a) same as ab |v_a| a> same as a< |v_aB| aB "a Block" from "[{" to "]}" (with brackets) |v_aW| aW "a WORD" (with white space) |v_a[| a[ "a []" from '[' to the matching ']' |v_a]| a] same as a[ |v_a`| a` string in backticks |v_ab| ab "a block" from "[(" to "])" (with braces) |v_ap| ap "a paragraph" (with white space) |v_as| as "a sentence" (with white space) |v_at| at "a tag block" (with white space) |v_aw| aw "a word" (with white space) |v_a{| a{ same as aB |v_a}| a} same as aB |v_iquote| i" double quoted string without the quotes |v_i'| i' single quoted string without the quotes |v_i(| i( same as ib |v_i)| i) same as ib |v_i| i> same as i< |v_iB| iB "inner Block" from "[{" and "]}" |v_iW| iW "inner WORD" |v_i[| i[ "inner []" from '[' to the matching ']' |v_i]| i] same as i[ |v_i`| i` string in backticks without the backticks |v_ib| ib "inner block" from "[(" to "])" |v_ip| ip "inner paragraph" |v_is| is "inner sentence" |v_it| it "inner tag block" |v_iw| iw "inner word" |v_i{| i{ same as iB |v_i}| i} same as iB 我可以給有興趣深入的網友提供一些方向。
@pork6496
11 ай бұрын
Bram 永垂不朽
@szteng
10 ай бұрын
计算机外行,但是看您的解释非常straightforward, logical, educational, and easy to follow. Word C/P 也是计算机命令,只不过应该更复杂了,可以用鼠标/箭头完成。好的老师不容易找。
@8pm
10 ай бұрын
@@szteng 謝謝。過去我確實曾在很多地方教過不少人 vim 的正確使用方式。根據我的經驗,但凡說 vim 的命令太多太雜不好記的而效率低的,都是沒有從原理上瞭解 vim 的設計。其他編輯器其實也是用命令,只不過命令輸入通常用鼠標或者方向鍵移動或者菜單熱鍵,比如上面例子中要修改一個句子,需要用鼠標把句子 highlight 起來打字覆蓋,或者一直按 或 把原文去掉,這看起來很直觀,然而你的注意力消耗在了和寫作無關的地方(鼠標找到句首句尾點擊,或者按多少次),在 vim 裏面只是直接描述你想做什麼就行。一個不恰當的比方是僱一輛車去某個地方,其他編輯器就像你需要一路上指點司機哪個路口左轉或右轉,而 vim 司機,你直接告訴他地址,其他的就不用管了。 用 IDE 和 vim 比較的,也是概念理解出了問題,vim 就是個編輯器,IDE 的其他輔助功能本就應該是其他專門工具的職責,兩者又不是排它的,你甚至可以在 IDE 裏面使用 vim 風格的編輯器。他們說的“大型項目”,我猜基本上都沒有接近 linux kernel 的級別,linux kernel 的開發者可大部分都是使用 vim/emacs 開發的,可見不是工具的問題,是使用者的問題。而且真的非常複雜的大項目,那些 IDE 的所謂 class viewer,對系統負擔很大,光 load 就要用不少時間,談何高效。其實在軟件工程中,大型系統的設計應該注重 decoupling,好的設計,往往每個部件,內部相關上下文就是同一個文件幾百行以內,接口以外都是 black box,可惜真正做到這樣的不多,真正懂這個道理的也不多。
Пікірлер: 100