繁体   English   中英

vim:将键映射到带有缩进的注释

[英]vim: mapping key to comment with 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

对我来说效果很好。

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

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

您有两种选择:

  1. 使用gv返回上一个视觉选择的视觉模式
  2. 使用:'<,'>s代替Plain :s可以将范围显式设置为最后一个可视选择

无论哪种方式,您都应该将noremap更改为xnoremap ,以便仅在可视模式下应用。 您可以在没有gv'<,'>一行上为普通模式制作另一个单独的nnoremap映射

毫无疑问,这是一种更好的方法:)

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;
}

既没有时间来解决未注释的问题,也没有解决如何最好的方法来不重复替换项

您的命令将//添加到该行的开头,因为您忘记了考虑空格:

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

但是您应该改用插件。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM