]> Sergey Matveev's repositories - nnn.git/commitdiff
Add new plugin (#928)
authorexoton <62148+exoton@users.noreply.github.com>
Mon, 29 Mar 2021 02:39:42 +0000 (22:39 -0400)
committerGitHub <noreply@github.com>
Mon, 29 Mar 2021 02:39:42 +0000 (08:09 +0530)
* Add new plugin

* Small cdpath refactoring

* Change the default CDPATH value, remove string indexing.

* Remove readlink() call to be POSIX compliant.

* Fix the comment

plugins/README.md
plugins/cdpath [new file with mode: 0755]

index 79eb8e9bd3acb5ee33da55c2753065486a70295d..0a5c971068d0f902df84de771d36da4583c184dc 100644 (file)
@@ -17,6 +17,7 @@ Plugins extend the capabilities of `nnn`. They are _executable_ scripts (or bina
 | [bookmarks](bookmarks) | Use named bookmarks managed with symlinks | sh | fzf |
 | [boom](boom) | Play random music from dir | sh | [moc](http://moc.daper.net/) |
 | [bulknew](bulknew) | Create multiple files/dirs at once | bash | sed, xargs, mktemp |
+| [cdpath](cdpath) | `cd` to the directory from `CDPATH` | sh | fzf |
 | [chksum](chksum) | Create and verify checksums [✓] | sh | md5sum,<br>sha256sum |
 | [cleanfilename](cleanfilename) | Clean filename to be more shell-friendly [✓] | bash | sed |
 | [diffs](diffs) | Diff for selection (limited to 2 for directories) [✓] | sh | vimdiff, mktemp |
diff --git a/plugins/cdpath b/plugins/cdpath
new file mode 100755 (executable)
index 0000000..98dad48
--- /dev/null
@@ -0,0 +1,53 @@
+#!/usr/bin/env sh
+
+# Description: 'cd' to the directory from CDPATH
+#
+# Details: If the CDPATH environmet variable is not set, the default value of
+#          ${XDG_CONFIG_HOME:-$HOME/.config}/nnn/bookmarks will be used.
+#          You can create this directory and fill it with symbolic links to your
+#          favorite directories. It's a good idea to add it to CDPATH so that it
+#          could also be used from the command line outside of nnn.
+#          The fzf search is done on the directory basename (the first column).
+#
+#          This plugin is an extended version of the bookmarks plugin.
+#
+# Shell: POSIX compliant
+# Author: Yuri Kloubakov
+
+. "$(dirname "$0")"/.nnn-plugin-helper
+
+get_dirs() {
+    # Get a list of directories and symbolic links to directories
+    IFS=':'
+    for path in $CDPATH; do
+        for entry in "$path"/*; do
+            if [ -d "$entry" ]; then
+                name="$(basename "$entry")"
+                if [ -h "$entry" ]; then
+                    l="$(ls -dl "$entry")"
+                    entry="${l#*"${entry} -> "}"
+                fi
+                printf "%-24s :%s\n" "${name}" "$entry"
+            fi
+        done
+    done
+}
+
+abort() {
+    echo "$1"
+    read -r _
+    exit 1
+}
+
+if [ -z "$CDPATH" ]; then
+    CDPATH="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/bookmarks"
+    [ -d "$CDPATH" ] || abort "CDPATH is not set and there is no \"$CDPATH\" directory"
+fi
+
+dir_list="$(get_dirs)"
+[ -n "$dir_list" ] || abort "There are no directories to choose from. Check your \"$CDPATH\"."
+
+dir="$(echo "$dir_list" | fzf --nth=1 --delimiter=':' | awk -F: 'END { print $2 }')"
+if [ -n "$dir" ]; then
+    nnn_cd "$dir" 0
+fi