2016-02-29 137 views
2

我是C#開發人員,我是使用Vim的新手。我很好奇,你怎麼把你的.vimrc文件,這樣當你鍵入一個大括號,並按下回車鍵,這樣的:如何在Vim中將開口大括號移動到新行?

public void Foo() {<Enter> 

那支具被換上了新的生產線,並插入符移動到內臟的大括號,如下:

public void Foo() 
{ 
    | 
} 

任何幫助,將不勝感激,謝謝!

+0

這將是一個很好的問題https://vi.stackexchange.com/ – Sukima

回答

2

你提的問題是非常接近auto-close plugin issuse with curly brackets其中

inoremap <expr> <cr> getline(".")[col(".")-2:col(".")-1]=="{}" ? "<cr><esc>O" : "<cr>" 

回答了這個問題 - 這是有點什麼我在lh-brackets使用。

在這裏,你似乎沒有使用任何包圍插件。要搜索的文本變爲'\S\s*{$',並且您可以插入:<BS><cr>{<cr>}<esc>O,或者只有{就行。如果光標在{}之內,則還應該集成先前的測試。 這成爲:

inoremap <expr> <cr> 
    \ getline(".") =~ '\S\s*{$'     ? "<bs><cr>{<cr>}<esc>O" 
    \ : getline('.') =~ '^\s*{$'     ? "<cr>}<esc>O" 
    \ : getline(".")[col(".")-2:col(".")-1]=="{}" ? "<cr><esc>O" 
    \ :            "<cr>" 
0

有很多方法來編程。正如一個例子,我可以這樣做:

inoremap {<Cr> <Esc>:call AutoBracketDrop()<Cr>a 

function! AutoBracketDrop() 
    if col('.') == col('$') - 1 
    substitute /\s*$// 
    exec "normal! A\<Cr>{\<Cr>X\<Cr>}\<Esc>k$x" 
    else 
    exec "normal! a{\<Cr>\<Esc>" 
    endif 
endfunction 

首先,我添加插入地圖,可中止插入並調用AutoBracketDrop功能,完成後進入返回到插入模式。

函數只檢查遊標列是否與行的最後一列匹配。如果是這樣,我們刪除尾隨空白和追加測試:

cursor is here> 
{ 
X 
} 

因爲採用<Cr>應該保持縮進如果您鍵入他們。我們必須有一個標記X,否則Vim將刪除空行中的空格,並繼續追加(a)將使壓痕鬆動。這樣,文本最終成爲:

cursor was here> 
{ 
    X 
} 

然後我們向上移動光標一行,刪除X和退出功能。

如果它位於該行的中間,我們只需簡單地重新創建用於觸發映射的鍵入的字符。

相關問題