說真的要用的話光vim好玩的地方就夠玩很久而且似乎永遠玩不完OuO
本文主要是我對配置又有些突破了
著重在abbreviation部分(:iab、:ab)
完成結果如下GIF:
只要輸入 _main 自動將include到return 0;都產生完畢
所有修改部分僅在.vimrc內就可以達到
首先說明以下程式碼
:iab #i #include <><LEFT>在i模式輸入 #i 後按空白或enter會產生#include <>而且游標是停在<>中間的
不過有個地方造成嚴重困擾
就是按空白或enter的結果都不一樣,而且都不是我要的OAO
然後查超久
原本以為使用<BS>可以砍掉最後出現的
但是它是把整段指令貼完後才在最後加入剛輸入的字元(空白或enter)
所以使用<BS>並不能刪到
最後發現可以使用getchar來把最後輸入的字元吃掉
首先要先建立一個函式
func Eatchar(pat) let c = nr2char(getchar(0)) return (c =~ a:pat)? '': c endfunc這樣就可以在後方加入以下程式碼來吃掉最後輸入的字元
<C-R>=Eatchar('\m\s\<bar>\r')<CR>範例:
:iab #i #include <><LEFT><C-R>=Eatchar('\m\s\<bar>\r')<CR>不論接下來按空白還是enter就會長得像下面那樣OuO
至於我一開始的GIF是怎麼達到的呢?
autocmd BufRead,BufNewFile *.h,*.c \:iab <buffer> _main #include <stdio.h> \<CR> \<CR>int main(int argc, char *argv[]){ \<CR> \<CR>return 0; \<CR>}<UP><UP><C-R>=Eatchar('\m\s\<bar>\r')<CR> autocmd BufRead,BufNewFile *.hpp,*.cpp \:iab <buffer> _main #include <iostream> \<CR>using namespace std; \<CR> \<CR>int main(){ \<CR> \<CR>return 0; \<CR>}<UP><UP><C-R>=Eatchar('\m\s\<bar>\r')<CR>簡單說明一下autocmd BufRead,BufNewFile可以偵測開啟檔案的副檔名並作相對應動作
所以同樣的 _main 在.c跟.cpp產生出來的是不同的程式OuO
參考資料:
Cursor position in VIM abbreviation
How to Eatchar in a multi-line Vim abbreviation
How can I make VIM behave differently for different filetypes?
vimrc設定教學 -- 成大資工 Wiki
Multi-line abbreviations
Vim documentation: insert
沒有留言:
張貼留言