#!/usr/bin/env sh # Description: Use named bookmarks using symlinks # # Dependencies: fzf # # Usage: # 1. Create a $BOOKMARKS_DIR directory # By default, $BOOKMARKS_DIR is set to: ${XDG_CACHE_HOME:-$HOME/.cache}/nnn/bookmarks # 2. Create symlinks to directories # `cd $BOOKMARKS_DIR` # `ln -s /path/to/useful/directory bookmark_name` # `ln -s $XDG_CONFIG_HOME/nnn/plugins nnn_plugins" # `ln -s /path/to/documents docs` # `ln -s /path/to/media media` # `ln -s /path/to/movies movies` # # Bonus tip: Add `$BOOKMARKS_DIR` to your `$CDPATH` # https://linux.101hacks.com/cd-command/cdpath/ # # TODO: # - Remove `fzf` dependency # # Shell: POSIX compliant # Author: Todd Yamakawa if [ -z "$BOOKMARKS_DIR" ]; then BOOKMARKS_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/nnn/bookmarks" fi # Check if NNN_PIPE is set if [ -z "$NNN_PIPE" ]; then printf 'ERROR: NNN_PIPE is not set!' read -r _ exit 2 fi # Get all directory symlinks get_links() { for entry in "$1"/*; do # Skip unless directory symlink [ -h "$entry" ] || continue [ -d "$entry" ] || continue printf "%20s -> %s\n" "$(basename "$entry")" "$(readlink -f "$entry")" done | fzf | awk 'END { if (length($1) == 0) { print "'"$PWD"'" } else { print "'"$BOOKMARKS_DIR"'/"$1 } }' } # Choose symlink with fzf cddir="$(get_links "$BOOKMARKS_DIR")" # Writing result to NNN_PIPE will change nnn's active directory # https://github.com/jarun/nnn/tree/master/plugins#send-data-to-nnn context=0 printf "%s" "${context}c$(readlink -f "$cddir")" > "$NNN_PIPE"