![](/img/trans.png)
[英]VIM indentation: HTML comment with <openedTag> inside comment
[英]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
命令仅作用于当前行,而不是整个可视选择。
您有两种选择:
gv
返回上一个视觉选择的视觉模式 :'<,'>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.