当我从注释掉的行开始新行时,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 永远不会为你做这件事,这意味着当你确实需要它们时,你将需要添加前导注释标记,但这就是权衡。