看板 Editor 關於我們 聯絡資訊
EDIT: 這裡有個不錯的連結可以當做初學參考 http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/ 這篇文章是給剛開始接觸vim的版友參考的 因為vim指令繁多,剛接觸時會很難接受它的邏輯 好像要將許多字母的對應全部都記起來,才會發揮vim的威力(雖然這麼說也沒錯:p) 也看到很多新人會上網列印vim cheat sheat 可是記不清楚各式指令,最後還是把vim當作記事本使用... 因此呢,想分享一些能幫助學習vim的心法,還有幫助記憶指令的撇步 如果版友有更多錦囊密技,也請掏寶分享,讓Editor版活絡起來吧! vim or vi like editor最大的特色,就是有多種模式 (mode) 這也是vi/vim被認為難學的理由之一 關於mode的設計,vgod大在blog上面有一篇深入討論的文章: http://blog.vgod.tw/2009/12/07/text-editing/ 後來文字編輯器變得越來越複雜,快速鍵也大量增加,這時在有限的空間內 分配快速鍵的位置並且讓使用者容易學習又不容易忘記就成了一件困難的事 。現代的一般編輯器,包括很多寫程式用的IDE,大量使用各種混合Ctrl、 Shift、Alt的快速鍵,這種快速鍵設計哲學是把每一個功能對應到一組複合 鍵上。理所當然的,功能越多,快速鍵就越多越難記。 ... vi的這種設計避免了快速鍵的組合爆炸(想想看如果把各種組合都對應到一 個ctrl-alt快速鍵會有多少個..),並且讓使用者能完全使用鍵盤來精確、 快速的編輯一個文件,一旦熟悉這種操作後,手都不用離開鍵盤,不管是寫 程式或是寫文章都有了一種人機合一的流暢感,心中想到哪裡游標就能精確 移動到哪裡,不管多複雜的文字操作都能快速解決,心中的爽快感其實是難 以用筆墨形容的。 vim本身有11種模式,限於篇幅就先鎖定在normal and insert mode吧 一般進到vim時,會是在normal mode底下 大部分的複製、剪貼、滾動、移動游標、跳躍到書籤、錄製巨集 等"動作"都是在這個mode下完成的 要進入文字編輯模式,得按i 切回normal mode可以用esc或是^-[(ctrl-[的意思) 在normal mode底下,我暫時先將最常用的指令分成三類 action: insert, yank, delete, paste... (慣例中我們將複製稱作yank而非copy) number: repeat action/motion motion: cursor motion 其中最有特色的就是repeat number的部份 幾乎所有的指令都可以用number來重複(除了insert mode中的指令) 從數字著手我覺得會更容易感受到vim 的"文法" 比如說: 5b 向左移動5個單字 (移動單位和移動指令是合併的) 5^f 滾動5 6yy 複製6 (變成複合句了) d% 剪下這個括號內的所有內容 以上的動作都只需要花兩三個字元就可以做到 由於vi/vim有相當多的指令可以做各種動作 像是在單字間移動、段落、單字內、括號批配、頁首/尾、檔首/尾、行首/尾 等等 熟悉的動作指令越多,越能做出滑鼠無法做到的快速移動 同時可以跟action指令結合(action, motion在中文都通稱動作,真難翻...) 讓編修文字變得更有效率! 了解vim的文法,就可以來記憶一下幾個常用的motion k w (a word) b (back a word) e (end of a word) h l ^ (head of indent line) 0 (head of line) j $ (end of line) hjkl是上下左右,如果要追求高速的文字輸入效率 使用home row的效果會比使用上下左右高 (不知道home row是什麼請自己去查) 因此現在你可以操作看看vim指令了! 5k 向上五行 5w 向右五個字(游標在字首) 5e 向右五個字(游標在字尾) $ 直接跳到行尾,重複次數無意義XD 剩下的請自己排列組合XD 然後來看幾個最常用的action指令: d{motion} delete 刪除(所有的刪除都是剪下,會進入剪貼簿) y{motion} yank 複製 c{motion} change 刪除並進入insert mode(可翻作刪修) p paste 貼上 注:{motion}可以是複合的動作指令,如5w 注:paste因為和其他幾個指令性質有點不太相同,所以用不同的標色 我認為最核心的指令就是d,y,c,其他類似他們的指令都只是變形而已 現在可以將d,y,c跟其他的指令做組合: d5w 刪五個字(到字首) c^ 刪修到行首 不過如果每個動作都要跟其他動作指令做結合,就太慢了 所以就出現了幾種變形: D 刪到行尾 C 刪修到行尾 dd 刪除整行 cc 刪修整行 yy 複製整行 Y 這也是複製整行...其實我比較希望是複製到行尾 ~"~ (順便問下版友,action到行首有沒有d^外更方便的按法啊?) 在這些motion前面可以加number,如: 5yy 複製五行 5cc 刪除五行再進入insert mode 另外有時候會需要以字元為單位的編輯,所以還有幾個小變形: s substitude 刪修一個字元 x x 刪除一個字元 r replace 刪修一個字元再回到normal mode R replace mode 取代模式 跟行單位的指令類似,在前面也可以加number: 5s 刪掉五個字元再進入insert mode 5x 刪五個字元 5r 將五個字元都換成新輸入的一個字元 R 每個輸入字元都會取代現在游標所在位置的字元 2R 取代的字會重複一次 看到這邊會不會有點頭昏眼花了呢XD 整理一下所有的指令: k w (a word) b (back a word) e (end of a word) h l ^ (head of indent line) 0 (head of line) j $ (end of line) 刪除 複製 刪修 取代 d y c r D Y C R (mode) dd yy cc 貼上 x s p 切換mode i (normal to insert) R (normal to replace) esc or ^-[ (back to normal) 其實沒有很多吧XD 這篇文章篇幅看起來很長,是為了要讓新進讀者能理解vim的文法 之後應該不會用這麼囉唆的語句來舉例了吧@ @||| -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.185.152
dryman:生平第一篇1000批幣文XD 01/21 14:52
awkman:謝謝分享~最近正在嘗試用vim 一直改不掉用backspace刪字.. 01/21 15:09
awkman:真的要練到每個刪除動作都回到normal mode 用指令去刪嗎@@? 01/21 15:11
fuha:不得不推~ 01/21 15:48
dryman:在insert mode除了backspace可用^-h 01/21 17:01
dryman:^-h刪一個字元,^-w刪一個字 01/21 17:01
untitled:"c" 或許可以用 change 01/21 17:02
dryman:change不賴^ ^ 修一下文章~ 01/21 17:03
※ 編輯: dryman 來自: 140.112.30.84 (01/21 17:04)
LINGZ:motion指的是移動(移動游標),action指的是動作(內容改變). 01/21 18:00
ethan5422:推一下這篇 01/21 19:19
icycandle:也太清晰了 XD 01/21 20:44
freedomxu:其實有裝vim的話,在命令提示字元或shell prompt執行 01/21 22:26
freedomxu:vimtutor,就會有一些簡單的教學哦。 01/21 22:27
maxwellee:推 很有心的解析 01/21 22:27
dryman: :h 其實理解完大概的概念,剩下很多都還是要讀help 01/21 23:06
dryman:我發現我在這篇中完全沒有題到離開vim該怎麼做orz 01/21 23:11
※ 編輯: dryman 來自: 220.136.190.64 (01/24 11:52)
dryman:勘誤5b 是向左五個字:p 01/24 11:53
Ice9:原來 y 是 yank。謝啦!不過,yank 文義感覺比較像 cut 不是? 01/29 14:08
Aibnarsien:vim推XD! 01/29 15:39
PandaMax:請問 有沒有可以讓游標到該航最後一個字的右邊呀 04/22 16:02
PandaMax:因為$只會到最後一個字 進入插入模式就會在左邊加字 04/22 16:04
PandaMax:可是我希望的是在最後一個字的後面加字的話要怎麼辦呢? 04/22 16:04
cyutdt:請在該行任意地方輸入大寫"A" 05/13 15:02
※ 編輯: dryman 來自: 220.136.190.223 (09/07 21:07)
ckclark:ctrl+o可以暫時變成normal mode這個我最近才知道 10/20 18:58
ckclark:可是習慣都養成了 好難改 10/20 18:58
michael520:good ~ 09/04 14:40
pcchou: 推… 11/23 16:28
hoootony: 好文 值得學習 12/04 15:48
oftisa: 請問跳到第一行及最後一行要用什麼指令 03/11 05:33
oftisa: VI的字是以空格來畫分的吧!所以移動幾個字 03/11 06:31
oftisa: 複製幾個字之類的指令根本不能用在中文上 03/11 06:31
oftisa: 當然大部分人是拿來寫程式的,不過用在LaTeX的話 03/11 06:32
oftisa: 還是要編輯中文文章吧。不知道有沒有辦法解決中文的問題? 03/11 06:32
oftisa: 找到了,第一行gg,最後一行G。要到第幾行就在G前面加上 03/13 00:52
oftisa: 數字,比如10G就跳到第10行 03/13 00:53
wtfbt: 沒再跟你用滑鼠的啦 02/28 00:37
wtfbt: 就這點,屌打一堆fancy 的編輯器。 02/28 00:39
yen980240: 推傳教 我也是vi新手 04/28 12:37
penguinlion: good 11/16 17:02