更新 ZSH PS1 / 按键提示

更新 ZSH PS1 / 按键提示

我的 ZSH 提示符的一部分是大写锁定指示器。

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"

您会看到我正在使用 oh-my-zsh 和 POWERLEVEL9k 主题,尽管我不知道这对于这个问题是否有必要。

我想在按下大写锁定按钮时触发提示的重新绘制。这可能吗?

编辑:

感谢你们两位的回答,他们都有效。我只是在寻找接受两个答案的正确方法。

答案1

如果在 GNU/Linux 上,您可以xbindkeys在您的~/.xbindkeysrc文件中的 X 会话中安装并运行它:

"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 不知道这一点。

作为由斯特凡·查泽拉斯建议CapsLock,您可以使用 XBindKeys 在按下时执行 shell 命令。一个有用的命令是安排将 SIGWINCH 信号发送到 zsh。当 tty 大小设置被修改时(通常是终端仿真器的窗口大小发生变化时),内核会发送此信号。一些虚假的窗口大小变化指示不会造成伤害。如果您在 SSH 会话中具有 X11 转发并且将信号发送到 SSH 客户端,那么这甚至可以在通过 SSH 的远程 shell 中工作。

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) 将光标后面的单词变成大写,如果你愿意,你可以创建更多小部件来帮助实现这一点。)

相关内容