c57805a926
Before, sed would add quotes to every line of the single multiline argument, causing the final quoted argument to "split ... command" or screen to contain unquoted newlines such as this (from kakoune-cr): tell application "iTerm" tell current session of current window tell (split vertically with same profile command "env PATH='...' 'sh' '-c' '' ' export KAKOUNE_SESSION=$1' ' export KAKOUNE_CLIENT=$2' ' shift 3' '' ' [ $# = 0 ] && set \"$SHELL\"' '' ' \"sh\"' ' ' '--' '51909' 'client0' 'terminal' ") to select end tell end tell Instead of using sed to do this which operates on single lines at a time, simply use printf to insert ' quotes before and after the entire argument.
77 lines
2.5 KiB
Plaintext
77 lines
2.5 KiB
Plaintext
# http://gnu.org/software/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.. %{
|
|
nop %sh{
|
|
tty="$(ps -o tty ${kak_client_pid} | tail -n 1)"
|
|
screen -X eval "$1" "$2"
|
|
shift 2
|
|
# see x11.kak for what this achieves
|
|
args=$(
|
|
for i in "$@"; do
|
|
printf "'%s' " "$(printf %s "$i" | sed "s|'|'\\\\''|g")"
|
|
done
|
|
)
|
|
screen -X screen sh -c "${args} ; screen -X remove" < "/dev/$tty"
|
|
}
|
|
}
|
|
|
|
define-command screen-terminal-vertical -params 1.. -docstring '
|
|
screen-terminal-vertical <program> [<arguments>] [<arguments>]: create a new terminal as a screen pane
|
|
The current pane is split into two, left and right
|
|
The program passed as argument will be executed in the new terminal' \
|
|
%{
|
|
screen-terminal-impl 'split -v' 'focus right' %arg{@}
|
|
}
|
|
complete-command screen-terminal-vertical shell
|
|
|
|
define-command screen-terminal-horizontal -params 1.. -docstring '
|
|
screen-terminal-horizontal <program> [<arguments>]: create a new terminal as a screen pane
|
|
The current pane is split into two, top and bottom
|
|
The program passed as argument will be executed in the new terminal' \
|
|
%{
|
|
screen-terminal-impl 'split -h' 'focus down' %arg{@}
|
|
}
|
|
complete-command screen-terminal-horizontal shell
|
|
|
|
define-command screen-terminal-window -params 1.. -docstring '
|
|
screen-terminal-window <program> [<arguments>]: create a new terminal as a screen window
|
|
The program passed as argument will be executed in the new terminal' \
|
|
%{
|
|
nop %sh{
|
|
tty="$(ps -o tty ${kak_client_pid} | tail -n 1)"
|
|
screen -X screen "$@" < "/dev/$tty"
|
|
}
|
|
}
|
|
complete-command screen-terminal-window shell
|
|
|
|
define-command screen-focus -params ..1 -docstring '
|
|
screen-focus [<client>]: focus the given client
|
|
If no client is passed then the current one is used' \
|
|
%{
|
|
evaluate-commands %sh{
|
|
if [ $# -eq 1 ]; then
|
|
printf %s\\n "
|
|
evaluate-commands -client '$1' focus
|
|
"
|
|
elif [ -n "${kak_client_env_STY}" ]; then
|
|
tty="$(ps -o tty ${kak_client_pid} | tail -n 1)"
|
|
screen -X select "${kak_client_env_WINDOW}" < "/dev/$tty"
|
|
fi
|
|
}
|
|
}
|
|
complete-command -menu screen-focus client
|
|
|
|
alias global focus screen-focus
|
|
alias global terminal screen-terminal-vertical
|
|
|
|
}
|