Hong's Blog
Be Agile. Be Smart. Be Visionary. Be Dedicated.
今天在Windows的cygwin下配置tmux的时候遇到了一个“奇怪的”的问题。 tmux在加载下面的.tmux.conf文件时出错 (.tmux.conf是在Windows上用gvim编辑的),
.tmux.conf
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->...)把换行符等不可见字符显示出来。比如,
View->Show Symbol->...
用Notepad++查看.tmux.conf文件后,发现它的换行符是CRLF。而cygwin下的tmux认为自己处于“unix世界”里, 它要求.tmux.conf文件以LF结尾,于是就报错了。
CRLF
LF
网上有人说可以在vim里用:set list显示不可见字符,如果行末显示是$表示是LF,如果是^M则是CRLF。 但是在Windows的gvim里,打开:set list后不管实际上是LF还是CRLF结尾,都显示为$。
:set list
$
^M
知道了是换行符的原因,解决方法就很简单了。可以在cygwin下用dos2unix命令转换一下换行符,
$ dos2unix -n ~/.tmux.conf ~/.tmux.conf
也可以在vim/gvim里转换换行符,方法如下:
:set fileformat=unix
:set ff=unix
:w
set ff=...只对vim里的单个buffer有效。这意味着不同的buffer可以有不同的值;也意味着不能用这个选项 对vim做全局的设置。
set ff=...
vim提供了另一个选项fileformats(ffs),它是一个全局的配置,可以影响ff。ffs可以是dos,unix等单个值, 也可以是dos,unix,unix,dos之类的组合。当它设置为单个值时,比如unix,打开一个dos文本, 最后写文件时vim会把换行符替换成LF;当它设置为组合值时,vim在读文件发现有行是以LF结尾时就把ff设置成unix; 如果全部行都是CRLF,那么把ff设成dos。(更多细节见:help ffs)
fileformats
ffs
ff
dos
unix
dos,unix
unix,dos
:help ffs
如果希望Windows的gvim在新建文件时默认采用unix风格的换行符,可以在用户目录的_gvimrc文件中这么配置,
_gvimrc
set fileformats=unix,dos
当vim/gvim发现ff的值和当前系统“不一致”时,会提醒用户,
在Windows上使用unix/linux工具时,类似的换行符问题总是会时不时出现。避免类似问题的最好方法是,尽量在“一个世界” 里工作。比如,上面的问题就是由于在cygwin(unix世界)里,用tmux去读取一个gvim(windows世界)写的文件引起的。
如果你觉得这篇文章对你有用,可以微信扫一扫表示🙏 / If you find this post is useful to you, buy me 🍶 via Wechat
又一个换行符引起的问题
今天在Windows的cygwin下配置tmux的时候遇到了一个“奇怪的”的问题。 tmux在加载下面的
.tmux.conf
文件时出错 (.tmux.conf
是在Windows上用gvim编辑的),tmux报的错误消息如下,
Google了一下发现,这又是Windows和Unix换行符不同产生的问题。
用Notepad++可以方便地(
View->Show Symbol->...
)把换行符等不可见字符显示出来。比如,用Notepad++查看
.tmux.conf
文件后,发现它的换行符是CRLF
。而cygwin下的tmux认为自己处于“unix世界”里, 它要求.tmux.conf
文件以LF
结尾,于是就报错了。网上有人说可以在vim里用
:set list
显示不可见字符,如果行末显示是$
表示是LF
,如果是^M
则是CRLF
。 但是在Windows的gvim里,打开:set list
后不管实际上是LF
还是CRLF
结尾,都显示为$
。知道了是换行符的原因,解决方法就很简单了。可以在cygwin下用dos2unix命令转换一下换行符,
也可以在vim/gvim里转换换行符,方法如下:
:set fileformat=unix
(或者:set ff=unix
),设置文本文件的格式:w
,写文件set ff=...
只对vim里的单个buffer有效。这意味着不同的buffer可以有不同的值;也意味着不能用这个选项 对vim做全局的设置。vim提供了另一个选项
fileformats
(ffs
),它是一个全局的配置,可以影响ff
。ffs
可以是dos
,unix
等单个值, 也可以是dos,unix
,unix,dos
之类的组合。当它设置为单个值时,比如unix
,打开一个dos文本, 最后写文件时vim会把换行符替换成LF
;当它设置为组合值时,vim在读文件发现有行是以LF
结尾时就把ff
设置成unix
; 如果全部行都是CRLF
,那么把ff
设成dos
。(更多细节见:help ffs
)如果希望Windows的gvim在新建文件时默认采用unix风格的换行符,可以在用户目录的
_gvimrc
文件中这么配置,当vim/gvim发现
ff
的值和当前系统“不一致”时,会提醒用户,总结
在Windows上使用unix/linux工具时,类似的换行符问题总是会时不时出现。避免类似问题的最好方法是,尽量在“一个世界” 里工作。比如,上面的问题就是由于在cygwin(unix世界)里,用tmux去读取一个gvim(windows世界)写的文件引起的。
如果你觉得这篇文章对你有用,可以微信扫一扫表示🙏 / If you find this post is useful to you, buy me 🍶 via Wechat