又一个换行符引起的问题

今天在Windows的cygwin下配置tmux的时候遇到了一个“奇怪的”的问题。 tmux在加载下面的.tmux.conf文件时出错 (.tmux.conf是在Windows上用gvim编辑的),

set -g mode-mouse on
setw -g mode-mouse on
setw -g mouse-select-window on
setw -g mouse-select-pane on

tmux报的错误消息如下,

$ tmux source-file ~/.tmux.conf
unknown value: on
unknown value: on
bad value: on
bad value: on

Google了一下发现,这又是Windows和Unix换行符不同产生的问题。

用Notepad++可以方便地(View->Show Symbol->...)把换行符等不可见字符显示出来。比如,

nodepad++ snapshot

用Notepad++查看.tmux.conf文件后,发现它的换行符是CRLF。而cygwin下的tmux认为自己处于“unix世界”里, 它要求.tmux.conf文件以LF结尾,于是就报错了。

网上有人说可以在vim里用:set list显示不可见字符,如果行末显示是$表示是LF,如果是^M则是CRLF。 但是在Windows的gvim里,打开:set list后不管实际上是LF还是CRLF结尾,都显示为$

知道了是换行符的原因,解决方法就很简单了。可以在cygwin下用dos2unix命令转换一下换行符,

$ dos2unix -n ~/.tmux.conf ~/.tmux.conf

也可以在vim/gvim里转换换行符,方法如下:

  • :set fileformat=unix(或者:set ff=unix),设置文本文件的格式
  • :w,写文件

set ff=...只对vim里的单个buffer有效。这意味着不同的buffer可以有不同的值;也意味着不能用这个选项 对vim做全局的设置。

vim提供了另一个选项fileformatsffs),它是一个全局的配置,可以影响ffffs可以是dosunix等单个值, 也可以是dos,unixunix,dos之类的组合。当它设置为单个值时,比如unix,打开一个dos文本, 最后写文件时vim会把换行符替换成LF;当它设置为组合值时,vim在读文件发现有行是以LF结尾时就把ff设置成unix; 如果全部行都是CRLF,那么把ff设成dos。(更多细节见:help ffs

如果希望Windows的gvim在新建文件时默认采用unix风格的换行符,可以在用户目录的_gvimrc文件中这么配置,

set fileformats=unix,dos

当vim/gvim发现ff的值和当前系统“不一致”时,会提醒用户,

vim snapshot

总结

在Windows上使用unix/linux工具时,类似的换行符问题总是会时不时出现。避免类似问题的最好方法是,尽量在“一个世界” 里工作。比如,上面的问题就是由于在cygwin(unix世界)里,用tmux去读取一个gvim(windows世界)写的文件引起的。

2015-05-23 17:45
推荐到豆瓣

如果你觉得这篇文章对你有用,可以微信扫一扫表示🙏 / If you find this post is useful to you, buy me 🍶 via Wechat