vim:映射键以缩进注释

时间:2014-01-03 00:34:07

标签: vim comments mapping indentation

在我使用.vimrc中使用'+'和' - '注释之前,代码已突出显示:

noremap <silent>+ :s/^/\/\/ /<CR>:noh<CR>
noremap <silent>- :s/^\/\/ //<CR>:noh<CR>

所以当我评论代码时,它变成了:

int main() {
//     int x = 0;
//     int y = 0;
    return 0;
}

我想用缩进对代码进行注释,如下所示:

int main() {
    // int x = 0;
    // int y = 0;
    return x;
}

但是我尝试使用:

noremap <silent>+ :le<CR>:s/^/\/\/ /<CR>==:noh<CR>                              
noremap <silent>- :le<CR>:s/^\/\/ //<CR>==:noh<CR>

评论结果如下:

int main() {
    // int x = 0;
int y = 0;
    return x;
}

我想知道我的映射有什么问题以及如何修复它......

此外,还有一种“更聪明”的方式吗?

(我愿意学习编写映射而不是安装一些插件,如NERDcommenter)

谢谢,

更新

也许我没有把我的问题弄清楚,所以下面有一些答案没有得到我的意思......

非常感谢所有试图回答我问题的人,我发现Ben的解决方案对于初学者来说最容易理解,而且rc0r的线条较少,并且可以使用多级缩进(即使我不知道它真的是什么是的,我稍后会做一些自学。)

所以现在使用的代码如下:

if has("autocmd")
    autocmd FileType c,cpp,java,verilog noremap <silent><Leader>. :s:^\(\s*\):\1// :<CR>:noh<CR>
    autocmd FileType c,cpp,java,verilog noremap <silent><Leader>, :s:^\(\s*\)// :\1:<CR>:noh<CR>
    autocmd FileType sh,zsh,python,perl,ruby noremap <silent><Leader>. :s:^\(\s*\):\1# :<CR>:noh<CR>
    autocmd FileType sh,zsh,python,perl,ruby noremap <silent><Leader>, :s:^\(\s*\)# :\1:<CR>:noh<CR>
    autocmd FileType vim noremap <silent><Leader>. :s:^\(\s*\):\1" :<CR>:noh<CR>
    autocmd FileType vim noremap <silent><Leader>, :s:^\(\s*\)" :\1:<CR>:noh<CR>
    autocmd FileType asm noremap <silent><Leader>. :s:^\(\s*\):\1; :<CR>:noh<CR>
    autocmd FileType asm noremap <silent><Leader>, :s:^\(\s*\); :\1:<CR>:noh<CR>
    autocmd FileType vhdl,sql noremap <silent><Leader>. :s:^\(\s*\):\1-- :<CR>:noh<CR>
    autocmd FileType vhdl,sql noremap <silent><Leader>, :s:^\(\s*\)-- :\1:<CR>:noh<CR>
endif

对我来说效果很好。

4 个答案:

答案 0 :(得分:0)

你说你在视觉选择上使用地图。

问题是,映射中的初始:left命令结束了可视模式,因此下一个:s命令仅作用于当前行而不是整个视觉选择。

您有几个选择:

  1. 使用gv返回上次视觉选择的可视模式
  2. 使用:'<,'>s代替普通:s将范围明确设置为最后一次视觉选择
  3. 无论哪种方式,您都应该将noremap更改为xnoremap,以便它仅适用于可视模式。您可以在没有nnoremapgv

    的情况下在单行上为正常模式制作另一个单独的'<,'>映射

答案 1 :(得分:0)

毫无疑问,这是一个更好的方法:)但以下

noremap <silent>+ :le<CR>gv:'<,'>s/^\/\/ ../\/\/ /<CR>gv==:noh<CR>   

更改

int main() {
  //   int x = 0;
  //   int y = 0;
  return 0;
}

int main() {
    // int x = 0;
    // int y = 0;
    return 0;
}

没有时间解决这一问题,也没有找出如何最好不要重复替代

答案 2 :(得分:0)

您的命令将//添加到行首,因为您忘记考虑空白区域:

:s/^\s*/\/\/ /

但你应该使用插件。

答案 3 :(得分:0)

我不是设置vim地图的专家,但是通过略微修改的搜索和替换模式,您的初始地图应该可以解决问题:

noremap <silent>+ :s:^\(\s*\):\1// :<CR>:noh<CR>
noremap <silent>- :s:^\(\s*\)// :\1:<CR>:noh<CR>

以上正则表达式用于评论在行的开头(^\(\s*\))搜索可变数量的空格字符,并用自身替换找到的模式(使用后引用\1),然后评论的字符(\1//)。上面显示的第二个正则表达式以类似的方式删除了注释字符:搜索可变数量的空格后跟注释字符(^\(\s*\)//)并将所有内容替换为空格(后引用\1)。 / p>