Vim:在新行自动注释

Vim:在新行自动注释

当我从注释掉的行开始新行时,Vim 会自动插入注释,因为我已经设置了formatoptions=tcroql。例如(光标为*):

// this is a comment*

在进入<Enter>(插入模式)或o(正常模式)后,我剩下:

// this is a comment
// *

在编写较长的多行注释时,此功能非常方便,但我通常只想要单行注释。现在,如果我想结束注释系列,我有几个选择:

  • <Esc>S
  • <BS>三次

这两个都需要三次击键,加上这<Enter>意味着要四次击键才能换行,我认为这太多了。理想情况下,我只想再按<Enter>一次,然后剩下:

// this is a comment
*

重要的是,该解决方案也适用于不同的缩进级别,即

int main(void) {
    // this is a comment*
}

<Enter>

int main(void) {
    // this is a comment
    // *
}

<Enter>

int main(void) {
    // this is a comment
    *
}

我记得几年前在某个文本编辑器中见过这个功能,但我不记得是哪个了。有人知道在 Vim 中能帮我实现这个功能吗?也非常欢迎指点如何推出自己的解决方案。

答案1

尝试这个:

function! EnterEnter()
  if getline(".") =~ '^\s*\(//\|#\|"\)\s*$'
    return "\<C-u>"
  else
    return "\<CR>"
  endif
endfunction

imap <expr> <CR> EnterEnter()

答案2

我扩展了@romainl 的答案,通过从 Vim 生成正则表达式来处理任意语言&commentstring

function! s:IsOnlyComment(getlineArg)
  let commentRegex='^\s*'.substitute(&commentstring,'%s','\\s*','').'$'
  return strlen(matchstr(getline(a:getlineArg), commentRegex)) > 0
endfunction

function! SmartEnter()
  if s:IsOnlyComment('.')
    return "\<Esc>S"
  else
    return "\<CR>"
  endif
endfunction

inoremap <expr> <CR> SmartEnter()

但是,我似乎根本无法重新映射<CR>,这根本行不通。目前,我会一直使用,<CR><CR>直到这个问题解决。

答案3

从 'formatoptions' 中删除 r。这就是该选项的作用。关闭它将意味着 vim 永远不会为你做这件事,这意味着当你确实需要它们时,你将需要添加前导注释标记,但这就是权衡。

相关内容