何とは言わない天然水飲みたさ

mltermのterminfoがおかしかった件

概要まとめだけ参照。

概要

Zsh - ArchWikiを参考に以下のようなコードを書いたのだが、これが何故かmltermで動かない。

typeset -A key
key[Home]=${terminfo[khome]}
key[End]=${terminfo[kend]}
[[ -n ${key[Home]}        ]] && bindkey "${key[Home]}"      beginning-of-line
[[ -n ${key[End]}         ]] && bindkey "${key[End]}"       end-of-line
~/.zshrc (抜粋)

具体的には、HomeキーやEndキーでの挙動がおかしくなる。 どうせterminfoが合っていないんだろうと思ったらその通りだった。

mltermのソースコードと一緒に配られているterminfoのソースを使おうにも、それも駄目だった。

状況把握

期待していた結果
期待していた結果
実際の結果
mlterm公式のterminfoをベースにした結果

つらい。

原因を探ったところ、setabsetafの指定が問題であることがわかった。

	setab=\E[4%p1%dm,
	setaf=\E[3%p1%dm,
tmuxが256色出さないterminfo (mlterm-3.6.0 公式)
	setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
	setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
tmuxが256色出すterminfo (ncurses-6.0 同梱)

結局、ncursesの方が正しかったらしい。 terminfo.src (colored) for NCURSESを見ると、mlterm3の項目のコメントに以下のようにあった。

# Tested mlterm 3.2.2:
# mlterm 3.x has made changes, but they are not reflected in the included
# mlterm.ti; this entry is based on testing with tack and vttest -TD
terminfo.srcのコメント (抜粋)

そういうわけで、折角一部キー以外問題ないものがあるのだから、それを使おう。

mlterm|mlterm-256color|multi lingual terminal emulator,
	khome=\E[H,
	kend=\E[F,
	kf1=\EOP,
	kf2=\EOQ,
	kf3=\EOR,
	kf4=\EOS,
	use=mlterm-256color,
mlterm用terminfoソース完成版(1)

use=で他のterminfoを参照できる。 ここではncursesが入れてくれたmlterm-256colorを参照する。 循環参照っぽさがあるが、とりあえず動いたので良しとしよう。 心配なら以下のようにしてやれば同じ結果が得られるだろう。

$ infocmp -A /usr/share/terminfo mlterm-256color \
    | sed \
        -e 's/khome=\\EOH,/khome=\\E[H,/' \
        -e 's/kend=\\EOF,/kend=\\E[F,/' \
        -e 's/kf1=\\E\[11~,/kf1=\\EOP,/' \
        -e 's/kf2=\\E\[12~,/kf2=\\EOQ,/' \
        -e 's/kf3=\\E\[13~,/kf3=\\EOR,/' \
        -e 's/kf4=\\E\[14~,/kf4=\\EOS,/' \
	>mlterm-256color.ti
$ tic mlterm-256color.ti
mlterm用terminfoソース(2)の作り方

これでやっと意図した結果が得られた(何を隠そう、先の「期待される結果」の画像はこのファイルを使ったものだ)。

まとめ