746e0d032f
Today I can control "terminal" and "new" by changing the terminal alias but I always need to choose a concrete implementation, like "tmux-terminal-horizontal", even when there is otherwise no need to mention tmux in my config. Allow to configure windowing system and window placement independently by introducing dedicated options. This allows to create mappings that work in any windowing system like map global user c %{:with-option windowing_placement window new<ret>} map global user '"' %{:with-option windowing_placement vertical new<ret>} map global user '%' %{:with-option windowing_placement horizontal new<ret>} For windowing systems that don't support all placements, you can wrap the above in try/catch to fall back on the "window" variant which is defined for all windowing systems. When using multiple (nested) windowing systems, you might want to add mappings like map global user t %{:with-option windowing_module tmux new<ret>} map global user T %{:with-option windowing_module wayland new<ret>} --- This changes the default "terminal" alias for some modules. In particular, instead of delegating to iterm-terminal-vertical screen-terminal-vertical tmux-terminal-horizontal wezterm-terminal-vertical it will now by default delegate to the respective "-window" variant. We could maintain backwards compatiblity here by setting the "windowing_placement" option accordingly, but the new behavior seems more logical? Also, this removes the "terminal-tab" alias which was only defined by the kitty module. We could try to keep the alias approach and implement a "with-alias" command, however that approach can only capture both dimensions (windowing system and placement) if we add tons of commands like "terminal-horizontal" (with implied windowing system) and "tmux-terminal" (with implied placement). Side thought: we could also get rid of the "focus" alias and instead define define-command focus %{ "%opt{windowing_module}-focus" } Closes #3943, #4425
83 lines
3.2 KiB
Plaintext
83 lines
3.2 KiB
Plaintext
# http://tmux.github.io/
|
|
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|
|
|
|
provide-module tmux %{
|
|
|
|
# ensure we're running under tmux
|
|
evaluate-commands %sh{
|
|
[ -z "${kak_opt_windowing_modules}" ] || [ -n "$TMUX" ] || echo 'fail tmux not detected'
|
|
}
|
|
|
|
define-command -hidden -params 2.. tmux-terminal-impl %{
|
|
evaluate-commands %sh{
|
|
tmux=${kak_client_env_TMUX:-$TMUX}
|
|
if [ -z "$tmux" ]; then
|
|
echo "fail 'This command is only available in a tmux session'"
|
|
exit
|
|
fi
|
|
tmux_args="$1"
|
|
if [ "${1%%-*}" = split ]; then
|
|
tmux_args="$tmux_args -t ${kak_client_env_TMUX_PANE}"
|
|
elif [ "${1%% *}" = new-window ]; then
|
|
session_id=$(tmux display-message -p -t ${kak_client_env_TMUX_PANE} '#{session_id}')
|
|
tmux_args="$tmux_args -t $session_id"
|
|
fi
|
|
shift
|
|
# ideally we should escape single ';' to stop tmux from interpreting it as a new command
|
|
# but that's probably too rare to care
|
|
if [ -n "$TMPDIR" ]; then
|
|
TMUX=$tmux tmux $tmux_args env TMPDIR="$TMPDIR" "$@" < /dev/null > /dev/null 2>&1 &
|
|
else
|
|
TMUX=$tmux tmux $tmux_args "$@" < /dev/null > /dev/null 2>&1 &
|
|
fi
|
|
}
|
|
}
|
|
|
|
define-command tmux-terminal-vertical -params 1.. -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{@}
|
|
}
|
|
complete-command tmux-terminal-vertical shell
|
|
|
|
define-command tmux-terminal-horizontal -params 1.. -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{@}
|
|
}
|
|
complete-command tmux-terminal-horizontal shell
|
|
|
|
define-command tmux-terminal-window -params 1.. -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{@}
|
|
}
|
|
complete-command tmux-terminal-window shell
|
|
|
|
define-command tmux-focus -params ..1 -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 "evaluate-commands -client '%s' focus" "$1"
|
|
elif [ -n "${kak_client_env_TMUX}" ]; then
|
|
# select-pane makes the pane active in the window, but does not select the window. Both select-pane
|
|
# and select-window should be invoked in order to select a pane on a currently not focused window.
|
|
TMUX="${kak_client_env_TMUX}" tmux select-window -t "${kak_client_env_TMUX_PANE}" \; \
|
|
select-pane -t "${kak_client_env_TMUX_PANE}" > /dev/null
|
|
fi
|
|
}
|
|
}
|
|
complete-command -menu tmux-focus client
|
|
|
|
## The default behaviour for the `new` command is to open an horizontal pane in a tmux session
|
|
alias global focus tmux-focus
|
|
|
|
}
|