summaryrefslogtreecommitdiff
path: root/autoload/windowing/detection.kak
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/windowing/detection.kak')
-rw-r--r--autoload/windowing/detection.kak71
1 files changed, 71 insertions, 0 deletions
diff --git a/autoload/windowing/detection.kak b/autoload/windowing/detection.kak
new file mode 100644
index 0000000..2fde81c
--- /dev/null
+++ b/autoload/windowing/detection.kak
@@ -0,0 +1,71 @@
+# 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' 'zellij' 'kitty' 'iterm' 'appleterminal' 'sway' 'wayland' 'x11' 'wezterm'
+
+declare-option -docstring %{
+ windowing module to use in the 'terminal' command
+} str windowing_module
+
+declare-option -docstring %{
+ where to create new windows in the 'terminal' command.
+
+ Possible values:
+ - "window" (default) - new window
+ - "horizontal" - horizontal split (left/right)
+ - "vertical" - vertical split (top/bottom)
+ - "tab" - new tab besides current window
+} str windowing_placement window
+
+define-command terminal -params 1.. -docstring %{
+ terminal <program> [<arguments>]: create a new terminal using the preferred windowing environment and placement
+
+ This executes "%opt{windowing_module}-terminal-%opt{windowing_placement}" with the given arguments.
+ If the windowing module is 'wayland', 'sway' or 'x11', then the 'termcmd' option is used as terminal program.
+
+ Example usage:
+
+ terminal sh
+ evaluate-commands %{ set local windowing_placement horizontal; terminal sh }
+
+ See also the 'new' command.
+} %{
+ "%opt{windowing_module}-terminal-%opt{windowing_placement}" %arg{@}
+}
+complete-command terminal shell
+
+hook -group windowing global KakBegin .* %{
+ evaluate-commands %sh{
+ set -- ${kak_opt_windowing_modules}
+ if [ $# -gt 0 ]; then
+ echo 'try %{ '
+ while [ $# -ge 1 ]; do
+ echo "require-module ${1}; set-option global windowing_module ${1} } catch %{ "
+ shift
+ done
+ echo "echo -debug 'no windowing module detected' }"
+ fi
+ }
+}