summaryrefslogtreecommitdiff
path: root/autoload/windowing/repl
diff options
context:
space:
mode:
authorthing1 <thing1@seacrossedlovers.xyz>2025-01-28 09:14:32 +0000
committerthing1 <thing1@seacrossedlovers.xyz>2025-01-28 09:14:32 +0000
commit904cec3c4a329cf89fc3219d359239910d61f3f6 (patch)
tree8d113899921dfbaca0e77c49ab5fc827362d1091 /autoload/windowing/repl
init commitHEADmaster
Diffstat (limited to 'autoload/windowing/repl')
-rw-r--r--autoload/windowing/repl/dtach.kak38
-rw-r--r--autoload/windowing/repl/kitty.kak56
-rw-r--r--autoload/windowing/repl/tmux.kak91
-rw-r--r--autoload/windowing/repl/x11.kak41
4 files changed, 226 insertions, 0 deletions
diff --git a/autoload/windowing/repl/dtach.kak b/autoload/windowing/repl/dtach.kak
new file mode 100644
index 0000000..02d11ec
--- /dev/null
+++ b/autoload/windowing/repl/dtach.kak
@@ -0,0 +1,38 @@
+provide-module dtach-repl %{
+
+# test if dtach is installed
+evaluate-commands %sh{
+ [ -n "$(command -v dtach)" ] || echo 'fail dtach not found'
+}
+
+declare-option -docstring "id of the REPL" str dtach_repl_id
+
+define-command -docstring %{
+ dtach-repl [<arguments>]: create a new terminal window for repl interaction
+ All optional parameters are forwarded to the new terminal window
+} \
+ -params .. \
+ dtach-repl %{ terminal sh -c %{
+ file="$(mktemp -u -t kak_dtach_repl.XXXXX)"
+ trap 'rm -f "${file}"' EXIT
+ printf "evaluate-commands -try-client $1 \
+ 'set-option current dtach_repl_id ${file}'" | kak -p "$2"
+ shift 2
+ dtach -c "${file}" -E sh -c "${@:-$SHELL}" || "${@:-$SHELL}"
+ } -- %val{client} %val{session} %arg{@}
+}
+complete-command dtach-repl shell
+
+define-command dtach-send-text -params 0..1 -docstring %{
+ dtach-send-text [text]: Send text to the REPL.
+ If no text is passed, then the selection is used
+ } %{
+ nop %sh{
+ printf "%s" "${@:-$kak_selection}" | dtach -p "$kak_opt_dtach_repl_id"
+ }
+}
+
+alias global repl-new dtach-repl
+alias global repl-send-text dtach-send-text
+
+}
diff --git a/autoload/windowing/repl/kitty.kak b/autoload/windowing/repl/kitty.kak
new file mode 100644
index 0000000..1f60366
--- /dev/null
+++ b/autoload/windowing/repl/kitty.kak
@@ -0,0 +1,56 @@
+hook global ModuleLoaded kitty %{
+ require-module kitty-repl
+}
+
+provide-module kitty-repl %{
+
+define-command -params .. \
+ -docstring %{
+ kitty-repl [<arguments>]: Create a new window for repl interaction.
+
+ All optional parameters are forwarded to the new window.
+ } \
+ kitty-repl %{
+ nop %sh{
+ if [ $# -eq 0 ]; then
+ cmd="${SHELL:-/bin/sh}"
+ else
+ cmd="$*"
+ fi
+
+ match=""
+ if [ -n "$kak_client_env_KITTY_WINDOW_ID" ]; then
+ match="--match=window_id:$kak_client_env_KITTY_WINDOW_ID"
+ fi
+
+ listen=""
+ if [ -n "$kak_client_env_KITTY_LISTEN_ON" ]; then
+ listen="--to=$kak_client_env_KITTY_LISTEN_ON"
+ fi
+
+ kitty @ $listen launch --no-response --keep-focus --type="$kak_opt_kitty_window_type" --title=kak_repl_window --cwd="$PWD" $match $cmd
+ }
+}
+complete-command kitty-repl shell
+
+define-command -hidden -params 0..1 \
+ -docstring %{
+ kitty-send-text [text]: Send text to the REPL window.
+
+ If no text is passed, the selection is used.
+ } \
+ kitty-send-text %{
+ nop %sh{
+ if [ $# -eq 0 ]; then
+ text="$kak_selection"
+ else
+ text="$1"
+ fi
+ kitty @ send-text --match=title:kak_repl_window "$text"
+ }
+}
+
+alias global repl-new kitty-repl
+alias global repl-send-text kitty-send-text
+
+}
diff --git a/autoload/windowing/repl/tmux.kak b/autoload/windowing/repl/tmux.kak
new file mode 100644
index 0000000..5b77633
--- /dev/null
+++ b/autoload/windowing/repl/tmux.kak
@@ -0,0 +1,91 @@
+# http://tmux.github.io/
+# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
+# Tmux version >= 2 is required to use this module
+
+hook global ModuleLoaded tmux %{
+ require-module tmux-repl
+}
+
+provide-module tmux-repl %{
+
+declare-option -docstring "tmux pane id in which the REPL is running" str tmux_repl_id
+
+define-command -hidden -params 1.. tmux-repl-impl %{
+ evaluate-commands %sh{
+ 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
+ repl_pane_id=$(tmux $tmux_args -P -F '#{pane_id}' "$@")
+ printf "set-option current tmux_repl_id '%s'" "$repl_pane_id"
+ }
+}
+
+define-command tmux-repl-vertical -params 0.. -docstring "Create a new vertical pane for repl interaction" %{
+ tmux-repl-impl 'split-window -v' %arg{@}
+}
+complete-command tmux-repl-vertical shell
+
+define-command tmux-repl-horizontal -params 0.. -docstring "Create a new horizontal pane for repl interaction" %{
+ tmux-repl-impl 'split-window -h' %arg{@}
+}
+complete-command tmux-repl-horizontal shell
+
+define-command tmux-repl-window -params 0.. -docstring "Create a new window for repl interaction" %{
+ tmux-repl-impl 'new-window' %arg{@}
+}
+complete-command tmux-repl-window shell
+
+define-command -params 0..1 tmux-repl-set-pane -docstring %{
+ tmux-repl-set-pane [pane number]: Set an existing tmux pane for repl interaction
+ If the address of new pane is not given, next pane is used
+ (To get the pane number in tmux,
+ use 'tmux display-message -p '#{pane_id}'" in that pane)
+ } %{
+ evaluate-commands %sh{
+ if [ -z "$TMUX" ]; then
+ echo 'fail This command is only available in a tmux session'
+ exit
+ fi
+ if [ $# -eq 0 ]; then
+ curr_pane_no="${kak_client_env_TMUX_PANE#%}"
+ tgt_pane=$((curr_pane_no+1))
+ else
+ tgt_pane="$1"
+ fi
+ curr_win="$(tmux display-message -t ${kak_client_env_TMUX_PANE} -p '#{window_id}')"
+ if tmux list-panes -t "$curr_win" -F \#D | grep -Fxq "%"$tgt_pane; then
+ printf "set-option current tmux_repl_id '%s'" %$tgt_pane
+ else
+ echo 'fail The correct pane is not there. Activate using tmux-terminal-* or some other way'
+ fi
+ }
+}
+
+define-command -hidden tmux-send-text -params 0..1 -docstring %{
+ tmux-send-text [text]: Send text to the REPL pane.
+ If no text is passed, then the selection is used
+ } %{
+ evaluate-commands %sh{
+ if [ $# -eq 0 ]; then
+ tmux set-buffer -b kak_selection -- "${kak_selection}"
+ else
+ tmux set-buffer -b kak_selection -- "$1"
+ fi
+ tmux paste-buffer -b kak_selection -t "$kak_opt_tmux_repl_id" ||
+ echo 'fail tmux-send-text: failed to send text, see *debug* buffer for details'
+ }
+}
+
+alias global repl-new tmux-repl-horizontal
+alias global repl-send-text tmux-send-text
+
+}
diff --git a/autoload/windowing/repl/x11.kak b/autoload/windowing/repl/x11.kak
new file mode 100644
index 0000000..8f048a7
--- /dev/null
+++ b/autoload/windowing/repl/x11.kak
@@ -0,0 +1,41 @@
+hook global ModuleLoaded x11 %{
+ require-module x11-repl
+}
+
+provide-module x11-repl %{
+
+declare-option -docstring "window id of the REPL window" str x11_repl_id
+
+define-command -docstring %{
+ x11-repl [<arguments>]: create a new window for repl interaction
+ All optional parameters are forwarded to the new window
+} \
+ -params .. \
+ x11-repl %{ x11-terminal-window sh -c %{
+ winid="${WINDOWID:-$(xdotool search --pid ${PPID} | tail -1)}"
+ printf "evaluate-commands -try-client $1 \
+ 'set-option current x11_repl_id ${winid}'" | kak -p "$2"
+ shift 2;
+ [ "$1" ] && "$@" || "$SHELL"
+ } -- %val{client} %val{session} %arg{@}
+}
+complete-command x11-repl shell
+
+define-command x11-send-text -params 0..1 -docstring %{
+ x11-send-text [text]: Send text to the REPL window.
+ If no text is passed, then the selection is used
+ } %{
+ evaluate-commands %sh{
+ ([ "$#" -gt 0 ] && printf "%s" "$1" || printf "%s" "${kak_selection}" ) | xsel -i ||
+ echo 'fail x11-send-text: failed to run xsel, see *debug* buffer for details' &&
+ kak_winid=$(xdotool getactivewindow) &&
+ xdotool windowactivate "${kak_opt_x11_repl_id}" key --clearmodifiers Shift+Insert &&
+ xdotool windowactivate "${kak_winid}" ||
+ echo 'fail x11-send-text: failed to run xdotool, see *debug* buffer for details'
+ }
+}
+
+alias global repl-new x11-repl
+alias global repl-send-text x11-send-text
+
+}