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/repl |
Diffstat (limited to 'autoload/windowing/repl')
-rw-r--r-- | autoload/windowing/repl/dtach.kak | 38 | ||||
-rw-r--r-- | autoload/windowing/repl/kitty.kak | 56 | ||||
-rw-r--r-- | autoload/windowing/repl/tmux.kak | 91 | ||||
-rw-r--r-- | autoload/windowing/repl/x11.kak | 41 |
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 + +} |