ZSH PS1 업데이트/키 프롬프트

ZSH PS1 업데이트/키 프롬프트

내 ZSH 프롬프트의 일부는 Caps Lock 표시기입니다.

function Capslock(){
    x=$(xset -q | grep Caps) 2> /dev/null || exit 0
    x=${x:22:1}
    if [[ $x == "n" ]]; then

        echo ""
    fi
}
POWERLEVEL9K_CUSTOM_CAPS="Capslock"
POWERLEVEL9K_CUSTOM_CAPS_BACKGROUND="red"
POWERLEVEL9K_CUSTOM_CAPS_FOREGROUND="white"

이 문제에 필요한지는 모르겠지만 POWERLEVEL9k 테마와 함께 oh-my-zsh를 사용하고 있음을 알 수 있습니다.

Caps Lock 버튼을 눌렀을 때 프롬프트 다시 그리기를 실행하고 싶습니다. 가능합니까?

편집하다:

귀하의 답변에 감사드립니다. 둘 다 작동합니다. 나는 두 가지 답변을 모두 받아들이는 올바른 방법을 찾고 있습니다.

답변1

GNU/Linux의 경우 파일의 X 세션에서 설치하고 실행할 수 xbindkeys있습니다 ~/.xbindkeysrc.

"echo . > ~/.caps"
  Caps_Lock

그런 다음 ~/.zshrc에서:

exec {CAPS_MONITOR}< <(tail -f ~/.caps 2> /dev/null)
caps-monitor() {
  if
    read <&$CAPS_MONITOR # consume the input
  then
    zle -R # redraw the prompt
    #zle -M "CapsLock pressed [$((++n))]" # uncomment to verify it works
  else
    zle -M "CapsLock handler dysfunctional, stopping the monitoring"
    zle -F $CAPS_MONITOR
  fi
}
zle -N caps-monitor
zle -wF $CAPS_MONITOR caps-monitor

답변2

어려운 점은 를 눌러도 CapsLock터미널 애플리케이션에 아무 것도 보내지 않기 때문에 zsh가 이에 대해 알지 못한다는 것입니다.

~처럼Stefan Chazeras가 제안한 것CapsLock, XBindKeys를 사용하여 누르면 셸 명령을 실행할 수 있습니다. 유용한 명령은 SIGWINCH 신호가 zsh로 전송되도록 예약하는 것입니다. 커널은 tty 크기 설정이 수정될 때(일반적으로 터미널 에뮬레이터의 창 크기가 변경될 때) 이 신호를 보냅니다. 창 크기 변경에 대한 몇 가지 잘못된 표시는 문제가 되지 않습니다. SSH 세션에서 X11 전달이 있고 신호를 SSH 클라이언트로 보내는 경우 SSH를 통한 원격 셸에서도 작동할 수 있습니다.

Zsh는 프롬프트 문자열을 자동으로 다시 계산하지 않으므로 SIGWINCH에 트랩을 설정하여 그렇게 하도록 지시합니다.

존재하다 ~/.xbindkeysrc:

"pkill -u $USER -SIGWINCH -x 'ssh|zsh'"
    Caps_Lock

존재하다 ~/.zshrc:

# + your CapsLock function
trap 'zle reset-prompt 2> /dev/null' SIGWINCH

(아니면 나처럼 키가 없을 수도 있습니다 CapsLock. zsh에서는 ESC u( up-case-word)를 사용하여 커서 뒤의 단어를 대문자로 표시할 수 있으며 원할 경우 이를 돕기 위해 더 많은 위젯을 만들 수 있습니다.)

관련 정보