如何在Vim编辑器中为自定义命令添加变量实现指定行注释?
解决Vim自定义注释命令的问题
刚接触Vim的时候,自定义命令确实容易踩坑,我来一步步帮你搞定这个需求!
首先你之前的写法不对,是因为没搞清楚Vim自定义命令里范围参数的处理方式——你用的$1,$2是用来获取命令的额外参数的(对应-nargs),但行范围需要用-range参数配合内置的<line1>和<line2>变量来处理。
正确的自定义命令写法
假设你想给指定行添加//注释(毕竟你说的是“注释文件中指定行”,我猜你之前的ex命令可能写反了,应该是在行首插入//),可以在Vim里输入这个命令来定义:
command! -range Comment <line1>,<line2>s/^/\/\//
如果你的需求是取消注释(也就是移除行首的//),可以再定义一个反向命令:
command! -range Uncomment <line1>,<line2>s/^\/\///
拆解每个部分的作用
command!:!表示如果已经有同名命令就覆盖它,如果你不想覆盖,去掉!用command就行-range:告诉Vim这个命令支持接收行范围(比如3,5这种),默认情况下,如果你不指定范围,它会处理当前行<line1>和<line2>:Vim内置的变量,自动获取你指定的范围的起始行和结束行s/^/\/\//:这是替换命令,把行首(^)替换成//——因为/在Vim的替换命令里是分隔符,所以要转义成\/s/^\/\///:反过来,把行首的//替换成空,实现取消注释
怎么使用这个命令
- 处理当前行:直接输入
:Comment(或者:Uncomment) - 处理指定行范围:比如输入
:2,10Comment,就会给第2到10行添加注释 - 可视模式下处理:选中你要操作的行,然后输入
:Comment,Vim会自动把选中的范围转换成<line1>,<line2>
额外优化(可选)
如果想让命令默认处理整个文件,可以把-range改成-range=%,比如:
command! -range=% Comment <line1>,<line2>s/^/\/\//
这样直接输入:Comment就会给整个文件加注释,当然你还是可以指定范围覆盖默认值。
内容的提问来源于stack exchange,提问作者shashank
相关产品推荐
相关产品推荐

