Zsh ラインエディタがアクティブな間に Ctrl+C を使用してテキストをコピーする

Zsh ラインエディタがアクティブな間に Ctrl+C を使用してテキストをコピーする

単語の選択をサポートするために、Zshにいくつかのキーボードショートカットを追加しました。

Ctrl + C選択項目で作業を実行するには、それを使用してコピーしたいと思います。しかし、Ctrl + CZLE(Zsh Line Editor)が有効になっていない場合でも、割り込みルーチンを使用したいと思います。

可能ですか?どうすればいいですか? aをfunction TRAPINTHookとして宣言しようとしていますが、Ctrl + CZLEでを押すとCtrl + C関数が呼び出されないようです。

ベストアンサー1

次のコードを使用すると、一般的なショートカットを使用してCtrl + XZshCtrl + CおよびCtrl + VX.orgクリップボードに切り取り/コピー/貼り付けを行うことができます。

Ctrl + CZLEにいないときは、通常どおり割り込みとして使用されます。これを行うには、Zshのprecmd_functions&にフックを挿入して、preexec_functionsZLEで編集を開始したときと編集を終了するために押す必要があるときを知ることができます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
}

おすすめ記事