summaryrefslogtreecommitdiff
path: root/autoload/windowing/repl/tmux.kak
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/windowing/repl/tmux.kak')
-rw-r--r--autoload/windowing/repl/tmux.kak91
1 files changed, 91 insertions, 0 deletions
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
+
+}