web-dev-qa-db-ja.com

Home / Endキーがtmuxで機能しない

私は現在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の内部と外部で生成されたシーケンスが異なるのはなぜですか?どのようにこれを修正して、どのプログラムでも問題にならないようにすることができますか?

52
Ben Davis

主な問題は、$ TERMにxterm-256colorを使用することにあるようです。 $ TERMをscreen-256colorに切り替えたところ、問題は解消しました。

41
Ben Davis

Tmux 2.0では、これらの2行を.tmux.conf

bind -n End send-key C-e
bind -n Home send-key C-a
30
sumanta

何らかの理由で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
8
Oleg Kr

これらのそれぞれ、および他の回答とドキュメントを熟読しているときに見た他のいくつかを試した後、これは私がそれに投げかけたすべてのシナリオで私にとって最終的に機能しました。皆のシナリオは違うので、私はあなたに同じことを約束することはできませんが、これは私が結局得たものです。

以下を.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 zshzshbash内の出力は次のようになります。

tmux

➜  ~ cat -v
^[[1~^[[4~^C

zsh

➜  ~ cat -v
^[[H^[[F

bash

bash-3.2$ cat -v
^[[H^[[F

ソリューション

上記の例を、tputcat -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でこれをオーバーライドすることはお勧めできません。

3
Swivel

コメントするためのポイントが足りないので、ここで言います。推奨される解決策は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に影響します。

1
ducklin5