単語の選択をサポートするために、Zshにいくつかのキーボードショートカットを追加しました。
Ctrl + C
選択項目で作業を実行するには、それを使用してコピーしたいと思います。しかし、Ctrl + C
ZLE(Zsh Line Editor)が有効になっていない場合でも、割り込みルーチンを使用したいと思います。
可能ですか?どうすればいいですか? aをfunction TRAPINT
Hookとして宣言しようとしていますが、Ctrl + C
ZLEでを押すとCtrl + C
関数が呼び出されないようです。
ベストアンサー1
次のコードを使用すると、一般的なショートカットを使用してCtrl + X
ZshCtrl + C
およびCtrl + V
X.orgクリップボードに切り取り/コピー/貼り付けを行うことができます。
Ctrl + C
ZLEにいないときは、通常どおり割り込みとして使用されます。これを行うには、Zshのprecmd_functions
&にフックを挿入して、preexec_functions
ZLEで編集を開始したときと編集を終了するために押す必要があるときを知ることができますEnter
。
割り込み信号を設定/解除するには をCtrl + C
使用しますstty
。
以下のスクリプトの前半は、クリップボードのコピー/切り取り/貼り付け機能を定義します。
後者は優れた答えで少し修正されたコードです。shell - Zsh zleシフト選択、これらの機能にキーをバインドします。
function zle-clipboard-cut {
if ((REGION_ACTIVE)); then
zle copy-region-as-kill
print -rn -- $CUTBUFFER | xclip -selection clipboard -in
zle kill-region
fi
}
zle -N zle-clipboard-cut
function zle-clipboard-copy {
if ((REGION_ACTIVE)); then
zle copy-region-as-kill
print -rn -- $CUTBUFFER | xclip -selection clipboard -in
else
# Nothing is selected, so default to the interrupt command
zle send-break
fi
}
zle -N zle-clipboard-copy
function zle-clipboard-paste {
if ((REGION_ACTIVE)); then
zle kill-region
fi
LBUFFER+="$(xclip -selection clipboard -out)"
}
zle -N zle-clipboard-paste
function zle-pre-cmd {
# We are now in buffer editing mode. Clear the interrupt combo `Ctrl + C` by setting it to the null character, so it
# can be used as the copy-to-clipboard key instead
stty intr "^@"
}
precmd_functions=("zle-pre-cmd" ${precmd_functions[@]})
function zle-pre-exec {
# We are now out of buffer editing mode. Restore the interrupt combo `Ctrl + C`.
stty intr "^C"
}
preexec_functions=("zle-pre-exec" ${preexec_functions[@]})
# The `key` column is only used to build a named reference for `zle`
for key kcap seq widget arg (
cx _ $'^X' zle-clipboard-cut _ # `Ctrl + X`
cc _ $'^C' zle-clipboard-copy _ # `Ctrl + C`
cv _ $'^V' zle-clipboard-paste _ # `Ctrl + V`
) {
if [ "${arg}" = "_" ]; then
eval "key-$key() {
zle $widget
}"
else
eval "key-$key() {
zle-$widget $arg \$@
}"
fi
zle -N key-$key
bindkey ${terminfo[$kcap]-$seq} key-$key
}