2011-08-25 42 views
20

是否有Vim插件可以處理智能分號插入,就像Eclipse中的插件一樣?Vim智能插入分號

實施例(豎線是插入光標):

foobar(|) 

I型分號:

foobar();| 

類似地:

foobar("blah|") 

I型分號:

foobar("blah");| 

如果我想在原來的光標位置分號,我按空格鍵智能重新定位後:

foobar("hello|") 
foobar("hello");| 
foobar("hello;|") 
+1

而如果你想在你的字符串文字裏面實際上有一個分號呢? –

+2

在Eclipse中,在智能分號插入後按下退格鍵會將分號放在原始光標位置。 – dteoh

+4

理想的解決方案:使用Python。那麼你不需要擔心分號;-) –

回答

24

我用這個映射:

inoremap <leader>; <C-o>A; 

這不是;因爲我使用分號經常和不止一種情況下。

  • <C-o>用於輸入單個正常模式命令。
  • A;的意思是「在行末添加一個;」。
+3

@dansomething:哦,是的!自從那個答案以後,我在'〜/ .vimrc'中多次修改了這一行。這裏是目前的化身:inoremap ; m' A; '' – romainl

+0

隨着你的映射,vim等待每個按鍵上的第二個字符。 – Koshimitsu

+0

@Koshimitsu這是標準行爲,你只有在你自己停下來的時候纔會注意到它。 – romainl

0
" ftplugin/c/c_snippet.vim 
inoremap <expr> <buffer> ; getline('.')[col('.')-1:-1]=~')$' ? '<right>;' : ';' 

,如果你的代碼片段引擎擴展成

for (...|) { 
    <+code+> 
}<++> 

如果打開支架是一個換行符此版本不應構成與for的問題,它會搞亂了。

你可以很容易地將正則表達式更改爲'"\=)\+$'來回答你最初的問題。

inoremap <expr> <buffer> ; getline('.')[col('.')-1:-1]=~'"\=)\+$' ? '<end>;' : ';' 

但是,我不認爲這是一個好主意。在這種情況下,對於<bs>映射將是:

inoremap <expr> <buffer> <bs> getline('.')[:col('.')-2] =~ '.*")\+;$' ? '<bs><c-o>F";' : '<bs>' 
10

我想要做同樣的事情,我就可以了整整一夜的工作,大量代碼,但最後,我有一個簡單的解決方案。

inoremap ;<cr> <end>;<cr> 

,如果我在一撐,我想補充一個分號或在最後一個點,這樣

foo({ 
    | 
}) 

我按;;<cr>..<cr>做到這一點

inoremap ;<cr> <end>;<cr> 
inoremap .<cr> <end>. 
inoremap ;;<cr> <down><end>;<cr> 
inoremap ..<cr> <down><end>. 
2

我使用以下函數和映射將分號插入行的末尾並刪除重新生成空格:

imap <leader>. <C-R>=Semicolonfun()<CR> 
fun! Semicolonfun() "{{{ 
    call setline(line('.'), substitute(getline('.'), '\s*$', ';', '')) 
    return "\<End>" 
endfunction "}}} 

所以,如果你有這樣的:

log.warning("you miss the |identifier") 

緊迫。要麼 ,。如果您重新映射的領導者,你會得到如下:

log.warning("you miss the identifier");|