浏览代码

fix(dotenv): draw confirmation prompt in next empty line

Without this fix the confirmation prompt appears wherever the cursor is,
which means that it might appear in the command line when using a widget
that changes the directory without redrawing the prompt (an example of
this are the dircycle and dirhistory plugins).
Marc Cornellà 2 年之前
父节点
当前提交
c44b99e901
共有 1 个文件被更改,包括 41 次插入31 次删除
  1. 41 31
      plugins/dotenv/dotenv.plugin.zsh

+ 41 - 31
plugins/dotenv/dotenv.plugin.zsh

@@ -11,41 +11,51 @@
 ## Functions
 
 source_env() {
-  if [[ -f $ZSH_DOTENV_FILE ]]; then
-    if [[ "$ZSH_DOTENV_PROMPT" != false ]]; then
-      local confirmation dirpath="${PWD:A}"
-
-      # make sure there is an (dis-)allowed file
-      touch "$ZSH_DOTENV_ALLOWED_LIST"
-      touch "$ZSH_DOTENV_DISALLOWED_LIST"
-
-      # early return if disallowed
-      if grep -q "$dirpath" "$ZSH_DOTENV_DISALLOWED_LIST" &>/dev/null; then
-        return;
-      fi
-
-      # check if current directory's .env file is allowed or ask for confirmation
-      if ! grep -q "$dirpath" "$ZSH_DOTENV_ALLOWED_LIST" &>/dev/null; then
-        # print same-line prompt and output newline character if necessary
-        echo -n "dotenv: found '$ZSH_DOTENV_FILE' file. Source it? ([Y]es/[n]o/[a]lways/n[e]ver) "
-        read -k 1 confirmation; [[ "$confirmation" != $'\n' ]] && echo
-
-        # check input
-        case "$confirmation" in
-          [nN]) return ;;
-          [aA]) echo "$dirpath" >> "$ZSH_DOTENV_ALLOWED_LIST" ;;
-          [eE]) echo "$dirpath" >> "$ZSH_DOTENV_DISALLOWED_LIST"; return ;;
-          *) ;; # interpret anything else as a yes
-        esac
-      fi
+  if [[ ! -f "$ZSH_DOTENV_FILE" ]]; then
+    return
+  fi
+
+  if [[ "$ZSH_DOTENV_PROMPT" != false ]]; then
+    local confirmation dirpath="${PWD:A}"
+
+    # make sure there is an (dis-)allowed file
+    touch "$ZSH_DOTENV_ALLOWED_LIST"
+    touch "$ZSH_DOTENV_DISALLOWED_LIST"
+
+    # early return if disallowed
+    if command grep -q "$dirpath" "$ZSH_DOTENV_DISALLOWED_LIST" &>/dev/null; then
+      return
     fi
 
-    # test .env syntax
-    zsh -fn $ZSH_DOTENV_FILE || echo "dotenv: error when sourcing '$ZSH_DOTENV_FILE' file" >&2
+    # check if current directory's .env file is allowed or ask for confirmation
+    if ! command grep -q "$dirpath" "$ZSH_DOTENV_ALLOWED_LIST" &>/dev/null; then
+      # get cursor column and print new line before prompt if not at line beginning
+      local column
+      echo -ne "\e[6n" > /dev/tty
+      read -t 1 -s -d R column < /dev/tty
+      column="${column##*\[*;}"
+      [[ $column -eq 1 ]] || echo
 
-    setopt localoptions allexport
-    source $ZSH_DOTENV_FILE
+      # print same-line prompt and output newline character if necessary
+      echo -n "dotenv: found '$ZSH_DOTENV_FILE' file. Source it? ([Y]es/[n]o/[a]lways/n[e]ver) "
+      read -k 1 confirmation
+      [[ "$confirmation" = $'\n' ]] || echo
+
+      # check input
+      case "$confirmation" in
+        [nN]) return ;;
+        [aA]) echo "$dirpath" >> "$ZSH_DOTENV_ALLOWED_LIST" ;;
+        [eE]) echo "$dirpath" >> "$ZSH_DOTENV_DISALLOWED_LIST"; return ;;
+        *) ;; # interpret anything else as a yes
+      esac
+    fi
   fi
+
+  # test .env syntax
+  zsh -fn $ZSH_DOTENV_FILE || echo "dotenv: error when sourcing '$ZSH_DOTENV_FILE' file" >&2
+
+  setopt localoptions allexport
+  source $ZSH_DOTENV_FILE
 }
 
 autoload -U add-zsh-hook