Browse Source

refactor(vim-interaction): clean up code and open gvim instance if none open (#10209)

Co-authored-by: Kevin Bader <keb@visotech.at>
Marc Cornellà 2 years ago
parent
commit
d87f29f564
1 changed files with 27 additions and 21 deletions
  1. 27 21
      plugins/vim-interaction/vim-interaction.plugin.zsh

+ 27 - 21
plugins/vim-interaction/vim-interaction.plugin.zsh

@@ -4,8 +4,7 @@
 # Derek Wyatt (derek@{myfirstnamemylastname}.org
 # 
 
-function callvim
-{
+function callvim {
   if [[ $# == 0 ]]; then
     cat <<EOH
 usage: callvim [-b cmd] [-a cmd] [-n name] [file ... fileN]
@@ -19,11 +18,20 @@ EOH
     return 0
   fi
 
-  local cmd=""
-  local before="<esc>"
-  local after=""
-  # Look up the newest instance
+  # Look up the newest instance or start one
   local name="$(gvim --serverlist | tail -n 1)"
+  [[ -n "$name" ]] || {
+    # run gvim or exit if it fails
+    gvim || return $?
+
+    # wait for gvim instance to fully load
+    while name=$(gvim --serverlist) && [[ -z "$name" ]]; do
+      sleep 0.1
+    done
+  }
+
+  local before="<esc>" files after cmd
+
   while getopts ":b:a:n:" option
   do
     case $option in
@@ -36,22 +44,20 @@ EOH
     esac
   done
   shift $((OPTIND-1))
-  if [[ ${after#:} != $after && ${after%<cr>} == $after ]]; then
-    after="$after<cr>"
-  fi
-  if [[ ${before#:} != $before && ${before%<cr>} == $before ]]; then
-    before="$before<cr>"
-  fi
-  local files
-  if [[ $# -gt 0 ]]; then
-    # absolute path of files resolving symlinks (:A) and quoting special chars (:q)
-    files=':args! '"${@:A:q}<cr>"
-  fi
+
+  # If before or after commands begin with : and don't end with <cr>, append it
+  [[ ${after}  = :* && ${after}  != *\<cr\> ]] && after+="<cr>"
+  [[ ${before} = :* && ${before} != *\<cr\> ]] && before+="<cr>"
+  # Open files passed (:A means abs path resolving symlinks, :q means quoting special chars)
+  [[ $# -gt 0 ]] && files=':args! '"${@:A:q}<cr>"
+  # Pass the built vim command to gvim
   cmd="$before$files$after"
-  gvim --servername "$name" --remote-send "$cmd"
-  if typeset -f postCallVim > /dev/null; then
-    postCallVim
-  fi
+
+  # Run the gvim command
+  gvim --servername "$name" --remote-send "$cmd" || return $?
+
+  # Run postCallVim if defined (maybe to bring focus to gvim, see README)
+  (( ! $+functions[postCallVim] )) || postCallVim
 }
 
 alias v=callvim