Implement smarter detection of windowing environments.
This patch centralises the loading of windowing environments, in order to ensure that by default only a single module is loaded, rather than the current code which can load multiple potentially incompatible modules; and in order to provide the user with more control over the loading of windowing modules. The patch introduces a new str-list option `windowing_modules` which defines an ordered list of windowing modules to attempt to load. Modules are loaded in the order specified in the list until a module loads without error, at which point the process finishes. When loaded each windowing module tests the environment to determine whether it should load (e.g. the tmux module tests to see if it's being run within a tmux session), and if it determines that it should then it completes its loading without error. If it doesn't detect an appropriate environment then it returns an error, and the module loading logic tries the next module. The user can override the default `windowing_modules` list to specify their preferred modules (i.e. they can put kitty ahead of tmux if that's their preference, or they can leave out the x11 modules alltogether). In addition, if the `windowing_modules` option is an empty list this bypasses the environment detection logic completely, and allows the modules to be loaded manually - this allows a user to replace the windowing module loading logic with their own manual set up.
This commit is contained in:
parent
8abf18209e
commit
b875a1802c
41
rc/windowing/detection.kak
Normal file
41
rc/windowing/detection.kak
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# Attempt to detect the windowing environment we're operating in
|
||||||
|
#
|
||||||
|
# We try to load modules from the windowing_modules str-list option in order,
|
||||||
|
# stopping when one of the modules loads successfully. This ensures that only
|
||||||
|
# a single module is loaded by default.
|
||||||
|
#
|
||||||
|
# On load each module must attempt to detect the environment it's appropriate
|
||||||
|
# for, and if the environment isn't appropriate it must fail with an error.
|
||||||
|
# In addition, each module must check for the length of the windowing_modules
|
||||||
|
# str-list option defined below, and must /not/ check for an appropriate
|
||||||
|
# environment if the list is empty. An example of this test:
|
||||||
|
#
|
||||||
|
# evaluate-commands %sh{
|
||||||
|
# [ -z "${kak_opt_windowing_modules}" ] || [ -n "$TMUX" ] || echo 'fail tmux not detected'
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# Each module is expected to define at least two aliases:
|
||||||
|
# * terminal - create a new terminal with sensible defaults
|
||||||
|
# * focus - focus the specified client, defaulting to the current client
|
||||||
|
#
|
||||||
|
|
||||||
|
declare-option -docstring \
|
||||||
|
"Ordered list of windowing modules to try and load. An empty list disables
|
||||||
|
both automatic module loading and environment detection, enabling complete
|
||||||
|
manual control of the module loading." \
|
||||||
|
str-list windowing_modules 'tmux' 'screen' 'kitty' 'iterm' 'x11'
|
||||||
|
|
||||||
|
hook -group windowing global KakBegin .* %{
|
||||||
|
|
||||||
|
evaluate-commands %sh{
|
||||||
|
set -- ${kak_opt_windowing_modules}
|
||||||
|
if [ $# -gt 0 ]; then
|
||||||
|
echo 'try %{ '
|
||||||
|
while [ $# -gt 1 ]; do
|
||||||
|
echo "require-module ${1} } catch %{ "
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
echo "require-module ${1} }"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,16 +1,13 @@
|
||||||
# https://www.iterm2.com
|
# https://www.iterm2.com
|
||||||
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|
||||||
|
|
||||||
## The default behaviour for the `terminal` command is to open a vertical pane in
|
|
||||||
## an iTerm session if not in a tmux session.
|
|
||||||
hook global KakBegin .* %sh{
|
|
||||||
if [ "$TERM_PROGRAM" = "iTerm.app" ] && [ -z "$TMUX" ]; then
|
|
||||||
echo "require-module iterm"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
provide-module iterm %{
|
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-split-impl %{
|
define-command -hidden -params 2.. iterm-terminal-split-impl %{
|
||||||
nop %sh{
|
nop %sh{
|
||||||
direction="$1"
|
direction="$1"
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
|
# https://sw.kovidgoyal.net/kitty/index.html
|
||||||
hook -group kitty-hooks global KakBegin .* %sh{
|
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|
||||||
if [ "$TERM" = "xterm-kitty" ] && [ -z "$TMUX" ]; then
|
|
||||||
echo "require-module kitty"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
provide-module kitty %{
|
provide-module kitty %{
|
||||||
|
|
||||||
|
# ensure that we're running on kitty
|
||||||
|
evaluate-commands %sh{
|
||||||
|
[-z "${kak_opt_windowing_modules}" ] || [ "$TERM" = "xterm-kitty" ] || echo 'fail Kitty not detected'
|
||||||
|
}
|
||||||
|
|
||||||
declare-option -docstring %{window type that kitty creates on new and repl calls (kitty|os)} str kitty_window_type kitty
|
declare-option -docstring %{window type that kitty creates on new and repl calls (kitty|os)} str kitty_window_type kitty
|
||||||
|
|
||||||
define-command kitty-terminal -params 1.. -shell-completion -docstring '
|
define-command kitty-terminal -params 1.. -shell-completion -docstring '
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
# http://gnu.org/software/screen/
|
# http://gnu.org/software/screen/
|
||||||
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|
||||||
|
|
||||||
hook -group GNUscreen global KakBegin .* %sh{
|
|
||||||
[ -z "${STY}" ] && exit
|
|
||||||
echo "require-module screen"
|
|
||||||
}
|
|
||||||
|
|
||||||
provide-module screen %{
|
provide-module screen %{
|
||||||
|
|
||||||
|
# ensure that we're running under screen
|
||||||
|
evaluate-commands %sh{
|
||||||
|
[-z "${kak_opt_windowing_modules}" ] || [ -n "$STY" ] || echo 'fail screen not detected'
|
||||||
|
}
|
||||||
|
|
||||||
define-command screen-terminal-impl -hidden -params 3.. %{
|
define-command screen-terminal-impl -hidden -params 3.. %{
|
||||||
nop %sh{
|
nop %sh{
|
||||||
tty="$(ps -o tty ${kak_client_pid} | tail -n 1)"
|
tty="$(ps -o tty ${kak_client_pid} | tail -n 1)"
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
# http://tmux.github.io/
|
# http://tmux.github.io/
|
||||||
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|
||||||
|
|
||||||
hook global KakBegin .* %sh{
|
|
||||||
if [ -n "$TMUX" ]; then
|
|
||||||
echo "require-module tmux"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
provide-module tmux %{
|
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 %{
|
define-command -hidden -params 2.. tmux-terminal-impl %{
|
||||||
evaluate-commands %sh{
|
evaluate-commands %sh{
|
||||||
tmux=${kak_client_env_TMUX:-$TMUX}
|
tmux=${kak_client_env_TMUX:-$TMUX}
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
# x11
|
# x11
|
||||||
|
|
||||||
hook global KakBegin .* %sh{
|
|
||||||
if [ -n "$DISPLAY" ] && [ -z "$TMUX" ]; then
|
|
||||||
echo "require-module x11"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
provide-module x11 %{
|
provide-module x11 %{
|
||||||
|
|
||||||
|
# ensure that we're running in the right environment
|
||||||
|
evaluate-commands %sh{
|
||||||
|
[-z "${kak_opt_windowing_modules}" ] || [ -n "$DISPLAY" ] || echo 'fail DISPLAY is not set'
|
||||||
|
}
|
||||||
|
|
||||||
# termcmd should be set such as the next argument is the whole
|
# termcmd should be set such as the next argument is the whole
|
||||||
# command line to execute
|
# command line to execute
|
||||||
declare-option -docstring %{shell command run to spawn a new terminal
|
declare-option -docstring %{shell command run to spawn a new terminal
|
||||||
|
|
Loading…
Reference in New Issue
Block a user