zsh - ctrl+c、ctrl+x、ctrl+v を使用したコピー、切り取り、貼り付けの最適化

zsh - ctrl+c、ctrl+x、ctrl+v を使用したコピー、切り取り、貼り付けの最適化

私は私の中にいます.zshrc

if [[ -t 0 && $- = *i* ]]
then
# change Ctrl+C to Ctrl+I
stty start ''
stty stop ''
stty quit ''
stty erase ''
stty kill ''
stty eof '' # Ctrl + D
stty rprnt ''
stty werase ''
stty lnext ''
stty discard ''

fi

# change Ctrl+C to Ctrl+Q
stty intr '^q'

# change Ctrl+z to Ctrl+j
stty susp '^j'

# change Ctrl+V to Ctrl+K
bindkey '^k' quoted-insert # for zle

_copy-using-xsel() {
  if ((REGION_ACTIVE)) then
  zle copy-region-as-kill
  printf "$CUTBUFFER" | xsel -i --clipboard
  ((REGION_ACTIVE = 0))
  fi
}

zle -N _copy-using-xsel
bindkey '^C' _copy-using-xsel # Copy text

_cut-using-xsel() {
  if ((REGION_ACTIVE)) then
       zle copy-region-as-kill
       printf "$CUTBUFFER" | xsel -i --clipboard
       zle kill-region
  fi
}

zle -N _cut-using-xsel
bindkey '^X' _cut-using-xsel # Cut text

_paste-copy-using-xsel() {
  LBUFFER+="$(xsel -b -o)"
}

zle -N _paste-copy-using-xsel
bindkey '^V' _paste-copy-using-xsel # Paste

ctrl+コピー、使用+切り取り、使用+貼り付けを使用できますc。しかし、仕事が非常に遅いことがわかりました。私の考えには切るのに0.5秒ほどかかるという意味だ。使用のためですか?遅延が消えるようにキーバインディングを最適化するにはどうすればよいですか?ctrlxctrlvxsel

答え1

概要説明:

「カット」自体が遅い場合は、おそらく^X他のキーバインドの前に「カット」を付けている可能性があります。どのバインディングが存在するかを確認し、関連するバインディングを変更できます。

$ bindkey | grep '\^X'
"^X^B" vi-match-bracket
"^X^F" vi-find-next-char
"^X^J" vi-join
"^X^K" kill-buffer
"^X^N" infer-next-history
"^X^O" overwrite-mode
"^X^U" undo
"^X^V" vi-cmd-mode
"^X^X" exchange-point-and-mark
"^X*" expand-word
"^X=" what-cursor-position
"^XG" list-expand
"^Xg" list-expand
"^Xr" history-incremental-search-backward
"^Xs" history-incremental-search-forward
"^Xu" undo

ご覧のとおり、zshには自分のシステムですぐに使用できる複数のバインディングがあります。

これを変更したくない場合は、KEYTIMEOUT環境変数をデフォルトの0.4秒より短い値に設定すると待ち時間も短縮されますが、このようなマルチキーバインディングにはより速い入力速度が必要であることに注意してください。


スクリプト品質:

制御されない変数を最初の引数として使用するprintfことは問題があります。最初の引数は型文字列なので、再解釈され、必要に応じて機能しない可能性があります。

printf '%d'      # prints a "0" with no trailing newline
printf '%s' '%d' # prints "%d"

だからあなたは使用する必要がありますprintf '%s' "$CUTBUFFER"

また、ゼロに設定するには、REGION_ACTIVE割り当ての周りに括弧は必要ありません。あなたの代わりに((REGION_ACTIVE = 0))あなたはあなたになることができますREGION_ACTIVE=0

関連情報