关于vi/vim中:s命令的参数分隔符

Karl问道

请问下面这个命令中的等号是什么意思
:%s= *$== 删除行尾空白

这是vim初学者普遍感到疑惑的一个问题,为什么:s命令后有时候是”/”,有时候是”:”,还有时候是”=”甚至其它符号?

其实在vim的很多命令里,都允许用户自行定义分隔符。上面的命令等同于大家常见的:

:%s/ *//

只不过:s命令的参数分隔符由”/”变成了”=”。

但这样做有什么好处呢?

在上面的例子里你看不到把”/”换成”=”有什么好处,但如果你想替换的是”/usr/local/share/fonts/msfonts/simsun.ttc”这样的内容呢?如果你还使用”/”做为命令分隔符,你要对上面这个路径中的每一个”/”都使用”\”转义一下。但如果你用”=”作为分隔符的话,就不必如此了。

不仅仅:s命令可以这样做,其它具备多个参数的命令也可以,例如vimgrep命令。

看看vim中文手册里怎么说吧::help E146

18 thoughts on “关于vi/vim中:s命令的参数分隔符”

  1. 请教一个问题。
    我在家里的opensuse11.0上面使用vim71的时候。
    ctrl+x ctrl+n/p 能够显示粉红色的候选单词列表。
    在公司的suse10上面,使用vim64.
    ctrl+x ctrl+n/p 完全不显示候选单词列表。
    而且明明有多个候选单词,它直接给我一个唯一匹配,其实明显不是唯一匹配。
    偶尔显示多个候选单词,效果不是下拉列表形式,而是 1/2/3等的形式。
    我两边的vimrc都是一样的。没有使用自加的 .vim插件。也没有设置一些特殊的vim选项(凡是设置的我自己都明白什么意思)。

    这是为什么啊?

  2. @Easwy
    我在 vim主页下载了vim72源码包。安装在公司机器上。安装目录是/usr/local/share/vim/vim72
    并把原先的vim rpm -e 了。原先的vim在/usr/share/vim/vim64目录下面。

    同样的vimrc,但是中文就变成乱码了。也非完全乱码,一个汉字接着~Q~k等等奇怪的字符,然后又是一个汉字。总之是某些汉字夹杂着许多不识别的字符。汉字都是正确的解码汉字(也就是文中原来的汉字,但是有些汉字变成了乱码)。

    我反复试了
    set encoding=utf-8
    set termencoding=utf-8
    set fileencoding=utf-8
    set fileencodings=utf-8,ucs-bom,gbk,big5,gb2312,gb18030

    特别是第四个选项,我大小写,zh-CN.UTF-8等等,都是一样的乱码效果。

    其中,我suse安装的是中文版。echo $LANG 显示zh-CN.UTF-8.

    能请教一下如何处理吗?

  3. @伐木丁丁
    你知道你这个文件确切编码吗?如果知道,把fileencoding的值设成这个编码值看一看,不知道的话,你可以用:set fileencoding命令设置成各种编码值,看看在哪个值下不会出现乱码。
    另外,建议把fileencodings的值调整一下,把ucs-bom放在第一位:
    set fileencodings=ucs-bom,utf-8,gbk,big5,gb2312,gb18030

    给出我的设置做为参考:
    我的设置中前三个和你相同,第四个稍有不同
    set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,sjis,euc-kr,ucs-2le,latin1

  4. @Easwy
    搞定了,原来是编译vim72的时候采用的是 ./configure && make && make install
    应该 ./configure –enable-multi_byte

    谢谢指点。

    今天顺便把你的教程从序言到19章全看了一遍。写的很好。非常感谢你这样热心的人。

  5. 请教一个问题。

    :%s= *$== 这个命令直接就可以使用吗?要不要做类似awk的 FS之类的设置?
    要不然vim怎么知道我是用/作分隔符还是用=还是:等等。

    我看了一下E146。他说只要不是字母和数字,以及” | 等就可以。
    问题是vim怎么识别的,会不会用 =:=:=:之类把它搞晕了。

  6. @伐木丁丁
    不需要设置FS,vi会把s后面的那个字符当做分隔符,也就是说s后面如果是/,那么分隔符就是/,如果s后面是=,分隔符就是=
    分隔符只能是单个字符,不能使用多个字符做为分隔符的。

  7. 再请教博主:在vim中查找替换时,中文字符被当做一个字符,我想当做把它当做两个字符看待,应该怎么设置?

发表评论

电子邮件地址不会被公开。 必填项已用*标注