# x11 hook global KakBegin .* %sh{ if [ -n "$DISPLAY" ] && [ -z "$TMUX" ]; then echo "require-module x11" fi } provide-module x11 %{ # termcmd should be set such as the next argument is the whole # command line to execute declare-option -docstring %{shell command run to spawn a new terminal A shell command is appended to the one set in this option at runtime} \ str termcmd %sh{ for termcmd in 'alacritty -e sh -c' \ 'kitty sh -c' \ 'termite -e ' \ 'urxvt -e sh -c' \ 'rxvt -e sh -c' \ 'xterm -e sh -c' \ 'roxterm -e sh -c' \ 'mintty -e sh -c' \ 'sakura -x ' \ 'gnome-terminal -e ' \ 'xfce4-terminal -e ' \ 'konsole -e '; do terminal=${termcmd%% *} if command -v $terminal >/dev/null 2>&1; then printf %s\\n "$termcmd" exit fi done } define-command x11-terminal -params 1.. -shell-completion -docstring ' x11-terminal []: create a new terminal as an x11 window The program passed as argument will be executed in the new terminal' \ %{ evaluate-commands %sh{ if [ -z "${kak_opt_termcmd}" ]; then echo "fail 'termcmd option is not set'" exit fi # join arguments into a single string, in which they're delimited # by single quotes, and with single quotes inside transformed to '\'' # so that sh -c "$args" will re-split the arguments properly # example: # $1 = ab # $2 = foo bar # $3 = # $4 = foo'bar # $args = 'ab' 'foo bar' '' 'foo'\''bar' # would be nicer to do in a single sed/awk call but that's difficult args=$( for i in "$@"; do # special case to preserve empty variables as sed won't touch these if [ "$i" = '' ]; then printf "'' " else printf %s "$i" | sed -e "s|'|'\\\\''|g; s|^|'|; s|$|' |" fi done ) setsid ${kak_opt_termcmd} "$args" < /dev/null > /dev/null 2>&1 & } } define-command x11-focus -params ..1 -client-completion -docstring ' x11-focus []: focus a given client''s window If no client is passed, then the current client is used' \ %{ evaluate-commands %sh{ if [ $# -eq 1 ]; then printf "evaluate-commands -client '%s' focus" "$1" else xdotool windowactivate $kak_client_env_WINDOWID > /dev/null fi } } alias global focus x11-focus alias global terminal x11-terminal }