[vim ] 學習vim的心法與攻略置底

看板Editor (編輯器(vim/emacs))作者 (dryman)時間15年前 (2010/01/21 14:52), 編輯推噓20(20019)
留言39則, 21人參與, 最新討論串1/2 (看更多)
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

01/21 14:52, , 1F
生平第一篇1000批幣文XD
01/21 14:52, 1F

01/21 15:09, , 2F
謝謝分享~最近正在嘗試用vim 一直改不掉用backspace刪字..
01/21 15:09, 2F

01/21 15:11, , 3F
真的要練到每個刪除動作都回到normal mode 用指令去刪嗎@@?
01/21 15:11, 3F

01/21 15:48, , 4F
不得不推~
01/21 15:48, 4F

01/21 17:01, , 5F
在insert mode除了backspace可用^-h
01/21 17:01, 5F

01/21 17:01, , 6F
^-h刪一個字元,^-w刪一個字
01/21 17:01, 6F

01/21 17:02, , 7F
"c" 或許可以用 change
01/21 17:02, 7F

01/21 17:03, , 8F
change不賴^ ^ 修一下文章~
01/21 17:03, 8F
※ 編輯: dryman 來自: 140.112.30.84 (01/21 17:04)

01/21 18:00, , 9F
motion指的是移動(移動游標),action指的是動作(內容改變).
01/21 18:00, 9F

01/21 19:19, , 10F
推一下這篇
01/21 19:19, 10F

01/21 20:44, , 11F
也太清晰了 XD
01/21 20:44, 11F

01/21 22:26, , 12F
其實有裝vim的話,在命令提示字元或shell prompt執行
01/21 22:26, 12F

01/21 22:27, , 13F
vimtutor,就會有一些簡單的教學哦。
01/21 22:27, 13F

01/21 22:27, , 14F
推 很有心的解析
01/21 22:27, 14F

01/21 23:06, , 15F
:h 其實理解完大概的概念,剩下很多都還是要讀help
01/21 23:06, 15F

01/21 23:11, , 16F
我發現我在這篇中完全沒有題到離開vim該怎麼做orz
01/21 23:11, 16F
※ 編輯: dryman 來自: 220.136.190.64 (01/24 11:52)

01/24 11:53, , 17F
勘誤5b 是向左五個字:p
01/24 11:53, 17F

01/29 14:08, , 18F
原來 y 是 yank。謝啦!不過,yank 文義感覺比較像 cut 不是?
01/29 14:08, 18F

01/29 15:39, , 19F
vim推XD!
01/29 15:39, 19F

04/22 16:02, , 20F
請問 有沒有可以讓游標到該航最後一個字的右邊呀
04/22 16:02, 20F

04/22 16:04, , 21F
因為$只會到最後一個字 進入插入模式就會在左邊加字
04/22 16:04, 21F

04/22 16:04, , 22F
可是我希望的是在最後一個字的後面加字的話要怎麼辦呢?
04/22 16:04, 22F

05/13 15:02, , 23F
請在該行任意地方輸入大寫"A"
05/13 15:02, 23F
※ 編輯: dryman 來自: 220.136.190.223 (09/07 21:07)

10/20 18:58, , 24F
ctrl+o可以暫時變成normal mode這個我最近才知道
10/20 18:58, 24F

10/20 18:58, , 25F
可是習慣都養成了 好難改
10/20 18:58, 25F

09/04 14:40, , 26F
good ~
09/04 14:40, 26F

11/23 16:28, , 27F
推…
11/23 16:28, 27F

12/04 15:48, , 28F
好文 值得學習
12/04 15:48, 28F

03/11 05:33, , 29F
請問跳到第一行及最後一行要用什麼指令
03/11 05:33, 29F

03/11 06:31, , 30F
VI的字是以空格來畫分的吧!所以移動幾個字
03/11 06:31, 30F

03/11 06:31, , 31F
複製幾個字之類的指令根本不能用在中文上
03/11 06:31, 31F

03/11 06:32, , 32F
當然大部分人是拿來寫程式的,不過用在LaTeX的話
03/11 06:32, 32F

03/11 06:32, , 33F
還是要編輯中文文章吧。不知道有沒有辦法解決中文的問題?
03/11 06:32, 33F

03/13 00:52, , 34F
找到了,第一行gg,最後一行G。要到第幾行就在G前面加上
03/13 00:52, 34F

03/13 00:53, , 35F
數字,比如10G就跳到第10行
03/13 00:53, 35F

02/28 00:37, , 36F
沒再跟你用滑鼠的啦
02/28 00:37, 36F

02/28 00:39, , 37F
就這點,屌打一堆fancy 的編輯器。
02/28 00:39, 37F

04/28 12:37, , 38F
推傳教 我也是vi新手
04/28 12:37, 38F

11/16 17:02, , 39F
good
11/16 17:02, 39F
文章代碼(AID): #1BL_chY5 (Editor)
文章代碼(AID): #1BL_chY5 (Editor)