Atualizar ZSH PS1 / prompt ao pressionar a tecla

2

Parte do meu prompt do ZSH é um indicador de 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"

Você verá que eu estou usando o oh-my-zsh e o tema POWERLEVEL9k, embora eu não saiba se isso é necessário para a pergunta.

Gostaria de acionar o novo desenho do prompt quando o botão capslock for pressionado. Isso é possível?

EDITAR:

Obrigado a vocês por suas respostas, ambos trabalham. Eu estou apenas olhando para a maneira correta de aceitar duas respostas.

    
por Jonathan Hodgson 26.04.2018 / 13:35

2 respostas

2

Se no GNU / Linux, você pode instalar o xbindkeys e executá-lo na sua sessão X com o seu arquivo ~/.xbindkeysrc :

"echo . > ~/.caps"
  Caps_Lock

Então, no seu ~ / .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
    
por 26.04.2018 / 17:54
2

A dificuldade é que pressionar CapsLock não envia nada para os aplicativos do terminal, então o zsh não sabe disso.

Como sugerido por Stéphane Chazelas , você poderia usar XBindKeys para executar um comando shell quando CapsLock é pressionado. Um comando útil é organizar o envio do sinal SIGWINCH para zsh. Este sinal é enviado pelo kernel quando as configurações do tty size são modificadas (tipicamente por emuladores de terminal quando o tamanho da janela muda). Algumas indicações falsas de mudança de tamanho da janela não vão doer. Isso funcionará mesmo em um shell remoto sobre SSH se você tiver o encaminhamento do X11 na sessão SSH e enviar o sinal para o cliente SSH.

O Zsh não recalcula automaticamente a string de prompt, então diga para fazer isso configurando uma armadilha no SIGWINCH.

Em ~/.xbindkeysrc :

"pkill -u $USER -SIGWINCH -x 'ssh|zsh'"
    Caps_Lock

Em ~/.zshrc :

# + your CapsLock function
trap 'zle reset-prompt 2> /dev/null' SIGWINCH

(Ou você pode fazer o que eu faço, que é não ter uma tecla CapsLock . Em zsh, você pode usar ESC u ( up-case-word ) para tornar a palavra após o cursor em maiúsculas , e você pode criar mais widgets para ajudar com isso, se quiser.)

    
por 27.04.2018 / 00:06