Tue 6 Feb 2007
慣於使用所見即所得,或者說喜歡用滑鼠的朋友們,對於 vim 這種好像只能憑藉鍵盤的方式很不習慣。我們可能會說 vim 是不錯,可是不能滑鼠選擇一塊區域,然後按一個鍵,或是一個地方,就可以完成某些事情。比方說有一些軟體可以讓你在編寫網頁的時候,你可以用滑鼠把文字區塊選起來,然後點一個小圖示或是用滑鼠點擊選單就做到把那個區域的前後補上<small>…</small>這樣的標籤。雖然 vim 有這麼多強大的功能,有取代、置換、幫你幹嘛幹嘛的,… 難道,就是這樣了嗎? vim 真的不行了嗎?
怎麼可能?只不過這次,我們必須要把前面許多已經討論過的方式綜合在一起使用,而今天使用的就是其中之一的選擇模式(visual mode),透過熱鍵的設定 (Key mapping),就可以輕鬆做到用滑鼠選擇然後按一次鍵就完成目標的事情。
如果你還不太清楚 vim ,建議你可以先參考下列數篇:
- 《不是打 vi 的廣告,出入 vim 及模式選擇》
- 《不是打 vi 的廣告, vim 的暫存區 register 功用》
- 《不是打 vi 的廣告, vim 的選擇模式 ( visual mode )》
一般來說,如果我們想要做到讓 ABCDE 這串東西,變成 <small>ABCDE</small> 的話,照前面我們談過的作法,你可能會想到用:
:%s/ABCDE/<small>ABCDE</small>/g
或者是:
:%s/ABCDE/<small>\1</small>/g
但是如果 ABCDE 這種東西變多了,就是說你有許多不一樣的這些東西都要給上標籤(tag),這種%s的作法,別說你覺得累,我都覺得厭煩。
現在,就請你把 vim 打開,隨意輸入一些字,並且進入指令模式下。
(如果你還沒有 vim ,可以到 vim 的網頁 下載)
先把答案給你看:
:vmap <C-S> s<small><C-R>”</small><ESC>

當你輸入這串指令後,試試看用滑鼠選擇,或是和我一樣用鍵盤以 v 加上游標,選取剛才你隨意輸入的那些字,然後按下CTRL+S (就是上面的<C-S>),你就會發現選擇的那塊文字的前後都被加上了<small> </small>。

基本的語法是這樣: [mode(模式)] [熱鍵] [執行指令]
所以回過頭來看我們的「答案」:
:vmap <C-S> s<small><C-R>”</small><ESC>
「vmap」 用來告訴 vim 這樣的按鍵設定只在選擇模式下才使用,
「<C-S>」 就是代表我們的「熱鍵」,意即 CTRL+S。如果你想要的是 ALT+S,那就是<A-S>。
至於後面那一串 s<small><C-R>”</small><ESC> 自然就是我們輸入的指令:
- 「s」 代表取代;就是說現在選的這個區塊將會被後面的東西所取代;
- 「<C-R>」 代表 CTRL+R,這是呼叫 vim 裡面使用的 registers(暫存器),而它呼叫的就是「”」這個暫存器,這個暫存器會把在選擇模式 (visual mode) 下用到的 d, c, s, x 等指令「抓取」到的文字區塊,放到「”」這個暫存器裡面(如果你不清楚它們的用法或意義,可以使用 :help d , :help c , :help s, :help x 來查詢)。前面既然我們才剛剛使用過「s」,很明顯,就代表剛剛用滑鼠(或者你和我一樣都用鍵盤)選取到的區域就是放在「”」暫存器裡面,然後把在編輯器上面選擇的區域清除,並且進入輸入的模式。
- 再看後面的指令:「<small><C-R>”</small>」這意思是說,先輸入一個「<small>」然後用CTRL+R把「”」暫存器裡面的東西拉出來(還記得「”」裡面裝什麼吧?),然後補上「</small>」,最後為了要讓輸入模式轉到指令模式下,用了「<ESC>」。
如果你不想再用這個設定了,可以用:
:vunmap
來取消。
好啦,所以同樣的方式你一樣可以用在其他的模式下,相關的詳細使用你可以參考:
:h key-mapping
February 6th, 2007 at 11:08 pm
以前我也是用vim
但很多指令記不起來
我記性很差的>.
February 6th, 2007 at 11:40 pm
如果不打算用到 vim 指令功能的話,其實無所謂用 vim。
notepad一樣能滿足編輯的需求。
自己用 vim 則是想到要做什麼事情,才會去找看看怎麼用 vim 達到。用了幾年,自然不需要去記它就熟了。儘管是這樣說,vim的功能可能自己還用不到10%。
February 10th, 2007 at 8:36 am
[…] 紅塵一隅間拾得 » 不是打 vi 的廣告, vim 選擇模式下的熱鍵( Key mapping ) (tags: Tech Tips Vim) […]
February 13th, 2007 at 8:11 pm
很喜歡看 blake 的 vim 專欄
資訊豐富 而且更重要的是講解詳實
讓小弟受惠良多
時隔一年多 又出現了新文章
真是高興啊
希望以後 blake 可以繼續分享心得
不要讓人等這麼久啊 ^^
February 14th, 2007 at 11:46 am
在下只是寫寫使用心得,讓使用 vim 可以變得更順手 :)
February 20th, 2007 at 11:18 pm
請問一下Blake兄:
前幾天看到有人用vim使用類似Ultra Edit的檢視記憶體功能,
回家後想試試,找遍了help文件都找不到,
請問Blake知道嗎?
February 26th, 2007 at 8:08 pm
在下只有看過別人用Ultra Edit,不太確定檢視記憶體功能為何。如果是說想要以16位元的方式來檢視文件的話,您可以試試:
:h xxd
看看是不是您要的。