2018-08-02

tobijibu

tmux + Vimで全角記号のずれをなおす

"■"や"◯"、"→"等の全角記号の幅が正しく表示されない現象です。 以前から気づいていたのですが、個人的なメモ等で発生していただけなので見て見ぬふりをしていました。 しかし、やはり気持ち悪いので直すことにしました。

まずは現象の確認です。 Vim単体で全角記号が含まれたファイルを開いた場合と、tmux+Vimで開いた状態を比べました。 すると、以下のようにVim単体では正常に表示されるのですが、tmuxの中でVimを使った場合に発生するようです。

Vim

tmux + Vim

"hello"の"h"が2つ表示されたり、記号の右に不自然な隙間ができてしまいます。

どうやらtmuxでは、全角記号文字の表示幅がずれてしまう問題があるようです。
https://gist.github.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34

上記ページには対処方法も分かりやすく記載されていますので、説明の通りにパッチを当ててtmuxをインストールしなおします。

今回対応する環境は以下になります。
Host : Windows7 Virtualbox + Vagrant
Guest : CentOS 7.5

必要なライブラリをインストール

まず必要なライブラリをyumでインストールします。

# yum install -y git automake patch libevent-devel ncurses-devel

tmuxソースとパッチをダウンロード

tmux本体のソースと、パッチをダウンロードします。 どちらもGitHubにあるのでcloneで落とします。

# cd /usr/local/src
# git clone https://github.com/tmux/tmux.git
# git clone https://gist.github.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34 tmux-patch
# cd ./tmux

バージョン確認

パッチはtmuxのバージョンに合わせたパッチを適用しなければなりません。 tmuxのバージョンはtagが切られているので、そのバージョンを確認します。

# git tag
...
2.5
2.6
2.7

こでは最新バージョンである2.7をインストールすることにします。

続いてパッチのバージョンを確認します。 パッチはtmux-x.x-fix.diffという名前のファイルです。 インストールするtmuxのバージョンのパッチがあることを確認してください。

なお、tmuxのtagを指定せずにインストールする場合は、 tmux-HEAD-*-fix.diffを使います。

パッチ適用

パッチを適用します。

# git checkout 2.7
# patch -p1 < ../tmux-patch/tmux-2.7-fix.diff

インストール

パッチを適用したらインストールします。

# sh autogen.sh
# ./configure && make
# make install

これでtmuxをインストールすることができ、 tmux + Vimでも全角記号が正しく表示されるようになりました。

tmux + Vim


せっかくなので、これらの手順をスクリプト化しました。 パッチ適用して最新版のtmuxをインストールするシェルスクリプトです。


2018.08.23 : パッチが用意されていない場合があるので、tmux 2.7に決め打ちにしました。
#!/bin/sh
if [ -z "${password}" ]; then
  printf "password: "
  read password
fi

echo ${password} | sudo -S sh << EOS
yum install -y git automake patch libevent-devel ncurses-devel
cd /usr/local/src
git clone https://gist.github.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34 tmux-patch 
git clone https://github.com/tmux/tmux.git
cd ./tmux

tmuxver='2.7'
git checkout \${tmuxver}
patch -p1 < ../tmux-patch/tmux-\${tmuxver}-fix.diff
sh autogen.sh
./configure && make
make install
EOS

最新版を入れるパターンも用意しました。 パッチのtmux-HEAD-xxxxxxxx-fix.diffから、対応するリビジョンでインストールします。

#!/bin/sh
if [ -z "${password}" ]; then
  printf "password: "
  read password
fi

echo ${password} | sudo -S sh << EOS
yum install -y git automake patch libevent-devel ncurses-devel
cd /usr/local/src
git clone https://gist.github.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34 tmux-patch 
git clone https://github.com/tmux/tmux.git
cd ./tmux

patchFile=\$(ls ../tmux-patch | grep HEAD)
branch=\$(echo \${patchFile} | sed -r 's/(tmux-HEAD-)|(-fix.diff)//g')
git checkout \${branch}
patch -p1 < ../tmux-patch/\${patchFile}
sh autogen.sh
./configure && make
make install
EOS

おまけ

tmuxをインストールした後、日本語が完全に文字化けしてしまう場合があります。 私の場合はVagrantでconfig.vm.box = "centos/7"という指定でboxを入れた場合に発生しました。

この指定で入れたboxはほぼ何も入っていない状態でロケールに日本語が含まれていません。 正しく表示できるように日本語を入れておきましょう。

# yum reinstall -y glibc glibc-common
# localectl set-locale LANG=ja_JP.UTF-8
# source /etc/locale.conf

ついでに、.vimrcset ambiwidth=doubleが設定されていることも忘れずに。

参考サイト

tmux 2.3 以降において East Asian Ambiguous Character を全角文字の幅で表示する
https://gist.github.com/z80oolong/e65baf0d590f62fab8f4f7c358cbcc34