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

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

関連情報