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