]> Sergey Matveev's repositories - nnn.git/commitdiff
Rename plugin fzdirs to fzcd, retains fzcd features
authorArun Prakash Jana <engineerarun@gmail.com>
Fri, 28 May 2021 19:03:50 +0000 (00:33 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Fri, 28 May 2021 19:42:12 +0000 (01:12 +0530)
plugins/README.md
plugins/fzcd
plugins/fzdirs [deleted file]

index 4cd176bcf69813854dd8da8a577f152826a1ac4a..c3c501178804cfb77aac723c5298584d68339557 100644 (file)
@@ -25,8 +25,7 @@ Plugins extend the capabilities of `nnn`. They are _executable_ scripts (or bina
 | [dups](dups) | List non-empty duplicate files in current dir | bash | find, md5sum,<br>sort uniq xargs |
 | [finder](finder) | Run custom find command and list | sh | - |
 | [fixname](fixname) | Clean filename to be more shell-friendly [✓] | bash | sed |
-| [fzcd](fzcd) | Change to the directory of a fuzzy-selected file/dir | sh | fzf |
-| [fzdirs](fzdirs) | Fuzzy search multiple directories [✓] | sh | fzf, fd |
+| [fzcd](fzcd) | Fuzzy search multiple dirs (or `$PWD`) and visit file [✓] | sh | fzf |
 | [fzhist](fzhist) | Fuzzy-select a cmd from history, edit in `$EDITOR` and run | sh | fzf, mktemp |
 | [fzopen](fzopen) | Fuzzy find file(s) in subtree to edit/open/pick | sh | fzf, xdg-open |
 | [fzplug](fzplug) | Fuzzy find, preview and run other plugins | sh | fzf |
index 537e50e867fd77138a91eec8ea30a1a204c618ee..077456ab4c0117d1284d1cadba07284b4c8eaf26 100755 (executable)
@@ -1,18 +1,76 @@
 #!/usr/bin/env sh
 
-# Description: Run fzf and go to the directory of the file selected
+# Description: Fuzzy search multiple locations read-in from a path-list file
+#              (or $PWD) and open the selected file's dir in a smart context.
+# Dependencies: fzf, fd (only for multi-location search)
+#
+# Details: Paths in list file should be newline-separated absolute paths.
+#          Paths can be file paths; the script will scan the parent dirs.
+#
+#          The path-list file precedence is:
+#          - "$1" (the hovered file) if it exists, is plain-text and the
+#                 first line points to an existing file
+#          - "$LIST" if set below
+#          - "$2" (the current directory) [mimics plugin fzcd behaviour]
+#
+#          The path-list file can be generated easily:
+#          - pick the (file)paths in picker mode to path-list file
+#          - OR, edit selection in nnn and save as path-list file
+#
+#          The plugin clears nnn selection as the user can be tempted to delete
+#          duplicate files after finding copies and remove selection by mistake.
 #
 # Shell: POSIX compliant
-# Author: Anna Arad
+# Author: Anna Arad, Arun Prakash Jana
+
+IFS="$(printf '\n\r')"
 
 . "$(dirname "$0")"/.nnn-plugin-helper
 
-if [ "$(cmd_exists fzf)" -eq "0" ]; then
-       sel=$(fzf)
+CTX=+
+LIST="$LIST"
+
+if ! type fzf >/dev/null 2>&1; then
+    printf "fzf missing"
+    read -r _
+       exit 1
+fi
+
+if [ -n "$1" ] && [ "$(file -b --mime-type "$1")" = 'text/plain' ] && [ -e "$(head -1 "$1")" ]; then
+    LIST="$1"
+elif ! [ -s "$LIST" ]; then
+    sel=$(fzf)
     # Show only the file and parent dir
     # sel=$(fzf --delimiter / --with-nth=-2,-1 --tiebreak=begin --info=hidden)
-else
-       exit 1
+
+    LIST=''
+fi
+
+if [ -n "$LIST" ]; then
+    if type fd >/dev/null 2>&1; then
+        tmpfile=$(mktemp /tmp/abc-script.XXXXXX)
+
+        while IFS= read -r path; do
+            if [ -d "$path" ]; then
+                printf "%s\n" "$path" >> "$tmpfile"
+            elif [ -f "$path" ]; then
+                printf "%s\n" "$(dirname "$path")" >> "$tmpfile"
+            fi
+        done < "$LIST"
+
+        # Clear selection
+        if [ -p "$NNN_PIPE" ]; then
+            printf "-" >"$NNN_PIPE"
+        fi
+
+        sel=$(xargs -d '\n' -a "$tmpfile" fd -H . | fzf --delimiter / --tiebreak=begin --info=hidden)
+
+        rm "$tmpfile"
+    else
+        printf "fd missing"
+        read -r _
+           exit 1
+    fi
 fi
 
 if [ -n "$sel" ]; then
@@ -20,18 +78,17 @@ if [ -n "$sel" ]; then
         exit 0
     fi
 
-    # Check if selected path returned
-    # by fzf command is absolute
+    # Check if the selected path returned by fzf command is absolute
     case $sel in
-    /*) nnn_cd "$sel" ;;
+    /*) nnn_cd "$sel" "$CTX" ;;
     *)
         # Remove "./" prefix if it exists
         sel="${sel#./}"
 
         if [ "$PWD" = "/" ]; then
-            nnn_cd "/$sel"
+            nnn_cd "/$sel" "$CTX"
         else
-            nnn_cd "$PWD/$sel"
+            nnn_cd "$PWD/$sel" "$CTX"
         fi;;
     esac
 fi
diff --git a/plugins/fzdirs b/plugins/fzdirs
deleted file mode 100755 (executable)
index 1acecf0..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env sh
-
-# Description: Fuzzy search multiple locations read-in from a path-list
-#              file and open the selected file's directory in a smart context.
-# Dependencies: fzf, fd
-#
-# Details: Paths in list file should be newline-separated absolute paths.
-#          Paths can be file paths; the script will scan the parent dirs.
-#
-#          The path-list file precedence is:
-#          - "$1" (the hovered file) if it exists, is plain-text and the
-#                 first line points to an existing file
-#          - "$LIST" if set below
-#          - "$2" (the current directory) [mimics plugin fzcd behaviour]
-#
-#          The path-list file can be generated easily:
-#          - pick the (file)paths in picker mode to path-list file
-#          - OR, edit selection in nnn and save as path-list file
-#
-#          The plugin clears nnn selection as the user can be tempted to delete
-#          duplicate files after finding copies and remove selection by mistake.
-#
-# Shell: POSIX compliant
-# Author: Arun Prakash Jana
-
-IFS="$(printf '\n\r')"
-
-. "$(dirname "$0")"/.nnn-plugin-helper
-
-CTX=+
-LIST="$LIST"
-
-if [ -n "$1" ] && [ "$(file -b --mime-type "$1")" = 'text/plain' ] && [ -e "$(head -1 "$1")" ]; then
-    LIST="$1"
-elif ! [ -s "$LIST" ]; then
-    LIST="$2"
-fi
-
-if [ "$(cmd_exists fzf)" -eq "0" ]; then
-    tmpfile=$(mktemp /tmp/abc-script.XXXXXX)
-
-    while IFS= read -r path; do
-        if [ -d "$path" ]; then
-            printf "%s\n" "$path" >> "$tmpfile"
-        elif [ -f "$path" ]; then
-            printf "%s\n" "$(dirname "$path")" >> "$tmpfile"
-        fi
-    done < "$LIST"
-
-    # Clear selection
-    if [ -p "$NNN_PIPE" ]; then
-        printf "-" >"$NNN_PIPE"
-    fi
-
-    sel=$(xargs -d '\n' -a "$tmpfile" fd -H . | fzf --delimiter / --tiebreak=begin --info=hidden)
-
-    rm "$tmpfile"
-else
-       exit 1
-fi
-
-if [ -n "$sel" ]; then
-    if [ "$sel" = "." ] || { ! [ -d "$sel" ] && ! [ -f "$sel" ]; }; then
-        exit 0
-    fi
-
-    # Check if the selected path returned by fzf command is absolute
-    case $sel in
-    /*) nnn_cd "$sel" "$CTX" ;;
-    *)
-        # Remove "./" prefix if it exists
-        sel="${sel#./}"
-
-        if [ "$PWD" = "/" ]; then
-            nnn_cd "/$sel" "$CTX"
-        else
-            nnn_cd "$PWD/$sel" "$CTX"
-        fi;;
-    esac
-fi