vim:将键映射到带有缩进的注释
在.vimrc中使用“+”和“-”进行注释之前,代码已突出显示:vim:将键映射到带有缩进的注释,vim,comments,mapping,indentation,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 x; } 但是,我尝试使用: nore
noremap <silent>+ :s/^/\/\/ /<CR>:noh<CR>
noremap <silent>- :s/^\/\/ //<CR>:noh<CR>
我想用缩进注释代码,如下所示:
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>
我想知道我的映射出了什么问题,以及如何修复它
此外,是否有一种“更聪明”的方法来做到这一点
(我愿意学习编写映射,而不是安装NERDcommenter之类的插件)
谢谢
更新:
也许我没有把我的问题说清楚,所以下面有一些答案没有明白我的意思
非常感谢所有试图回答我问题的人,我发现Ben的解决方案对于初学者来说是最容易理解的,rc0r的线条更少,而且它可以处理多层次的缩进(尽管我不知道它真正的作用,但我稍后会进行一些自学)
现在我使用的代码如下所示:
int main() {
// int x = 0;
int y = 0;
return x;
}
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
if有(“autocmd”)
autocmd文件类型c、cpp、java、verilog noremap.:s:^\(\s*\):\1/::noh
autocmd文件类型c,cpp,java,verilog noremap,:s:^\(\s*\)/:\1::noh
autocmd文件类型sh、zsh、python、perl、ruby noremap.:s:^\(\s*\):\1::不
autocmd文件类型sh、zsh、python、perl、ruby noremap、:s:^\(\s*\)\:\1::noh
autocmd文件类型vim noremap.:s:^\(\s*\):\1::不
autocmd文件类型vim noremap,:s:^\(\s*\)“:\1::noh
autocmd文件类型asm noremap.:s:^\(\s*\):\1;::诺
autocmd文件类型asm noremap,:s:^\(\s*\);:\1::noh
autocmd文件类型vhdl,sql noremap.:s:^\(\s*\):\1--::不
autocmd文件类型vhdl,sql noremap,:s:^\(\s*\)-:\1::noh
恩迪夫
这对我来说已经足够好了。你说你在视觉选择上使用地图 因此,问题在于映射中的初始
:left
命令结束了视觉模式,因此下一个:s
命令仅作用于当前行,而不是整个视觉选择
您有两个选择:
gv
在最后一次视觉选择时返回视觉模式:”毫无疑问有更好的方法:)但是
noremap <silent>+ :le<CR>gv:'<,'>s/^\/\/ ../\/\/ /<CR>gv==:noh<CR>
到
没有时间解决取消注释的问题,也没有时间解决如何最好地不重复替换项中的位您的命令将/
添加到行的开头,因为您忘记考虑空格:
:s/^\s*/\/\/ /
但是您应该使用插件。我不是设置vim地图的专家,但是通过稍微修改搜索和替换模式,您的初始地图应该可以做到:
noremap <silent>+ :s:^\(\s*\):\1// :<CR>:noh<CR>
noremap <silent>- :s:^\(\s*\)// :\1:<CR>:noh<CR>
noremap+:s:^\(\s*\):\1/::noh
noremap-:s:^\(\s*\)/:\1::noh
上述用于注释的正则表达式在行首(^\(\s*)
)搜索可变数量的空格字符,并将找到的模式替换为自身(使用反向引用\1
),后跟注释字符(\1/
)。上面显示的第二个正则表达式以类似的方式删除注释字符:搜索后跟注释字符(^\(\s*\)/
)的可变数量的空格,并将所有空格替换为空格(back reference\1
)。这对您有用吗?每一行都将缩进,但不一定都在同一缩进级别。例如,使用像vim Commentation这样的插件获取有关vim正则表达式检查的更多信息。
int main() {
// int x = 0;
// int y = 0;
return 0;
}
:s/^\s*/\/\/ /
noremap <silent>+ :s:^\(\s*\):\1// :<CR>:noh<CR>
noremap <silent>- :s:^\(\s*\)// :\1:<CR>:noh<CR>