From 42aa97b112deaf41cad0c8964535040d9809f5ce Mon Sep 17 00:00:00 2001 From: exoton <62148+exoton@users.noreply.github.com> Date: Sun, 28 Mar 2021 22:39:42 -0400 Subject: [PATCH] Add new plugin (#928) * 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 | 1 + plugins/cdpath | 53 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100755 plugins/cdpath diff --git a/plugins/README.md b/plugins/README.md index 79eb8e9b..0a5c9710 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -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,
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 index 00000000..98dad482 --- /dev/null +++ b/plugins/cdpath @@ -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