私の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
(または私のようにキーがない可能性があります。zshCapsLockでは、ESC u
(up-case-word
)を使用してカーソルの後ろの単語を大文字で表示でき、必要に応じてこれを支援するためのより多くのウィジェットを作成できます。)