在我使用.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
对我来说效果很好。
答案 0 :(得分:0)
你说你在视觉选择上使用地图。
问题是,映射中的初始:left
命令结束了可视模式,因此下一个:s
命令仅作用于当前行而不是整个视觉选择。
您有几个选择:
gv
返回上次视觉选择的可视模式:'<,'>s
代替普通:s
将范围明确设置为最后一次视觉选择无论哪种方式,您都应该将noremap
更改为xnoremap
,以便它仅适用于可视模式。您可以在没有nnoremap
或gv
'<,'>
映射
答案 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>