-
-
Save DanielFGray/1b4e37054880163d1c4d to your computer and use it in GitHub Desktop.
create a new vim server or interact with an existing one - http://a.pomf.se/sefqyu.webm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
usage() { | |
cat <<'HELP' | |
v [OPTIONS] [FILES] | |
create a new vim server or interact with an existing one | |
-h show this help | |
-d disable focusing on vim | |
-s associate tmux pane in vim | |
+ 'str' return expr | |
: 'str' send command | |
! 'str' send raw keys | |
HELP | |
} | |
err() { | |
if [[ -t 0 ]]; then | |
echo >&2 "$*" | |
else | |
zenity --error --text="$*" 2> /dev/null | |
fi | |
} | |
declare select=true | |
declare sendpane=false | |
while true; do | |
case "$1" in | |
'-h'|'--help') usage; exit 0 ;; | |
'-d') select=false; ;; | |
'-s') sendpane=true ;; | |
-*) flags+=("$1") ;; | |
*) break ;; | |
esac | |
shift | |
done | |
serv=$(vim --serverlist | grep -P '^VIM_[0-9]+$') | |
if [[ -n "$serv" ]]; then | |
{ | |
if [[ -n "$TMUX" && "$select" == true ]]; then | |
pane=$(vim --servername "$serv" --remote-expr '$TMUX_PANE') | |
if [[ -n "$pane" ]]; then | |
#TODO: xdotool windowfocus $(vim --servername "$serv" --remote-expr '$WINDOWID') | |
tmux select-pane -t "$pane" | |
tmux select-window -t "$pane" | |
fi | |
fi | |
} & | |
while true; do | |
case "$1" in | |
':') | |
if [[ -z "$2" ]]; then | |
err 'missing string for :' | |
shift; break | |
else | |
vim "${flags[@]}" --servername "$serv" --remote-send "<esc>:$2<cr>" | |
shift 2 | |
fi | |
;; | |
'!') | |
if [[ -z "$2" ]]; then | |
err 'missing string for !' | |
shift; break | |
else | |
vim "${flags[@]}" --servername "$serv" --remote-send "$2" | |
shift 2 | |
fi | |
;; | |
'+') | |
if [[ -z "$2" ]]; then | |
err 'missing string for +' | |
shift; break | |
else | |
vim "${flags[@]}" --servername "$serv" --remote-expr "$2" | |
shift 2 | |
fi | |
;; | |
* ) break ;; | |
esac | |
done | |
if (( $# > 0 )); then | |
vim "${flags[@]}" --servername "$serv" --remote-silent "$@" | |
fi | |
elif [[ -t 0 ]]; then | |
if [[ "$select" == true && -n "$TMUX" ]]; then | |
tmux rename-window -t "$TMUX_PANE" 'vim' | |
tmux=$(tmux list-sessions -F '#S' | grep 'cmd') | |
if [[ -z "$tmux" ]]; then | |
#TODO; user defineable alt conf file | |
if [[ ! -e "$HOME/alt.tmux.conf" ]]; then | |
echo 'creating alternate tmux conf' | |
tee "$HOME/alt.tmux.conf" <<-'HEREDOC' | |
set prefix C-s | |
set status-position top | |
set status-justify centre | |
set status-right '' | |
set status-left '' | |
# vim:ft=tmux: | |
HEREDOC | |
fi | |
tmux split-window -t "$TMUX_PANE" -d -v -p 25 'TMUX="" tmux new-session -s "cmd" \; source-file ~/alt.tmux.conf' | |
fi | |
fi | |
serv="VIM_$(date +%s)" | |
exec vim "${flags[@]}" --servername "$serv" "$@" | |
fi | |
if [[ "$sendpane" == true && -n "$TMUX_PANE" ]]; then | |
#TODO; user defineable tmux plugin | |
vim "${flags[@]}" --servername "$serv" --remote-send "<esc>:TxSetPane $TMUX_PANE<cr>" | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment