1

新手来了 我正在寻找一种更简单的方法VIM来评论/取消评论(只有一行评论,这是最常见的评论类型),C++只使用像+这样快捷方式(不进入可视模式)的代码。不使用 nerd 等 3rd 方插件,是否可以通过映射实现这种效果?谢谢Ctrl/

4

2 回答 2

5

我通过以下映射实现它(leader/评论,leader?取消评论)

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我通过我经常使用的//-comment 语言应用映射:

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>
于 2013-11-13T17:04:08.973 回答
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>
于 2013-11-13T18:27:22.193 回答