通过绑定在 Vim 中插入制表符只能执行一次

Inserting a tab in Vim through a bind works only one time

我做了一个插入模式绑定(左大括号 + Enter),它在下一行输入一个制表符(4 个空格),然后是一个右大括号。

inoremap {<Enter> {<Enter><Enter>}<Up><Tab>

例子:

fn foo() {
    // Some code
}

它工作正常,但是当我再次尝试使用绑定时它不会再插入制表符,只是一个新行和一个括号。

fn bar() {
    if condition {
    loop {
    // Some more code
    }
    }
}

它并不漂亮,但我认为这可能会实现您的目标:

inoremap {<Enter> {<Enter><Tab><Enter>}<Esc><<<Up>A

编辑:我的解决方案之前有一个错字。如果最初不起作用,请重试

我个人建议改用缩写,这样就不会出现奇怪的延迟。

下面使用"rails.vim" like RailsExpand函数。放入 vimrc 文件:

function! RailsExpand(root, good, ...)
  let c = nr2char(getchar(0))
  echom c
  if c == "" || c =~ (a:0 ? a:1 : "\t")
    return a:good
  else
    return a:root . c
  endif
endfunction

iabbrev { <c-r>=RailsExpand('{', "{\<lt>cr>}\<lt>c-o>O\<tab>", '\r')<cr>

就我个人而言,我更喜欢在 <tab> 而不是 <cr> 上进行扩展,因此您可以使用:

iabbrev { <c-r>=RailsExpand('{', "{\<lt>cr>}\<lt>c-o>O\<tab>")<cr>

您不需要自己插入 <Tab>

inoremap {<CR> {<CR>}<C-o>O

O 将在当前行上方新开一行,缩进的数量和类型正确。