aboutsummaryrefslogtreecommitdiff
path: root/files/.config/nnn/plugins/cdpath
blob: fbc0fb4d512a5694c1e56a336557661a9599a00b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env sh

# Description: 'cd' to the directory from CDPATH
#
# Details: If the CDPATH environment 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.
#          If you set your CDPATH to ${XDG_CACHE_HOME:-$HOME/.cache}/nnn/bookmarks
#          or to the value of BOOKMARKS_DIR, you can use it as a bookmarks replacement.
#
# Shell: POSIX compliant
# Author: Yuri Kloubakov

# shellcheck disable=SC1090,SC1091
. "$(dirname "$0")"/.nnn-plugin-helper

# Get a list of (symbolic links to) directories for every element of CDPATH
get_dirs() {
    IFS=':'
    for path in $CDPATH; do
        for entry in "$path"/*; do
            if [ -d "$entry" ]; then
                name=$(basename "$entry" | grep -o '^.\{1,24\}')
                if [ -h "$entry" ]; then
                    slink=$(ls -dl -- "$entry")
                    entry=${slink#*" $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