Vim智能插入分号

时间:2011-08-25 08:47:41

标签: vim

是否有可以处理智能分号插入的Vim插件,就像Eclipse中的插件一样?

示例(管道符是插入光标):

foobar(|)

我输入分号:

foobar();|

类似地:

foobar("blah|")

我输入分号:

foobar("blah");|

如果我想在原始光标位置使用分号,请在智能重新定位后按退格键:

foobar("hello|")
foobar("hello");|
foobar("hello;|")

7 个答案:

答案 0 :(得分:25)

我使用这种映射:

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

它不是;,因为我经常使用分号并且在多个上下文中。

  • <C-o>用于输入单个正常模式命令。
  • A;表示“在行尾添加;”。

答案 1 :(得分: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 :(得分:5)

您应该尝试Cosco.vim插件。

答案 3 :(得分: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");|

答案 4 :(得分:1)

inoremap <expr> ;<cr> getline('.')[-1:] == ';' ? '\<Nop>' : '<End>;<CR>'

上面的代码将检查行尾是否有;

如果;不存在,则它将添加;,否则不执行任何操作。

答案 5 :(得分:0)

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

如果您的代码段引擎将其扩展为

,则此版本不会对for造成问题
for (...|) {
   <+code+>
}<++>

如果开放式支架在换行符上,它会搞砸。

您可以轻松地将正则表达式更改为'"\=)\+$'以回答您的初始问题。

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

但是,我认为这不是一个好主意。在这种情况下,<bs>的映射将为:

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

答案 6 :(得分:0)

对于vscode vim用户:

"vim.insertModeKeyBindings": [
      {
        "before": [";", ";"],
        "after": ["<Esc>","A",";"]
      },
    ],

我受到romainl's answer above的启发,但是<C-o>似乎在vocode vim中存在切换问题,因此只需使用<Esc>即可。