Skip to content

Instantly share code, notes, and snippets.

@DanielFGray
Created May 28, 2015 03:49
Show Gist options
  • Save DanielFGray/1b4e37054880163d1c4d to your computer and use it in GitHub Desktop.
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
#!/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