zshのホーム/エンドキーがパテで機能しない
-
03-07-2019 - |
質問
Ubuntuボックスでデフォルトのシェルとしてzshを実行していますが、gnome-terminal(xtermをエミュレートする限り)を使用すると、すべて正常に動作します。 sshとputty(これもxtermをエミュレートします)を介してWindowsボックスからログインすると、突然ホーム/エンドキーが機能しなくなります。
zshrcファイルにこれらの行を追加することを解決できました...
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
...しかし、私はまだここで何が悪いのだろうと思っています。アイデアはありますか?
解決
組み合わせであることがわかりました:
1つ
ZSH開発者は、ZSHが Home 、 End 、 Del 、...キーのアクションを定義する必要があるとは考えていません。
DebianとUbuntuは、グローバルな / etc / zsh / zshrc
ファイルで平均的なユーザーが期待する通常のアクションを定義することでこれを修正します。関連するコードに従ってください(DebianとUbuntuでも同じです):
if [[ "$TERM" != emacs ]]; then
[[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M emacs "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M vicmd "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
[[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
[[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
[[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
[[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
[[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
# ncurses fogyatekos
[[ "$terminfo[kcuu1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
[[ "$terminfo[kcud1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
[[ "$terminfo[kcuf1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
[[ "$terminfo[kcub1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
fi
したがって、DebianまたはUbuntuボックスに接続している場合は、何もする必要はありません。すべてが自動的に機能するはずです(機能しない場合は、以下を参照してください)。
しかし...別のボックス(たとえば、FreeBSD)に接続している場合、ユーザーフレンドリーなデフォルトの zshrc
がない可能性があります。もちろん、解決策は、Debian / Ubuntu zshrc
の行を独自の .zshrc
に追加することです。
2つ
Puttyは xterm
を端末タイプとしてリモートホストに送信します。しかし、どこかに混乱して、 Home 、 End 、...の正しい制御コードを送信しません。これは xterm
に期待されます。または、 xterm
ターミナルはそれらを送信することを期待されていません...( Del キーは xterm
で機能しますが、設定した場合ZSHで)。また、たとえば xterm
ターミナルを使用すると、VimでNumpadキーがおかしくなることに注意してください。
解決策は、別の端末タイプを送信するようにPuttyを構成することです。 xterm-color
と linux
を試しました。 xterm-color
は Home / End の問題を修正しましたが、Numpadはまだ面白いものでした。 linux
に設定すると、両方の問題が修正されました。
接続の下のPuttyで端末タイプを設定できます->データ。 export TERM = linux
を使用して、 .zshrc
で端末タイプを設定しようとしないでください。これは間違っています。端末タイプは、端末アプリで指定する必要があります。たとえば、MacボックスからMac SSHクライアントで接続する場合、独自の端末タイプを設定できます。
TERMは端末タイプを指定し、接続先のホストとは関係がないことに注意してください。 Puttyでターミナルタイプを linux
に設定し、FreeBSDサーバーに問題なく接続できます。
したがって、これらの両方を修正すれば大丈夫です:)
他のヒント
PuTTY構成ダイアログで、接続に移動->接続する前に、ターミナルタイプ文字列にデータを入力し、 linux を入力します。
これは私のために働いています
bindkey -v
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
パテのようです。 Gnome-terminalはHomeとEndにそれぞれ ^ [OH
と ^ [OF
のコードを送信しますが、puttyは ^ [[1〜
と< code> ^ [[4〜。パテには、Home / Endキーを標準モードから rxvt モードに変更するオプションがあり、Homeキーは修正されますが、Endキーは修正されないようです(現在は ^ [Ow
)を送信します。どこかにバグレポートを提出する時が来たと思う...:-)
すべてのディストリビューション(必ずしもすべてのバージョンのzshである必要はありませんが、ymmv)に移植できる適切な答えは、zkbdのzkbdヘルパーユーティリティを使用することです。
キーボードの定義
キーボード、ワークステーション、端末、エミュレーター、およびウィンドウシステムの多数の可能な組み合わせにより、zshがあらゆる状況に対応した組み込みのキーバインディングを持つことができなくなります。 Functions / Miscにあるzkbdユーティリティを使用すると、構成のキーバインドをすばやく作成できます。zkbdを自動読み込み機能またはシェルスクリプトとして実行します:
zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
zkbdを実行すると、まず端末タイプの入力を求められます。提供されるデフォルトが正しい場合は、単にReturnキーを押します。次に、いくつかの異なるキーを押して、キーボードと端末の特性を決定するように求めます。 zkbdは警告します ^ Hも^?も送信しないDeleteキーなど、通常とは異なる何かを見つけた場合。
zkbdによって読み取られたキーストロークは、keyという名前の連想配列の定義として記録され、HOMEまたはZDOTDIRディレクトリ内のサブディレクトリ.zkbdのファイルに書き込まれます。ファイルの名前は、TERM、VENDOR、およびOSTYPEから構成されます ハイフンで結合されたパラメータ。
source 'または
を使用して、このファイルを.zshrcまたは別のスタートアップファイルに読み込むことができます。次のように、bindkeyコマンドでキーパラメータを参照します。
source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
# etc.
「autoload zkbd」が機能するには、zkdbファイルがfpath配列で指定されたディレクトリの1つに存在する必要があることに注意してください(zshparam(1)を参照)。これは、標準のzshインストールがある場合にはすでに当てはまります。そうでない場合は、Functions / Misc / zkbdを適切なディレクトリにコピーします。
man -P&quot; less -p 'keyboard definition'&quot;
zshcontribを参照するか、メタマンページ zshall
これらのバインディングは、emacsモードで設定されたデフォルトのバインディングの一部ではないようです。
「quote-is-begin-of-line」の実行&quot; bindkey -e&quot;を実行した後のデフォルトのzshインストールで^ aにのみバインドされていることを示しています。おそらく、あなたはzsh開発者になぜ尋ねる必要があるでしょう:-)