顯示廣告
隱藏 ✕
看板 EZsoft
作者 Knuckles(站長 那克斯)
標題 [轉錄][轉寄][vim ] 學習vim的心法與攻略
時間 2011年02月01日 Tue. PM 06:54:56


※ 本文轉錄自看板 P_qman

看板 P_qman
作者 cuteman0725 (cuteman0725.bbs@ptt.cc)
標題 [轉寄][vim ] 學習vim的心法與攻略
時間 2011年02月01日 Tue. PM 03:12:01


※ 本文轉寄自 cuteman0725.bbs@ptt.cc

看板 Editor
作者 dryman (dryman)
標題 [vim ] 學習vim的心法與攻略
時間 Thu Jan 21 14:52:25 2010


這篇文章是給剛開始接觸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批幣文XD1F 01/21 14:52
awkman:謝謝分享~最近正在嘗試用vim  一直改不掉用backspace刪字..2F 01/21 15:09
awkman:真的要練到每個刪除動作都回到normal mode 用指令去刪嗎@@?
fuha:不得不推~4F 01/21 15:48
dryman:在insert mode除了backspace可用^-h5F 01/21 17:01
dryman:^-h刪一個字元,^-w刪一個字
untitled:"c" 或許可以用 change7F 01/21 17:02
dryman:change不賴^ ^ 修一下文章~8F 01/21 17:03
※ 編輯: dryman          來自: 140.112.30.84        (01/21 17:04)
LINGZ:motion指的是移動(移動游標),action指的是動作(內容改變).9F 01/21 18:00
ethan5422:推一下這篇10F 01/21 19:19
icycandle:也太清晰了 XD11F 01/21 20:44
freedomxu:其實有裝vim的話,在命令提示字元或shell prompt執行12F 01/21 22:26
freedomxu:vimtutor,就會有一些簡單的教學哦。
maxwellee:推 很有心的解析14F 01/21 22:27
dryman: :h 其實理解完大概的概念,剩下很多都還是要讀help15F 01/21 23:06
dryman:我發現我在這篇中完全沒有題到離開vim該怎麼做orz
※ 編輯: dryman          來自: 220.136.190.64       (01/24 11:52)
dryman:勘誤5b 是向左五個字:p17F 01/24 11:53
Ice9:原來 y 是 yank。謝啦!不過,yank 文義感覺比較像 cut 不是?18F 01/29 14:08
Aibnarsien:vim推XD!19F 01/29 15:39


--
※ 來源: Disp BBS 看板: P_qman 文章位址: http://disp.cc/b/25-18lA

--
※ 作者: Knuckles  時間: 2011-02-01 18:54:56  來自: 111-248-2-46.dynamic.hinet.net
※ 看板: EZsoft 文章推薦值: 1 目前人氣: 0 累積人氣: 1629 
分享網址: 複製 已複製
( ̄︶ ̄)b cyan92128505 說讚!
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇