Zsh 라인 편집기가 활성화된 동안 Ctrl + C를 사용하여 텍스트 복사

Zsh 라인 편집기가 활성화된 동안 Ctrl + C를 사용하여 텍스트 복사

단어 선택을 지원하기 위해 Zsh에 몇 가지 키보드 단축키를 추가했습니다.

Ctrl + C선택 항목에서 작업을 수행하려면 이를 사용 하여 복사 하고 싶습니다 . 그러나 Ctrl + CZLE(Zsh Line Editor)가 활성화되지 않은 경우에도 인터럽트 루틴을 사용하고 싶습니다.

가능합니까? 어떻게 해야 합니까? a 를 function TRAPINTHook 으로 선언하려고 하는데 Ctrl + CZLE에서 을 누르면 Ctrl + C함수가 호출되지 않는 것 같습니다.

답변1

다음 코드를 사용하면 일반적인 단축키인 를 사용하여 Ctrl + XZsh Ctrl + CCtrl + 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
}

관련 정보