kakoune/rc/windowing/iterm.kak
Johannes Altmanninger 746e0d032f rc windowing: allow to configure windowing system and window placement in new/terminal commands
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
2023-11-13 22:54:49 +01:00

125 lines
5.4 KiB
Plaintext

# https://www.iterm2.com
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
provide-module iterm %{
# ensure that we're running on iTerm
evaluate-commands %sh{
[ -z "${kak_opt_windowing_modules}" ] || [ "$TERM_PROGRAM" = "iTerm.app" ] || echo 'fail iTerm not detected'
}
define-command -hidden -params 2.. iterm-terminal-impl %{
nop %sh{
direction="$1"
shift
# join the arguments as one string for the shell execution (see x11.kak)
args=$(
for i in "$@"; do
printf "'%s' " "$(printf %s "$i" | sed "s|'|'\\\\''|g")"
done
)
# go through another round of escaping for osascript
# \ -> \\
# " -> \"
do_esc() {
printf %s "$*" | sed -e 's|\\|\\\\|g; s|"|\\"|g'
}
escaped=$(do_esc "$args")
esc_path=$(do_esc "$PATH")
esc_tmp=$(do_esc "$TMPDIR")
cmd="env PATH='${esc_path}' TMPDIR='${esc_tmp}' $escaped"
if [ "$direction" = 'tab' ]; then
osascript \
-e "tell application \"iTerm\"" \
-e " tell current window" \
-e " create tab with default profile command \"${cmd}\"" \
-e " end tell" \
-e "end tell" >/dev/null
elif [ "$direction" = 'window' ]; then
osascript \
-e "tell application \"iTerm\"" \
-e " create window with default profile command \"${cmd}\"" \
-e "end tell" >/dev/null
else
osascript \
-e "tell application \"iTerm\"" \
-e " tell current session of current window" \
-e " tell (split ${direction} with same profile command \"${cmd}\") to select" \
-e " end tell" \
-e "end tell" >/dev/null
fi
}
}
define-command iterm-terminal-vertical -params 1.. -docstring '
iterm-terminal-vertical <program> [<arguments>]: create a new terminal as an iterm pane
The current pane is split into two, left and right
The program passed as argument will be executed in the new terminal'\
%{
iterm-terminal-impl 'vertically' %arg{@}
}
complete-command iterm-terminal-vertical shell
define-command iterm-terminal-horizontal -params 1.. -docstring '
iterm-terminal-horizontal <program> [<arguments>]: create a new terminal as an iterm pane
The current pane is split into two, top and bottom
The program passed as argument will be executed in the new terminal'\
%{
iterm-terminal-impl 'horizontally' %arg{@}
}
complete-command iterm-terminal-horizontal shell
define-command iterm-terminal-tab -params 1.. -docstring '
iterm-terminal-tab <program> [<arguments>]: create a new terminal as an iterm tab
The program passed as argument will be executed in the new terminal'\
%{
iterm-terminal-impl 'tab' %arg{@}
}
complete-command iterm-terminal-tab shell
define-command iterm-terminal-window -params 1.. -docstring '
iterm-terminal-window <program> [<arguments>]: create a new terminal as an iterm window
The program passed as argument will be executed in the new terminal'\
%{
iterm-terminal-impl 'window' %arg{@}
}
complete-command iterm-terminal-window shell
define-command iterm-focus -params ..1 -docstring '
iterm-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"
else
session="${kak_client_env_ITERM_SESSION_ID#*:}"
osascript \
-e "tell application \"iTerm\" to repeat with aWin in windows" \
-e " tell aWin to repeat with aTab in tabs" \
-e " tell aTab to repeat with aSession in sessions" \
-e " tell aSession" \
-e " if (unique id = \"${session}\") then" \
-e " tell aWin" \
-e " select" \
-e " end tell" \
-e " tell aTab" \
-e " select" \
-e " end tell" \
-e " select" \
-e " end if" \
-e " end tell" \
-e " end repeat" \
-e " end repeat" \
-e "end repeat"
fi
}
}
complete-command -menu iterm-focus client
alias global focus iterm-focus
}