내 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
)를 사용하여 커서 뒤의 단어를 대문자로 표시할 수 있으며 원할 경우 이를 돕기 위해 더 많은 위젯을 만들 수 있습니다.)