106.06.29 vim abbreviation設定

把沒用的plugin關一關,vim 又變快了OuO

說真的要用的話光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

沒有留言:

張貼留言

^ Top