diff options
author | thing1 <thing1@seacrossedlovers.xyz> | 2025-01-28 09:14:32 +0000 |
---|---|---|
committer | thing1 <thing1@seacrossedlovers.xyz> | 2025-01-28 09:14:32 +0000 |
commit | 904cec3c4a329cf89fc3219d359239910d61f3f6 (patch) | |
tree | 8d113899921dfbaca0e77c49ab5fc827362d1091 /autoload/windowing/tmux.kak |
Diffstat (limited to 'autoload/windowing/tmux.kak')
-rw-r--r-- | autoload/windowing/tmux.kak | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/autoload/windowing/tmux.kak b/autoload/windowing/tmux.kak new file mode 100644 index 0000000..2d43db0 --- /dev/null +++ b/autoload/windowing/tmux.kak @@ -0,0 +1,82 @@ +# 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" "$@" + else + TMUX=$tmux tmux $tmux_args "$@" + 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 + +} |