web-dev-qa-db-ja.com

PuTTYを使用すると、左キーと右キーでカーソルが1文字ではなく1ワード移動します。

この_OhMyZSH!_問題の解決策を数日間探しましたが、解決策が見つかりません。確かに、私はzleが実際にどのように機能するかを理解していません。bindkeyについても同じです。ターミナルエミュレータが「制御シーケンス」を送信する方法、および「ターミナルタイプ」の意味についても同じことが言えます(xterm、対_xterm-256-color_など)。 「アプリケーションモード」も同様

セットアップ

OhMyZSHの最新バージョンがインストールされているマシンが2台あります。コミット_c3b072_:

  • マシンA:SLES 11 SP4、実行中zsh 4.3.6 (x86_64-suse-linux-gnu)
  • マシンB:Ubuntu 16.04、実行中zsh 5.1.1 (x86_64-ubuntu-linux-gnu)

Windows上で実行されているPuTTYを使用して、端末タイプxtermで、UTF-8変換モードでいずれかのマシンに接続します。

私のzshrcファイルはほとんどVanillaOhMyZSHテンプレートであり、マシンAでプロンプトをdieterに変更し、_powerlevel-9k_ [ https: //github.com/bhilburn/powerlevel9k] マシンB上。

私がマシンAで観察したこと(別名「悪い」マシン)

コマンドラインを編集すると、 Left そして Right カーソルキーは、(1文字ではなく)1つの単語全体を移動します。

Home そして End ただし、キーを押すと、予想どおり、カーソルを行の最初と最後に移動します。

この説明されている動作は、emacsモード(_bindkey -e_)の場合に適用されます。

vimモード(_bindkey -v_)に移動すると、 Left そして Right 矢印は1文字移動しますが、 Home そして End キーはカーソルを行の最初と最後に移動しません。代わりに、カーソルの下の文字の大文字と小文字を切り替えます。

私がマシンBで観察したこと(別名「良い」もの)

Left そして Right キーを押すと、カーソルが1文字移動します。ホームキーとエンドキーは、カーソルを行の先頭と末尾に移動します。 Ctrl+A そして Ctrl+E コンボはカーソルを最初と最後に移動します。

これは、すべてのシェルに必要な動作です。

私がこれまでに見つけたもの

bindkeyの問題だと思います。しかし、私はそれについてほとんど何も知りません、そして私はこのzshビルトインでどんなドキュメントも見つけるのに苦労しました。

ログイン時に両方のマシンで_zsh -v_を実行すると、_.zshrc_ファイルが類似しているにもかかわらず、結果が大きく異なります。

誰かが、これら2つのマシンの動作がこれほど異なる原因と、一貫性が回復し、すべてのシェルがマシンB(別名「良好」なもの)のように動作するように構成を変更する方法を説明できますか?

私が知らないより多くの情報が必要な場合は、私に知らせてくれると確信しています。

どうもありがとう

1
Gunee

PuTTYを使用する場合は、端末タイプを PuTTYPuTTY-256color 、または PuTTY-sco として構成する必要があります。これらは、terminfoデータベースのエントリがPuTTYを正しく記述している唯一の端末タイプです。

ターミナルエミュレータがすべてXTermと互換性があり、terminfoデータベースのxtermおよびxterm-256colorエントリがそれらを正しく記述しているというのは、広く行き渡っている誤った仮定です。

この誤った考え ThomasDickeyのXTermFAQで指摘されています そしてxtermおよびxterm-256colorエントリは、他のターミナルエミュレータはもちろん、XTermのすべてのバージョンを記述しているわけではないことに注意してください。

M. DickeyによってハイパーリンクされたページなどのPuTTYのドコは、今日でも PuTTYエントリがterminfoに追加されてから16年 、残念ながら、このxterm端末タイプの誤用を助長していますが、誤用ですそれはそうです、そしてこれは発生するまさに一種のアプリケーションの誤動作です。

xterm-256colorPuTTY-256colorのterminfoデータベースエントリを比較すると、 ⇱ Home そして ⇲ End キー:

%infocmp xterm-256color PuTTY-256color | grep -F kend 
 kend: '\ EOF'、 '\ E [4〜'。
%infocmp xterm-256color PuTTY-256color | grep -F khome 
 khome: '\ EOH'、 '\ E [1〜'。
%

ご覧のとおり、XTermを処理していると通知されたアプリケーションは、(端末から)制御シーケンス␛OHを受信することを期待しています。 ⇱ Home キーと制御シーケンス␛OF ⇲ End キー。しかし、PuTTYは実際には代わりに制御シーケンス␛[1~␛[4~を(それぞれ)送信します。

アプリケーションであるZシェルは、XTermキーボード制御シーケンスを予期しており(端末のタイプがxtermであると誤って伝えたため)、PuTTY制御シーケンスを認識せず、実際にはそれらをvi- modeコマンドに分解します。挿入モードを終了し()、現在の文字の大文字と小文字を入れ替えます(~)。

参考文献

2
JdeBP

JdeBPが親切に指摘したように、私のTERMは間違って設定されていました。

私はついに、次の手順ですべてを一貫して機能させることができました。

  1. PuTTYの端末タイプをPuTTYに設定します
  2. PuTTYでカーソルとキーパッドのアプリケーションモードを無効にします
  3. 次の行を.tmux.confファイルに追加します。
    • set -g default-terminal "$TERM"tmuxがデフォルトでscreenを使用しないようにする
    • set -g terminal-overrides "PuTTY*:kLFT5=\eOD:kRIT5=\eOC:kUP5=\eOA:kDN5=\eOB:smkx@:rmkx@" Left そして Right キーは1単語ではなく1文字移動します
0
Gunee