Expose a 'terminal' command for the various windowing systems

It allows plugins to create generic terminal using the user's preferred windowing system
For example, it can be used to run fzf, gdb or simply a shell.

* 'new' commands are refactored to simply use the 'terminal' one
* style and docstrings has been unified
* all windowing systems go through "sh -c" for consistency purposes, even if unnecessary
This commit is contained in:
Olivier Perret 2018-12-02 13:59:45 +01:00
parent 6f9e297def
commit c8403624a7
4 changed files with 188 additions and 95 deletions

View File

@ -6,44 +6,70 @@ hook -group GNUscreen global KakBegin .* %sh{
echo "
alias global focus screen-focus
alias global new screen-new-vertical
alias global terminal screen-terminal-vertical
"
}
define-command screen-new-vertical -params .. -command-completion -docstring "Split the current pane into two, left and right" %{
define-command screen-terminal-impl -hidden -params 3.. -command-completion %{
nop %sh{
tty="$(ps -o tty ${kak_client_pid} | tail -n 1)"
screen -X eval \
'split -h' \
'focus down' \
"screen sh -c 'kak -c \"${kak_session}\" -e \"$*\" ;
screen -X remove'" \
< "/dev/$tty"
screen -X eval "$1" "$2"
shift 2
cmd=$(printf %s "$*")
screen -X screen sh -c "${cmd}; screen -X remove" < "/dev/$tty"
}
}
define-command screen-new-horizontal -params .. -command-completion -docstring "Split the current pane into two, top and bottom" %{
define-command screen-terminal-vertical -params 1.. -command-completion -docstring '
screen-terminal-vertical <program> [<arguments>]: create a new terminal as a screen pane
The current pane is split into two, left and right
The program passed as argument will be executed in the new terminal' \
%{
screen-terminal-impl 'split -v' 'focus right' %arg{@}
}
define-command screen-terminal-horizontal -params 1.. -command-completion -docstring '
screen-terminal-horizontal <program> [<arguments>]: create a new terminal as a screen pane
The current pane is split into two, top and bottom
The program passed as argument will be executed in the new terminal' \
%{
screen-terminal-impl 'split -h' 'focus down' %arg{@}
}
define-command screen-terminal-window -params 1.. -command-completion -docstring '
screen-terminal-window <program> [<arguments>]: create a new terminal as a screen window
The program passed as argument will be executed in the new terminal' \
%{
nop %sh{
tty="$(ps -o tty ${kak_client_pid} | tail -n 1)"
screen -X eval \
'split -v' \
'focus right' \
"screen sh -c 'kak -c \"${kak_session}\" -e \"$*\" ;
screen -X remove'" \
< "/dev/$tty"
screen -X screen sh -c "$*" < "/dev/$tty"
}
}
define-command screen-new-window -params .. -command-completion -docstring "Create a new window" %{
nop %sh{
tty="$(ps -o tty ${kak_client_pid} | tail -n 1)"
screen -X screen kak -c "${kak_session}" -e "$*" < "/dev/$tty"
define-command screen-new-vertical -params .. -command-completion -docstring '
screen-new-vertical [<commands>]: create a new kakoune client as a screen pane
The current pane is split into two, left and right
The optional arguments are passed as commands to the new client' \
%{
screen-terminal-vertical "kak -c '%val{session}' -e '%arg{@}'"
}
define-command screen-new-horizontal -params .. -command-completion -docstring '
screen-new-horizontal [<commands>]: create a new kakoune client as a screen pane
The current pane is split into two, top and bottom
The optional arguments are passed as commands to the new client' \
%{
screen-terminal-horizontal "kak -c '%val{session}' -e '%arg{@}'"
}
define-command screen-new-window -params .. -command-completion -docstring '
screen-new-window [<commands>]: create a new kakoune client as a screen window
The optional arguments are passed as commands to the new client' \
%{
screen-terminal-window "kak -c '%val{session}' -e '%arg{@}'"
}
define-command -docstring %{screen-focus [<client>]: focus the given client
If no client is passed then the current one is used} \
-params ..1 -client-completion \
screen-focus %{ evaluate-commands %sh{
define-command screen-focus -params ..1 -client-completion -docstring '
screen-focus [<client>]: focus the given client
If no client is passed then the current one is used' \
%{
evaluate-commands %sh{
if [ $# -eq 1 ]; then
printf %s\\n "
evaluate-commands -client '$1' focus
@ -52,4 +78,5 @@ If no client is passed then the current one is used} \
tty="$(ps -o tty ${kak_client_pid} | tail -n 1)"
screen -X select "${kak_client_env_WINDOW}" < "/dev/$tty"
fi
} }
}
}

View File

@ -7,44 +7,75 @@ hook global KakBegin .* %sh{
echo "
alias global focus tmux-focus
alias global new tmux-new-horizontal
alias global terminal tmux-terminal-horizontal
"
fi
}
## Temporarily override the default client creation command
define-command -hidden -params 1.. tmux-new-impl %{
define-command -hidden -params 2.. tmux-terminal-impl %{
evaluate-commands %sh{
tmux=${kak_client_env_TMUX:-$TMUX}
if [ -z "$tmux" ]; then
echo "echo -markup '{Error}This command is only available in a tmux session'"
echo "fail 'This command is only available in a tmux session'"
exit
fi
tmux_args="$1"
shift
if [ $# -ne 0 ]; then kakoune_params="-e '$@'"; fi
TMUX=$tmux tmux $tmux_args "env TMPDIR='${TMPDIR}' kak -c ${kak_session} ${kakoune_params}" < /dev/null > /dev/null 2>&1 &
TMUX=$tmux tmux $tmux_args env TMPDIR="$TMPDIR" sh -c "$*" < /dev/null > /dev/null 2>&1 &
}
}
define-command tmux-new-vertical -params .. -command-completion -docstring "Split the current pane into two, top and bottom" %{
tmux-new-impl 'split-window -v' %arg{@}
define-command tmux-terminal-vertical -params 1.. -shell-completion -docstring '
tmux-terminal-vertical <program> [<arguments>]: create a new terminal as a tmux pane
The current pane is split into two, top and bottom
The program passed as argument will be executed in the new terminal' \
%{
tmux-terminal-impl 'split-window -v' %arg{@}
}
define-command tmux-terminal-horizontal -params 1.. -shell-completion -docstring '
tmux-terminal-horizontal <program> [<arguments>]: create a new terminal as a tmux pane
The current pane is split into two, left and right
The program passed as argument will be executed in the new terminal' \
%{
tmux-terminal-impl 'split-window -h' %arg{@}
}
define-command tmux-terminal-window -params 1.. -shell-completion -docstring '
tmux-terminal-window <program> [<arguments>]: create a new terminal as a tmux window
The program passed as argument will be executed in the new terminal' \
%{
tmux-terminal-impl 'new-window' %arg{@}
}
define-command tmux-new-horizontal -params .. -command-completion -docstring "Split the current pane into two, left and right" %{
tmux-new-impl 'split-window -h' %arg{@}
define-command tmux-new-vertical -params .. -command-completion -docstring '
tmux-new-vertical [<commands>]: create a new kakoune client as a tmux pane
The current pane is split into two, top and bottom
The optional arguments are passed as commands to the new client' \
%{
tmux-terminal-vertical "kak -c %val{session} -e '%arg{@}'"
}
define-command tmux-new-horizontal -params .. -command-completion -docstring '
tmux-new-horizontal [<commands>]: create a new kakoune client as a tmux pane
The current pane is split into two, left and right
The optional arguments are passed as commands to the new client' \
%{
tmux-terminal-horizontal "kak -c %val{session} -e '%arg{@}'"
}
define-command tmux-new-window -params .. -command-completion -docstring '
tmux-new-window [<commands>]: create a new kakoune client as a tmux window
The optional arguments are passed as commands to the new client' \
%{
tmux-terminal-window "kak -c %val{session} -e '%arg{@}'"
}
define-command tmux-new-window -params .. -command-completion -docstring "Create a new window" %{
tmux-new-impl 'new-window' %arg{@}
}
define-command -docstring %{tmux-focus [<client>]: focus the given client
If no client is passed then the current one is used} \
-params ..1 -client-completion \
tmux-focus %{ evaluate-commands %sh{
define-command tmux-focus -params ..1 -client-completion -docstring '
tmux-focus [<client>]: focus the given client
If no client is passed then the current one is used' \
%{
evaluate-commands %sh{
if [ $# -eq 1 ]; then
printf %s\\n "evaluate-commands -client '$1' focus"
printf "evaluate-commands -client '%s' focus" "$1"
elif [ -n "${kak_client_env_TMUX}" ]; then
TMUX="${kak_client_env_TMUX}" tmux select-pane -t "${kak_client_env_TMUX_PANE}" > /dev/null
fi
} }
}
}

View File

@ -22,29 +22,39 @@ A shell command is appended to the one set in this option at runtime} \
done
}
define-command -docstring %{x11-new [<command>]: create a new kak client for the current session
The optional arguments will be passed as arguments to the new client} \
-params .. \
-command-completion \
x11-new %{ evaluate-commands %sh{
define-command x11-terminal -params 1.. -shell-completion -docstring '
x11-terminal <program> [<arguments>]: 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 "echo -markup '{Error}termcmd option is not set'"
echo "fail 'termcmd option is not set'"
exit
fi
if [ $# -ne 0 ]; then kakoune_params="-e '$@'"; fi
setsid ${kak_opt_termcmd} "kak -c ${kak_session} ${kakoune_params}" < /dev/null > /dev/null 2>&1 &
}}
setsid ${kak_opt_termcmd} "$*" < /dev/null > /dev/null 2>&1 &
}
}
define-command -docstring %{x11-focus [<client>]: focus a given client's window
If no client is passed, then the current client is used} \
-params ..1 -client-completion \
x11-focus %{ evaluate-commands %sh{
define-command x11-new -params .. -command-completion -docstring '
x11-new [<commands>]: create a new kakoune client as an x11 window
The optional arguments are passed as commands to the new client' \
%{
x11-terminal "kak -c %val{session} -e '%arg{@}'"
}
define-command x11-focus -params ..1 -client-completion -docstring '
x11-focus [<kakoune_client>]: 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 %s\\n "evaluate-commands -client '$1' focus"
printf "evaluate-commands -client '%s' focus" "$1"
else
xdotool windowactivate $kak_client_env_WINDOWID > /dev/null
fi
} }
}
}
alias global focus x11-focus
alias global new x11-new
alias global terminal x11-terminal

View File

@ -5,6 +5,8 @@ hook -group kitty-hooks global KakBegin .* %sh{
echo "
alias global new kitty-new
alias global new-tab kitty-new-tab
alias global terminal kitty-terminal
alias global terminal-tab kitty-terminal-tab
alias global focus kitty-focus
alias global repl kitty-repl
alias global send-text kitty-send-text
@ -12,42 +14,65 @@ hook -group kitty-hooks global KakBegin .* %sh{
fi
}
define-command -docstring %{kitty-new [<command>]: create a new kak client for the current session
Optional arguments are passed as arguments to the new client} \
-params .. \
-command-completion \
kitty-new %{ nop %sh{
kitty @ new-window --no-response --window-type $kak_opt_kitty_window_type "$(command -v kak 2>/dev/null)" -c "${kak_session}" -e "$*"
}}
define-command kitty-terminal -params 1.. -shell-completion -docstring '
kitty-terminal <program> [<arguments>]: create a new terminal as a kitty window
The program passed as argument will be executed in the new terminal' \
%{
nop %sh{
kitty @ new-window --no-response --window-type $kak_opt_kitty_window_type sh -c "$*"
}
}
define-command -docstring %{kitty-new-tab [<arguments>]: create a new tab
All optional arguments are forwarded to the new kak client} \
-params .. \
-command-completion \
kitty-new-tab %{ nop %sh{
kitty @ new-window --no-response --new-tab "$(command -v kak 2>/dev/null)" -c "${kak_session}" -e "$*"
}}
define-command kitty-new -params .. -command-completion -docstring '
kitty-new [<commands>]: create a new kakoune client as a kitty window
The optional arguments are passed as commands to the new client' \
%{
kitty-terminal "kak -c %val{session} -e '%arg{@}'"
}
define-command -params ..1 -client-completion \
-docstring %{kitty-focus [<client>]: focus the given client
If no client is passed then the current one is used} \
kitty-focus %{ evaluate-commands %sh{
define-command kitty-terminal-tab -params 1.. -shell-completion -docstring '
kitty-terminal-tab <program> [<arguments>]: create a new terminal as kitty tab
The program passed as argument will be executed in the new terminal' \
%{
nop %sh{
kitty @ new-window --no-response --new-tab sh -c "$*"
}
}
define-command kitty-new-tab -params .. -command-completion -docstring '
kitty-new-tab <program> [<arguments>]: create a new terminal as kitty tab
The optional arguments are passed as commands to the new client' \
%{
kitty-terminal-tab "kak -c %val{session} -e '%arg{@}'"
}
define-command kitty-focus -params ..1 -client-completion -docstring '
kitty-focus [<client>]: focus the given client
If no client is passed then the current one is used' \
%{
evaluate-commands %sh{
if [ $# -eq 1 ]; then
printf %s\\n "evaluate-commands -client '$1' focus"
printf "evaluate-commands -client '%s' focus" "$1"
else
kitty @ focus-tab --no-response -m=id:$kak_client_env_KITTY_WINDOW_ID
kitty @ focus-window --no-response -m=id:$kak_client_env_KITTY_WINDOW_ID
fi
}}
}
}
define-command -docstring %{kitty-repl [<arguments>]: create a new window for repl interaction
All optional parameters are forwarded to the new window} \
-params .. \
-shell-completion \
kitty-repl %{ evaluate-commands %sh{
if [ $# -eq 0 ]; then cmd="${SHELL:-/bin/sh}"; else cmd="$*"; fi
define-command kitty-repl -params .. -shell-completion -docstring '
kitty-repl [<arguments>]: create a new window for repl interaction
All optional parameters are forwarded to the new window' \
%{
nop %sh{
if [ $# -eq 0 ]; then
cmd="${SHELL:-/bin/sh}"
else
cmd="$*"
fi
kitty @ new-window --no-response --window-type $kak_opt_kitty_window_type --title kak_repl_window --cwd "$PWD" $cmd < /dev/null > /dev/null 2>&1 &
}}
}
}
define-command kitty-send-text -docstring "send the selected text to the repl window" %{
nop %sh{