Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: command on switching terminals?

On Sat, Jan 6, 2018 at 11:20 PM, Mikael Magnusson <mikachu@xxxxxxxxx> wrote:
> On Sat, Jan 6, 2018 at 6:33 AM, Ray Andrews <rayandrews@xxxxxxxxxxx> wrote:
>> Is it possible for zsh to know when the terminal in which it is running has
>> awakened by having the mouse moved into that window?  I understand that it's
>> the window manager that decides which terminal is active of course, but
>> perhaps zsh knows when it is put to sleep by the mouse moving out of it's
>> window, and also knows when it has been awakened again? I have a utility
>> that lets you hotkey a mouse jump between terminals so as to jump between
>> them without having to reach for the mouse itself, and I can call it fine
>> within a function, but I'd like to be able to also execute some code after
>> each jump but in the new window.  As it is, zsh just wakes up without
>> seeming to know it's been asleep so there's nothing to 'attach' any commands
>> to.  precmd() and preexec() are not aroused.   Any commands inside the
>> calling function placed after the command to jump to the new terminal are
>> executed in the old terminal, which is not surprising, so it would have to
>> depend on the awakened terminal knowing it's been awakened.  Sorta like
>> precmd but hooked to the activation of the terminal.  I understand that this
>> might be outside of zsh's domain.
> You can, yes. Note that if a program was running in the foreground,
> zsh won't know if the terminal is active or not once that program
> finishes though. I have never found a practical use for this.
> # this might work for more terminals but i haven't tested, adjust as needed
> # also check if you already have hooks for zle-line-init/finish and
> adjust those as needed instead
> # note also that leaving/entering a terminal will disable paste
> hilighting when the following stuff is enabled
> # These two hooks will enable and disable the terminal sending an
> escape code to the terminal when it receives/loses focus, since most
> programs won't handle them.
> function _zle_line_init() {
>   # enable focus events
>   [[ $TERM == rxvt-unicode || $TERM = xterm ]] && printf '\e[?1004h'
> }
> function _zle_line_finish() {
>   # disable focus events
>   [[ $TERM == rxvt-unicode || $TERM = xterm ]] && printf '\e[?1004l'
> }
> zle -N zle-line-init _zle_line_init
> zle -N zle-line-finish _zle_line_finish
> # Handle FocusIn/Out events
> bindkey '^[[I' focus-in
> bindkey '^[[O' focus-out
> # you can use two different functions too of course,
> # i just happened to want the same thing to happen in both cases
> # when i was testing this
> zle -N focus-in _focus_handler
> zle -N focus-out _focus_handler
> function _focus_handler() {
>   # $WIDGET will be focus-in when terminal receives
>   # focus and focus-out when losing it, eg
>   if [[ $WIDGET = focus-in ]]; then
>     zle -M "hey we got focus"
>   fi
> }

I forgot to include these lines,

# this is as close to no-op as you get in menuselect/isearch
bindkey -M menuselect '^[[I' redisplay
bindkey -M menuselect '^[[O' redisplay
bindkey -M isearch '^[[I' redisplay
bindkey -M isearch '^[[O' redisplay

Mikael Magnusson

Messages sorted by: Reverse Date, Date, Thread, Author