是否可以使用“ctrl + /”在vim中注释/取消注释一行

时间:2013-11-13 16:57:02

标签: vim

新手在这里。我正在VIM中寻找一种更简单的方式来评论/取消注释(只有一行评论,这是最常见的评论类型)C++代码只使用一个快捷方式 Ctrl + / (无需进入可视模式)。是否可以通过映射而不使用第三方插件(例如书呆子)来实现此效果?感谢

2 个答案:

答案 0 :(得分:5)

我通过以下映射实现它( leader / 评论, leader 取消注释)< / p>

map <leader>/ :s/^\(\s*\)/\1\/\/ <CR>:noh<CR>
map <leader>? :s/^\(\s*\)\/\/\(\s*\)/\1<CR>:noh<CR>
  • ^\(\s*\)从一行的开头到第一个非空白字符匹配。
  • \1\/\/用相同的空格替换捕获的空格(\1),后跟//

剩余的内容<CR>:noh<CR>会关闭搜索模式突出显示,以免在缓冲区中突出显示所有前导空格。

我只将它们用作普通模式映射,而不是插入模式。在正常模式下(使用mapleader作为,,我可以执行 4 / 之类的操作来评论接下来的4行,但是例如,在内部{}中评论所有内容并不够聪明。

它不像NERDCommenter那样整洁。例如,它会转变:

if (thing) {
  doSomething();
}

进入这个:

// if (thing) {
  // doSomething();
// }

当这样的事情更可取时。

// if (thing) {
//   doSomething();
// }

我在autocmd - 我经常使用的评论语言中通过//应用映射:

autocmd FileType c,cpp,php,javascript map <leader>/ :s/^\(\s*\)/\1\/\/ <CR>:noh<CR>
autocmd FileType c,cpp,php,javascript map <leader>? :s/^\(\s*\)\/\/\(\s*\)/\1<CR>:noh<CR>

答案 1 :(得分:3)

他们不使用<C-/>作为键绑定,但对于非常完整的解决方案,请参阅tcomment.vimvim-commentary

我使用以下quick'n'dirty解决方案,//根据文件类型注释掉一行,但它有几个缺陷(例如.不可重复):

  " make // comment out a line
  au FileType *                            nmap <buffer> // 0i# <Esc>
  au FileType vim                          nmap <buffer> // I" <Esc>
  au FileType sh,zsh,csh,tcsh,make         nmap <buffer> // I# <Esc>
  au FileType html,xhtml,xml,xslt,dtd,xsd  nmap <buffer> // I<!-- <Esc>A --><Esc>
  au FileType sql,haskell                  nmap <buffer> // I-- <Esc>
  au FileType c                            nmap <buffer> // I/* <Esc>A */<Esc>
  au FileType cpp                          nmap <buffer> // I// <Esc>