1. 已經在編輯狀態(insert mode)了,如何快速執行 normal mode 的命令?
在編輯文本時,需要快速定位到某個位置,如下一個 d 的位置,難道要
<ESC>、fd、i 這般繁瑣嗎?
其實,使用 Ctrl-O 就可以臨時切換到 normal mode, 執行一個命令後自動返回 insert mode。
於是上述命令序列可以改為:
Ctrl-O、fd 即可。
Ctrl-O 要按兩個鍵呢,很麻煩,於是來個 keymap
" make ` functions <C-O> in insert mode
inoremap ` <C-O>
nnoremap ` i`<ESC>
在 normal mode 下按 ` (左上角那個),會正常插入 `,
而在 insert mode 下則相當於按 Ctrl-O,
於是上述命令序列又可簡化為
`fd 即可。
在 insert mode 想粘貼剪貼板內容時,可以輸入 `P,爽吧?
這樣就可以在 insert mode 下天馬行空,不用再按 <ESC>和a 切來切去了。
2. vim 的剪貼板怎麼怪怪的?
用 y 命令拷貝的文本怎麼不能在 X/Windows 的其它應用中使用呢?
事實上,vim 有多個所謂寄存器來寄存剪切的內容。
平時是不是只用 y <motion> 和 p 命令呢?
其實這時使用的是 unamed 寄存器(對應寄存器*,不知對否?),即沒有給定名稱的,
而給定名稱的,可以加前綴 "r 使用。
例如,將當前行放到寄存器a中,輸入: "aY
將另一行(先移到其它行)放到寄存器b中,輸入: "bY
粘貼寄存器a,輸入:"aP
粘貼寄存器b,輸入:"bP
好了,扯遠了,X/Windows 的剪貼板的內容是存在寄存器+中,不信,自己試試:"+P
能不能將簡單的 y 和 p命令與系統剪貼板聯系起來呢?
就這句,浪費了我許多口水:)
set clipboard+=unnamed " set clipboard
3. 我不要每次都輸入 this_object.set_...
呵,在 C 的結構或 C++ 的對象設置時,那個結構名或對象名總是重復 n 次要輸入,挺煩的:(
添加這兩句到配置文件中吧:
" Ctrl-F to yank line upstairs
inoremap <silent> <C-F> <C-O>:exe "norm! kly0jPD"<CR>
這是在編輯模式中使用的,怎麼個用法?舉個例子吧(括號內是我的注釋):
(在編輯模式下,先輸入這句:)
this_object.set_height(1.80);
( ^)
( )
(用<tab>啊,空格啊移到箭頭所示處,即h處,然後按Ctrl-F)
(自動補全成:)
this_object.set_
(於是你可以繼續輸入"weight(100);" 了)
不知大家明白沒有,不明白的先試試:)
4. 我想注釋一堆 C++ 代碼
當然,這有許多種我不知道的方法,我的通用方法為,先在配置文件裡添加:
vnoremap . :normal .<CR>
呵,一句就夠了,示例如下:
假設你有如下幾行代碼需要注釋:
this_object.set_height(1.60);
this_object.set_weight(100);
this_object.run();
你先移到第一行,輸入 I//<ESC> (<ESC>就是ESC鍵),將第一行注釋。
然後移到第二行,按 V 進行 line visual mode,按 j 或其它方向移動鍵選好要注釋的所有代碼行,
最後按: .
是不是很神奇?
呵,說白了,這只是在 visual mode 裡使用 redo 的功能而已,有點跑題了。
當然,殊途是同歸的,只是路的長遠而已。
這是條通用的路,可以用在很多地方。
回到主題,誰有更直接的辦法注釋一堆 C++ 代碼?一堆 C 代碼呢(用/* */ 風格) ?
5. vi 的自動完成有什麼新奇的東東?
不就是根據 buffer 的內容來自動完成嗎?
有些插件是可以動態地讀取頭文件或模塊來提供自動完成的,例如 python 的 pydict。(此列表待補全:)
我想介紹的是 vi 基於字典的自動完成:
1. 增加基於字典的自動完成
set complete+=k "add dictionary complete
2. 設定字典文件,字典文件其實是個文件文件,每個單詞占一行
(以下字典文件可能並不存在)
set dictionary=/usr/share/dict/Words "set dictionary
3. 呵,因此我是不用什麼英文字典來自動完成的,很少寫英文文章,使用字典後反應很慢。
我用基於字典完成的原因是,使用編輯語言的關鍵字自動完成,見:
" complete from filetype syntax file
autocmd Syntax * execute "setlocal dictionary=".$VIMRUNTIME."/syntax/".getbufvar("%","current_syntax").".vim"
對應的語言語法文件必須存在才可使用,於是寫新的 C 文件時,可以直接 inc<Ctrl>-N, cont<Ctrl>-N
(請大家不吝賜教,to be continued)
編輯者: zslevin (10/16/04 10:53)