A herbstluftwm scratchpad

May 27, 2021 – 100 days to offload countdown #99

The idea of a scratchpad like app is appealing to me, but I never got used to i3's scratchpad feature for one reason or another. Recently I stumbled upon herbstluftwm juggling, and the scratchpad section caught my attention. They use a small shellscript to have a wandering terminal window with the help of xdotool and herbstclient. I adapted the script to start konsole instead of urxvt, and start an emacsclient with the *scratch* buffer open – I have a terminal running tmux on $Mod-3, and that muscle memory will not go away. I had to alter the code a bit, I guess because of changes to herbstluftwm since the original post was written. Setup this way, I can take notes or paste code snippets, or json data into the emacs scratch buffer in a simple way. I'll see if I can get used to that.

#!/bin/bash
scratchpad=/tmp/herbstluftwm:scratchpad
if xdotool search --onlyvisible --name 'scratchpad' ; then 
    if [[ $(herbstclient list_monitors | grep '[FOCUS]' | cut -d'"' -f2) = $(herbstclient attr clients.$(cat $scratchpad) | grep 's - - tag' | awk '{ print $6 }' | cut -d'"' -f2) ]]; then 
        xdotool search --onlyvisible --name 'scratchpad' windowunmap 
        exit 
    fi 
fi 
if [[ -f "${scratchpad}" ]]; then
    if ! herbstclient chain . bring $(cat "${scratchpad}") . jumpto $(cat "${scratchpad}") ; then
        xdotool search --name 'scratchpad' windowmap && exit
    fi
fi
if ! xdotool search --name 'scratchpad' windowmap; then
    konsole -p Name=scratchpad -p tabtitle=scratchpad --hide-menubar --hide-tabbar -e scratch &
    xdotool search --sync --onlyvisible --name 'scratchpad' windowsize 66% 75%
    herbstclient attr clients.focus.winid > "${scratchpad}"
fi
alias scratch="emc -nw -c -e '(switch-to-buffer \"*scratch*\")'"
# scratchpad console
hc keybind $Mod-Return spawn ${HOME}/.config/herbstluftwm/scratchpad
hc rule class=konsole title~'^scratchpad.*$' floating=on floatplacement=center