Browse Source

fix(magic-enter): fix various bugs in the plugin (#9466)

Marc Cornellà 3 years ago
parent
commit
d88887195f
1 changed files with 32 additions and 21 deletions
  1. 32 21
      plugins/magic-enter/magic-enter.plugin.zsh

+ 32 - 21
plugins/magic-enter/magic-enter.plugin.zsh

@@ -1,27 +1,38 @@
-# Bind quick stuff to enter!
-#
-# Pressing enter in a git directory runs `git status`
-# in other directories `ls`
-magic-enter () {
-  # If commands are not already set, use the defaults
-  [ -z "$MAGIC_ENTER_GIT_COMMAND" ] && MAGIC_ENTER_GIT_COMMAND="git status -u ."
-  [ -z "$MAGIC_ENTER_OTHER_COMMAND" ] && MAGIC_ENTER_OTHER_COMMAND="ls -lh ."
+# Default commands
+: ${MAGIC_ENTER_GIT_COMMAND:="git status -u ."} # run when in a git repository
+: ${MAGIC_ENTER_OTHER_COMMAND:="ls -lh ."}      # run anywhere else
 
-  if [[ -z $BUFFER ]]; then
-    echo ""
-    if git rev-parse --is-inside-work-tree &>/dev/null; then
-      eval "$MAGIC_ENTER_GIT_COMMAND"
-    else
-      eval "$MAGIC_ENTER_OTHER_COMMAND"
-    fi
-    zle redisplay
+magic-enter() {
+  # Only run MAGIC_ENTER commands when in PS1 and command line is empty
+  # http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#User_002dDefined-Widgets
+  if [[ -n "$BUFFER" || "$CONTEXT" != start ]]; then
+    return
+  fi
+
+  if command git rev-parse --is-inside-work-tree &>/dev/null; then
+    BUFFER="$MAGIC_ENTER_GIT_COMMAND"
   else
-    zle accept-line
+    BUFFER="$MAGIC_ENTER_OTHER_COMMAND"
   fi
 }
 
-zle -N magic-enter
+# Wrapper for the accept-line zle widget (run when pressing Enter)
+
+# If the wrapper already exists don't redefine it
+(( ! ${+functions[_magic-enter_accept-line]} )) || return 0
+
+case "$widgets[accept-line]" in
+  # Override the current accept-line widget, calling the old one
+  user:*) zle -N _magic-enter_orig_accept-line "${widgets[accept-line]#user:}"
+    function _magic-enter_accept-line() {
+      magic-enter
+      zle _magic-enter_orig_accept-line -- "$@"
+    } ;;
+  # If no user widget defined, call the original accept-line widget
+  builtin) function _magic-enter_accept-line() {
+      magic-enter
+      zle .accept-line
+    } ;;
+esac
 
-bindkey -M emacs "^M" magic-enter
-bindkey -M vicmd "^M" magic-enter
-bindkey -M viins "^M" magic-enter
+zle -N accept-line _magic-enter_accept-line