106.07.01 vim 括號自動配對

大括號 {} 的示範如下



也就是按下 { 時自動生出 } 並把游標停在中間
同理,()、[]

更清楚的圖示:( | 表示游標位置)
(  -->  (|)
[  -->  [|]
{  -->  {|}

但是若按了 () 總不能跑出 ()) 吧 (我之前就是因為會這樣才放棄括號自動配對,不過解決了
照理說要這樣:
()  -->  ()|
[]  -->  []|
{}  -->  {}|

其他特殊功能:
{<enter>  --> 
{
    |
}
'   -->  '|'
"   -->  "|"
''  -->  ''|
""  -->  ""|

同樣在 .vimrc 裡解決
以下是我修改網路上的,符合我的使用習慣即可
來囉OuO  (角括號註解是因為C++會用到 << 運算子
inoremap ( ()<Esc>i
inoremap [ []<Esc>i
"inoremap < <><Esc>i
inoremap {} {}<Esc>i
inoremap {<CR> {<CR>}<Esc>ko
inoremap ) <C-R>=ClosePair(')')<CR>
inoremap ] <C-R>=ClosePair(']')<CR>
"inoremap > <C-R>=ClosePair('>')<CR>
inoremap } <C-R>=ClosePair('}')<CR>
inoremap " <C-R>=QuoteDelim('"')<CR>
inoremap ' <C-R>=QuoteDelim("'")<CR>

function ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
        return "\<Right>"
    else
        return a:char
    endif
endf

function QuoteDelim(char)
    let line = getline('.')
    let col = col('.')
    if line[col - 2] == "\\"
        "Inserting a quoted quotation mark into the string
        return a:char
    elseif line[col - 1] == a:char
        "Escaping out of the string
        return "\<Right>"
    else
        "Starting a string
        return a:char.a:char."\<Esc>i"
    endif
endf

希望接下來能夠達到刪除對應括號啦,繼續努力OuO

參考資料:
nemtsov/match_parens_brackets.vim
VIM中括号的自动补全与删除
Vim 自动补全成对的括号和引号


----補充----
因為括號補全,所以上次106.06.29 vim abbreviation設定自動產生 _main 就會多出一個 }
所以有使用的可以改成:
autocmd BufRead,BufNewFile *.h,*.c
            \:iab <buffer> _main #include <stdio.h>
            \<CR>
            \<CR>int main(int argc, char *argv[]){
            \<CR>
            \<CR>return 0;
            \}<BS><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;
            \}<BS><UP><C-R>=Eatchar('\m\s\<bar>\r')<CR>

沒有留言:

張貼留言

^ Top