私が使った答えzsh は Ctrl+バックスペース、Ctrl+削除を終了します。次のキーバインディングを設定します。
- Ctrl+ Backspace:現在の単語の先頭まで削除、
- Ctrl+ Delete:現在の単語の最後まで削除、
- Ctrl+ Shift+ Delete: 行末まで削除します。
これは、次のコマンドを使用して実行されます。
$ bindkey -M emacs '^[[3;5~' kill-word
$ bindkey -M emacs '^H' backward-kill-word
$ bindkey -M emacs '^[[3;6~' kill-line
キー(部品など)をエンコードする方法を理解するために、^[[3;5~
回答で詳しく説明されている「トリック」を使用しました。「システムの値を表示するには、Ctrl++C Ctrlを入力してください。」Delete。
質問
Ctrl++をコマンドにShiftバインドします(たとえば、カーソルと行の始まりの間のすべての項目を削除します)。Backspacebackward-kill-line
ただし、+++ と入力するとプロンプトCtrlにのみ表示されます。つまり、+と同じキーの組み合わせが表示されます。C CtrlShiftBackspace^H
CtrlBackspace
答え1
Ctrl端末は+と同じエスケープシーケンスをShift送信するため、zshは2つを区別できません。唯一の解決策は、別のエスケープシーケンスを送信するように端末を設定することです。すべての端末でこれを許可するわけではありません。BackspaceCtrlBackspace
一部の端末(xterm、rxvt、iTerm2、Emacs termなど)では、各キーとコードのエスケープシーケンスを手動で設定できます。端末のドキュメントを参照してください。
たとえば、xtermの場合は、次のコードを.Xresources
.load itに配置できますxrdb -merge ~/.Xresources
。多くの環境では、ログイン時にそれをロードします。それ以外の場合は、このコマンドをX11スタートアップファイルに追加してください。
XTerm.VT100.translations: #override \
Ctrl Shift <Key>BackSpace: string("\033[27;6;8~") \n
その後、このエスケープシーケンスを使用できます。
bindkey -M emacs '^[[27;6;8~' backward-kill-word
端末は以下に基づいています。静脈血栓塞栓症、Gnome-terminal、Guake、および Terminator を含む幸運ではありません。キーバインディングを構成する方法はありません。特定のキーの一時的なサポートを喜んで追加することもできます。しかし。
1互換性のためにこの順序を選択しましたxtermmodifyOtherKeys
モード。私は通常を有効にすることをお勧めします。modifyOtherKeys
これはほとんどの場合、以前のバージョンとの互換性のためですが、必要な特定のキーとコードはレベル2でのみ有効になります。これは処理が難しい問題です(たとえば、Ctrl +文字はその制御文字を送信しません)。
答え2
X11ターミナルエミュレータの場合、変更方法を提供せず(切れた場合)、Ctrl+Shift+Backspace同じコンテンツを送信すると、ダーティハッキングでターミナルエミュレータとXサーバー間の通信を傍受することができます。たとえば、次のものを置き換えます。 (キーコード22)と(キーボード96)をBackspace押すと、X11イベントメッセージがターミナルエミュレータに送信されます。BackspaceF12BackspaceShiftCtrl
ちなみに、zsh
UnixドメインとTCPソケットAPIが組み込まれているので、比較的簡単です。次のスクリプトを実行します。
that-script guake
そしてあなたの~/.zshrc
if [ -n "$WRAPPED_DISPLAY" ]; then
export DISPLAY="$WRAPPED_DISPLAY"
unset DISPLAY
fi
(該当するラッパーを通過する対応する端末内で実行される他のアプリケーションを防止するため)
そしてバインディング:
bindkey -M emacs '^[[24;6~' backward-kill-word
少なくともVTEを押す\e[24;6~
と送信されるシーケンスは何ですか?Ctrl+Shift+F12xterm
#! /bin/zsh -
die() {
(($# == 0)) || print -ru2 -- "$@"
exit 1
}
case $DISPLAY in
(:<->(.<->|))
mode=unix;;
((localhost|127.0.0.1|"[::1]"):<->(.<->|))
mode=tcp
zmodload zsh/net/tcp || die;;
(*)
die "Unsupported display: $DISPLAY";;
esac
conn=${DISPLAY##*:}
port=${conn%%.*}
screennumber=${conn#$port}
(($# > 0)) || argv=(gnome-terminal --wait)
unset -v listen_fd
typeset -A clients
tcp_connect() ztcp -v localhost $((port + 6000))
unix_connect() zsocket /tmp/.X11-unix/X$port
zmodload zsh/net/socket || die
zmodload zsh/system || die
zmodload zsh/zselect || die
new_port=20
until
new_socket_path=/tmp/.X11-unix/X$new_port
zsocket -l $new_socket_path 2> /dev/null
do
((new_port++))
done
listen_fd=$REPLY
unset -v pid
trap '
kill "$pid" 2> /dev/null
wait "$pid"; ret=$?
rm -f $new_socket_path
exit "$ret"' EXIT INT TERM HUP
{
coproc {
export WRAPPED_DISPLAY=$DISPLAY DISPLAY=:$new_port$screennumber
xauth list "$WRAPPED_DISPLAY" |
awk '{$1 = "add " ENVIRON["DISPLAY"];print}' |
xauth -q -
"$@" <&3 3>&1 >&4 4>&- {listen_fd}<&-
}
} 3<&0 4>&1
pid=$!
exec {child_monitor}<&p
coproc :
LC_ALL=C
set -o extendedglob
tear() {
exec {1}>&- {2}>&-
unset "clients[$1]"
}
typeset -A ready
while zselect -A ready -r $listen_fd $child_monitor ${(kv)clients}; do
[[ $ready[$child_monitor] ]] && exit
if [[ $ready[$listen_fd] ]]; then
zsocket -a $listen_fd || die
fd=$REPLY
${mode}_connect || die
clients[$fd]=$REPLY
fi
for client server (${(kv)clients}) {
for from fdin fdout (
client $client $server
server $server $client
) if [[ $ready[$fdin] ]]; then
if sysread -s 65536 -i $fdin buf; then
if [[ $from = server ]]; then
if [[ $buf[1,2] = $'\x23\x83' ]]; then
offsets=(9 17 73) # Generic XInputExtension Event
else
offsets=(1 2 29) # Normal Event
fi
if
[[ $buf[offsets[1]] = ($'\x2'|$'\x3') ]] && # KeyPress or KeyRelease
[[ $buf[offsets[2]] = $'\x16' ]] && # keycode 22, Backspace
printf -v modifiers %d "'$buf[offsets[3]]" &&
((modifiers & 5 == 5)) # Shift+Ctrl
then
buf[offsets[2]]=$'\x60' # keycode 96, F12
fi
fi
syswrite -o $fdout -- $buf || tear $client $server
else
tear $client $server
fi
fi
}
done
ここでは、完全なX11プロトコル記述を実行せず、主要なイベントが完全なメッセージとして表示されると仮定します。端末がXサーバーと通信しているときにこのキーの組み合わせを押すと、見逃すことがあります。さらに、すべてのX11トラフィックは、zsh
パフォーマンス指向言語ではなくシェルで書かれたラッパーを通過する必要があるため、パフォーマンスに影響します。