2016-09-13 40 views
0

注:巴符號(|)代表整個這個問題如何製作僅適用於特定情況的密鑰綁定?


我已經做了一個UltiSnips片斷這樣的編輯器插入記號:

snippet "(\w+)" "HTML tag" r 
<`!p snip.rv = match.group(1)`>$0</`!p snip.rv = match.group(1)`> 
endsnippet 

這讓我展開任何字成一個HTML標籤,例如輸入「body」並按下標籤擴展爲<body>|</body>

插入符號位於標籤之間。現在當我按回車鍵,我想直到結束:

<body> 
    | 
</body> 

這可以通過這樣的熱鍵綁定來實現:

:ino <buffer> <CR> <CR><Esc>O 

但我並不想永久重新綁定我的返回鍵。當我的插入符號位於開始和結束HTML標記之間時,我只希望該特定的keybind處於活動狀態。

這怎麼能做到最簡單?


另一個例子是,當我有我的插入符號放置在兩個大括號之間,就像這樣:

function() {|} 

並按下Enter鍵,我想結果是:

function() { 
    | 
} 

再次,這可以通過上面的關鍵映射來完成,但在這種情況下,我只希望它在我的脫字符位於兩個大括號之間時處於活動狀態。

回答

0

你可以使用地圖表達(見:h map-expression)來決定什麼是否<CR>被映射到時候你打它:

例如以下插入模式地圖:

inoremap <expr> <CR> strpart(getline('.'), col('.')-2, 1) =~ '[>{]' ? '<CR><ESC>O' : '<CR>' 

檢查在光標之前的字符和如果其>{它在其他情況下返回<CR><ESC>O它只是做<CR>

代替有條件的三元表達式,您可以定義一個完整的功能函數,以便在任何狀態下與任何對進行響應;但是已經有很棒的插件可以很好地完成這些任務:

demilitMateauto-pairs是兩個有名的插件。

給他們一個嘗試。

0

我在lh-brackets實現這一點,我記得我給的答案非常密切的問題在這裏:How to move opening curly braces to a new line in Vim?

我定義它:

call lh#brackets#enrich_imap('<cr>', 
     \ {'condition': 'getline(".")[col(".")-2:col(".")-1]=="{}"', 
     \ 'action': 'lh#brackets#_add_newline_between_brackets()'}, 
     \ 0, 
     \ '\<cr\>' 
     \) 

如果要區分語言的情況下,如果您有inoremap <buffer> <expr>測試上下文(請參閱上面的測試)返回"<cr>""<cr><esc>O",則必須爲c(以及所有其他基於括號的語言),xml(以及其他基於標記的語言)提供ftplugins。

" to be put in c, js, java, c#... ftplugins 
inoremap <buffer> <expr> <cr> getline(".")[col(".")-2:col(".")-1]=="{}" ? '<cr> : '<cr><esc>O' 

" to be put in a xml and HTML ftplugin 
inoremap <buffer> <expr> <cr> getline(".")[col(".")-2:col(".")-1]=="><" ? '<cr> : '<cr><esc>O' 

你也可以在你的vimrc全局定義它們,但隨後,它會觸發所有的時間 - 測試將需要在這種情況下,要合併。

相關問題