14

Karl问道

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

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

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

:%s/ *//

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

但这样做有什么好处呢?

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

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

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

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/vim_command_parameter_separator/

文章的脚注信息由WordPress的wp-posturl插件自动生成

文本处理

18条评论 添加评论

  1. 2009/04/14 15:05 | #1

    很好很强大!

  2. 伐木丁丁
    2009/04/14 21:29 | #2

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

    这是为什么啊?

  3. 2009/04/14 23:20 | #3

    @伐木丁丁
    vim版本太低,我记得下拉菜单似乎是vim 7.0以后才有的。
    另外,看看这个帮助手册:

    :help ‘completeopt’

  4. 伐木丁丁
    2009/04/15 20:08 | #4

    @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.

    能请教一下如何处理吗?

  5. 2009/04/15 21:22 | #5

    @伐木丁丁
    你知道你这个文件确切编码吗?如果知道,把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

  6. 伐木丁丁
    2009/04/16 19:35 | #6

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

    谢谢指点。

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

  7. 伐木丁丁
    2009/04/26 11:09 | #7

    请教一个问题。

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

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

  8. 2009/04/28 09:51 | #8

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

  9. Jason
    2009/06/17 10:44 | #9

    以小弟愚见
    vim中的这一类功能
    应该都是调用sed实现的 所以语法也一样 sed -e ‘s/^$/d’

  10. 2009/06/18 09:25 | #10

    @Jason
    不是调用sed实现的
    在UNIX系统中很多语法看上去都很类似,这跟UNIX的发展史有关

  11. karl
    2009/11/26 12:13 | #11

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

  12. karl
    2009/11/26 12:15 | #12

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

    这个的原因是:我照
    http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/tip15/
    想把有中文字符的列对齐,但查找时:执行如下:
    s/^\{70}
    指令,找出来的长度并不一样长

  13. 2009/11/26 22:35 | #13

    @karl
    你发的命令不完整,还是不太清楚你这个需求是什么。把<替换成&lt;后再发。

  14. karl
    2009/11/30 09:01 | #14

    @Easwy
    在vim中查找替换时,中文字符被当做一个字符,我想把它当做两个字符看待,应该怎么设置?
    比如说以下两行:

    zhang.fei 430759701022003
    diao.中文 651302801225012

    运行命令:

    /^…….

    查找7个字符,中文字符被当做一个字符宽度看待的话就没法实现:
    http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/tip15/
    说的:6、将各字段数据左对齐

  15. 2009/11/30 10:03 | #15

    @karl
    先填充一些空格,然后用这条命令试试:

    %s/^\(.*\%<17v\) */\1/g

    :help /\%v

  16. karl
    2009/12/10 14:23 | #16

    好 谢谢!

  17. 2010/07/26 21:19 | #17

    冒号后面的百分号干啥用的 不加它好像没啥区别?

  18. 2010/07/26 21:24 | #18

    我明白了 全文搜索…打扰了…

评论本文