我用tmux有一段时间了,工作中会用到它的「会话保持」这一功能。在「跳板机」上建一个tmux会话linux操作系统介绍,之后打开多个tmuxwindow,在每位window下ssh联接到「开发机」,这是十分普遍的开发方法。上班时我只要按bind-key+d脱离会话,笔记本塞子一合就可以走人,当前机器上的多个ssh联接、打开的文档、运行的程序,都毫无「违和感」地同步「下班」。

第二天下班,我联接到「跳板机」,简单地执行2个,就可以重新快速挂载到今天的tmux会话,之前构建的多个ssh联接、打开的文档、运行地程序,又都毫无「违和感」地同步「上班」,保持着明天的状态(其实,运行着的程序没有退出的意思)。构建tmux会话时我并没有指定名称,重新挂载到会话上十分简单:

[xiaojie.zhang1@FS67 ~]$ tmux ls    // 列出当前的tmux会话, ls = list session
0: 4 windows (created Wed Nov  6 18:37:38 2013) [181x50] (attached)
[xiaojie.zhang1@FS67 ~]$ tmux attach -t 0    // 挂载到第一个会话, -t 0

但是使用过程中碰到一个屏幕显示错乱的问题,在ssh连上「开发机」后,在「开发机」上用vim打开包含有英文的代码,还会出现:

万能的google会告诉我在tmux的配置文件中添加2个utf8的项:

[xiaojie.zhang1@FS67 ~]$ grep utf8 ~/.tmux.conf
setw -g utf8 on
set -g status-utf8 on

添加了以后就出现了英文「乱码」。

这2个配置项是不能解决问题的,乱码的诱因有多个的好吗!!!!

终端的编码vim的编码tmux的编码系统的locale

对于第1点,我使用的iterm2,使用的字符编码为Unicode(UTF-8),嗯,早已是utf8了。

对于第2点,用vim的人都晓得,vim读写一个文件时,使用设置项fenc配置的编码linuxtar,例如utf8;而vim显示文件内容,使用的是另一个设置项tenc配置的编码,假若这2个配置的编码不一致,就才能看见vim的乱码。我先确认vim打开文件的编码和展示都用到utf8编码,二者编码一致:

:set fenc    // 在vim行下
  fileencoding=utf-8    // vim命令行下的输出
:set tenc    // 同上
  termencoding=utf-8

虽然,不用tmux,从「跳板机」ssh连上「开发机」linux git中文乱码,再使用vim打开任何文本,都是不会乱码的(由于vim配置了正确的编码方法)。

对于第3点,tmux添加了utf8的编码也没有疗效(虽然这2个是设置tmuxwindow的好吗),tmux的显示究竟是按照那里的配置??

到了第4点,确认是系统的locale问题了linux git中文乱码,tmux依赖于这种设置。因为我是在「跳板机」上使用tmux,tmux会使用到「跳板机」上的locale参数,查看:

[xiaojie.zhang1@FS67 ~]$ locale
LANG=en_US.en
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C

果然!!!!于是再检测「跳板机」上是否早已安装zh_cn字符集:

[xiaojie.zhang1@FS67 ~]$ locale -a | grep -i zh_cn
zh_CN
zh_CN.gb18030
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8

没让我沮丧,有zh_cn.utf8,添加到profile里吧:

[xiaojie.zhang1@FS67 ~]$ grep -i utf ~/.bash_profile
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"

kill掉tmux当前的会话,重新登入「跳板机」,新建一个tmux会话,再度确认tmux加载到新的locale

[xiaojie.zhang1@FS67 ~]$ tmux    // 新建一个tmux会话和窗口
[xiaojie.zhang1@FS67 ~]$ locale    // 进入tmux的窗口,再确认一次locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=zh_CN.UTF-8

tmux用到了utf8了,这时再ssh联接到「开发机」,vim打开之前的文件,乱码已成旧事,其实也不会显示错乱。

也就是说,若要「乱码」已成旧事,须要4个地方的编码:

终端使用utf8编码(例如我使用iterm2,item2的终端字符集为Unicode(UTF-8))

使用tmux的机器上(例如我这儿的「跳板机」),其个人profile的locale使用utf8

 [xiaojie.zhang1@FS67 ~]$ grep -i utf ~/.bash_profile
 export LANG="zh_CN.UTF-8"

export LC_ALL="zh_CN.UTF-8"

每次登入就会export这2个环境变量,因而设置locale。

开发机」上vim设置utf8编码(linux)

 xiaojie.zhang1@log83 ~$ grep enc ~/.vimrc
 set enc=utf8
 set fencs=utf8,gbk,gb2312,gb18030,cp936

vim里虽然没必要设置tenc,它会从fencs列表中选一个适宜的编码方法。

tmux倒是可以不设置utf8

推荐一个讲解vim编码方法的普及blog:VIM乱码缘由与解决方案

–EOF–

Categories:in_mac

Tags:iterm

本文原创地址://gulass.cn/lzwlmsytsxwf.html编辑:刘遄,审核员:暂无