私は現在xterm-256color $ TERM変数でtmuxを使用しています。 tmuxの下のbashで、home/endを押すと、チルダ文字(〜)が挿入されます。 tmux以外では、home/endキーは正常に機能します。
Catとtputを使用すると、生成されたシーケンスと予期されたシーケンスの間に不一致があることがわかりました。
$ cat -v # pressing home, then end
^[[1~^[[4~
$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF
これを修正するために、.bashrcに以下を追加することにしました。
if [[ -n "$TMUX" ]]; then
bind '"\e[1~":"\eOH"'
bind '"\e[4~":"\eOF"'
fi
これによりbashの問題が修正されましたが、REPL ipythonなど)などの他のreadlineプログラムでは、home/endにチルダが挿入されます。
そもそもなぜこれが問題なのでしょうか? tmuxの内部と外部で生成されたシーケンスが異なるのはなぜですか?どのようにこれを修正して、どのプログラムでも問題にならないようにすることができますか?
主な問題は、$ TERMにxterm-256colorを使用することにあるようです。 $ TERMをscreen-256colorに切り替えたところ、問題は解消しました。
Tmux 2.0では、これらの2行を.tmux.conf
:
bind -n End send-key C-e
bind -n Home send-key C-a
何らかの理由でtmuxでxterm-256colorを使い続けたい場合は、inputrcで Arch solution を使用します。 tmuxでrxvt、Ruby irb、python、lua、home/endキーを使用してテストしました。おそらく、すべてのreadlineアプリは問題ありません。
Arch wikiから:
まず最初に:
$ TERMを手動で設定しないでください-端末で設定してください
多くのコマンドラインアプリケーションは、Readlineライブラリを使用して入力を読み取ります。したがって、Readlineを適切に構成すると、多くの場合HomeとEndを修正できます。
デフォルトの/ etc/inputrcファイルには、home/endキーのマッピングが含まれていません。
これらのキーに対して発行されたエスケープシーケンスを確認するには:
1. Ctrl + V
2. Home
3. Spacebar
4. Ctrl + V
5. End
これはおそらく出力されます:$ ^[[1~ ^[[4~
。したがって、これらのシーケンスのマッピングをinputrcに追加する必要があります(/ etc/inputrcをグローバルにするか、ユーザー〜/ .inputrcのみにする):
"\e[1~": beginning-of-line
"\e[4~": end-of-line
これらのそれぞれ、および他の回答とドキュメントを熟読しているときに見た他のいくつかを試した後、これは私がそれに投げかけたすべてのシナリオで私にとって最終的に機能しました。皆のシナリオは違うので、私はあなたに同じことを約束することはできませんが、これは私が結局得たものです。
以下を.tmux.conf
に追加します:
bind-key -n Home send Escape "OH"
bind-key -n End send Escape "OF"
これは、 このやや関連する記事 から同じ試行錯誤とロジックを導入した後に発見されました。唯一の違いは、変換が行われる場所です(.tmux.conf
または.bashrc
ではなく.zshrc
内;主に、私のホーム/エンドはtmuxの外で正常に動作するため)
上記の記事で参照されているようにcat -v
を使用して、この問題をデバッグできます。
cat -v
を実行し、次に Home そして End キー。使用して終了 Ctrl+C。
$ cat -v
tmux using zsh
、zsh
、bash
内の出力は次のようになります。
tmux
➜ ~ cat -v
^[[1~^[[4~^C
zsh
➜ ~ cat -v
^[[H^[[F
bash
bash-3.2$ cat -v
^[[H^[[F
上記の例を、tput
とcat -v
を組み合わせて、予想されるものと比較します。
$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF
この問題はtmux
にのみ存在し、エミュレータ自体には存在しないため、代わりにtmux構成内でバインドの変更を行うことを選択しました。 send
と組み合わせたbind-key
を使用することで、翻訳を実現したいシーケンスと組み合わせたEscape
キーワードを使用できます。したがって:
bind-key -n NAME_OF_KEY send Escape SEQUENCE_GOES_HERE
このデバッグおよび解決プロセスは、他の主要な翻訳の問題に適用できます。しかし、夢中になりすぎないでください。一部のキーは、特定のエスケープシーケンスにマップされています。 bash
およびzsh
が^[[H
シーケンスをどのように受け取ったかに注目してください。 Home ^[OH
の代わりに; zsh
に大きな問題がない限り、.zshrc
でこれをオーバーライドすることはお勧めできません。
コメントするためのポイントが足りないので、ここで言います。推奨される解決策はset -g default-terminal "screen-256color"
あなたの~/.tmux.conf
。私は実際に少し前にこの問題を抱えていて、スマンタの解決策に行くことにしました:
bind -n End send-key C-e
bind -n Home send-key C-a
しかし、私がこれをここに残したことを忘れていて、zshではなくvim(homeとendはレジスタからコピーして貼り付けられた)で同様の問題が発生しました。要するにバインドはvimに影響します。