diff --git a/base/nbrc b/base/nbrc new file mode 100644 index 0000000..aeff3b0 --- /dev/null +++ b/base/nbrc @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +############################################################################### +# .nbrc +# +# Configuration file for `nb`, a command line note-taking, bookmarking, +# and knowledge base application with encryption, search, Git-backed syncing, +# and more in a single portable script. +# +# Edit this file manually or manage settings using the `nb settings` +# subcommand. Configuration options are set as environment variables, eg: +# export NB_ENCRYPTION_TOOL=gpg +# +# https://github.com/xwmx/nb +############################################################################### + +export NB_DIR="${NB_DIR:-$HOME/.local/state/nb}" # Set by `nb` • Mon May 8 15:25:12 EEST 2023 + +export NB_COLOR_THEME="${NB_COLOR_THEME:-unicorn}" # Set by `nb` • Mon May 8 15:41:22 EEST 2023 diff --git a/base/zshrc b/base/zshrc index 4e8de7a..0ab0d26 100644 --- a/base/zshrc +++ b/base/zshrc @@ -5,6 +5,10 @@ autoload -U colors zsh/terminfo colors setopt correct +# Add completion scripts to zsh path +fpath=(~/.config/zsh/completion $fpath) +autoload -Uz compinit && compinit -i + # Defaults export DOTFILES="$HOME/.dotfiles" # shellcheck source=shared.sh diff --git a/config/exports-apps b/config/exports-apps index e490904..8b6e9bc 100755 --- a/config/exports-apps +++ b/config/exports-apps @@ -72,6 +72,12 @@ have irssi && { x-dc "$IRSSI_CONFIG_HOME" } +# nb, https://xwmx.github.io/nb/ +have nb && { + export NB_DIR="$XDG_STATE_HOME/nb" + x-dc "$NB_DIR" +} + # nvm, the node version manager export NVM_LAZY_LOAD=true export NVM_COMPLETION=true @@ -80,6 +86,12 @@ export NVM_DIR="$XDG_CONFIG_HOME/nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion +# Add npm packages to path +have node && { + NVM_NODE_BIN_DIR="$(dirname "$(which node)")" + path_append "$NVM_NODE_BIN_DIR" +} + # op (1Password cli) is present have op && { export OP_CACHE="$XDG_STATE_HOME/1password" diff --git a/config/zsh/completion/_nb b/config/zsh/completion/_nb new file mode 100644 index 0000000..fccb32e --- /dev/null +++ b/config/zsh/completion/_nb @@ -0,0 +1,174 @@ +#compdef nb +############################################################################### +# __ _ +# \ \ _ __ | |__ +# \ \ | '_ \| '_ \ +# / / | | | | |_) | +# /_/ |_| |_|_.__/ +# +# [nb] Command line and local web note-taking, bookmarking, and archiving with +# plain text data storage, encryption, filtering and search, pinning, #tagging, +# Git-backed versioning and syncing, Pandoc-backed conversion, global and local +# notebooks, customizable color themes, [[wiki-style linking]], plugins, and +# more in a single portable, user-friendly script. +# +# https://github.com/xwmx/nb +############################################################################### +_nb_subcommands() { + # _nb_cache_completions() + # + # Usage: + # _nb_cache_completions + # + # Description: + # Cache completions for `nb`. Generating completions can be slow and + # native shell caching doesn't appear to help. + _nb_cache_completions() { + local _cache_path="${1:-}" + + [[ -z "${_cache_path:-}" ]] && return 0 + + # Remove outdated cache files. + + local _base_cache_path="${_cache_path%-*}" + + local __suffix= + for __suffix in "zsh" "v1" + do + if [[ -e "${_base_cache_path:?}-${__suffix:?}" ]] + then + rm -f "${_base_cache_path:?}-${__suffix:?}" + fi + done + + # Rebuild completion cache. + + local _commands= + IFS=$'\n' _commands=($(nb subcommands)) + + local _notebooks= + IFS=$'\n' _notebooks=($(nb notebooks --names --no-color --unarchived)) + + local _completions=() + IFS=$'\n' _completions=(${_commands[@]}) + + local _commands_cached= + local _notebooks_cached= + + if [[ -e "${_cache_path}" ]] + then + local _counter=0 + + local __line= + while IFS= read -r __line + do + _counter=$((_counter+1)) + + if [[ "${_counter}" == 1 ]] + then + _commands_cached="${__line}" + elif [[ "${_counter}" == 2 ]] + then + _notebooks_cached="${__line}" + else + break + fi + done < "${_cache_path}" + fi + + if [[ "${_commands_cached}" != "${_commands[*]:-}" ]] || + [[ "${_notebooks_cached}" != "${_notebooks[*]:-}" ]] + then + # Construct : completions. + local __notebook= + for __notebook in "${_notebooks[@]}" + do + local __command= + for __command in "${_commands[@]}" + do + if [[ -n "${__notebook:-}" ]] && + [[ -n "${__command:-}" ]] + then + _completions+=("${__notebook}:${__command}") + fi + done + done + + local _directory_path= + _directory_path="$(dirname "${_cache_path}")" + + mkdir -p "${_directory_path}" + + if [[ -f "${_cache_path:?}" ]] + then + rm -f "${_cache_path:?}" + fi + + touch "${_cache_path:?}" + + { + (IFS=$' '; printf "%s\\n" "${_commands[*]}") + (IFS=$' '; printf "%s\\n" "${_notebooks[*]}") + printf "%s\\n" "${_completions[@]}" + } >> "${_cache_path}" + fi + } + + local _nb_dir= + _nb_dir="$(nb env | grep 'NB_DIR' | cut -d = -f 2)" + + if [[ -z "${_nb_dir:?}" ]] || + [[ ! -e "${_nb_dir}" ]] + then + return 0 + elif [[ -L "${_nb_dir}" ]] + then + if hash "realpath" 2>/dev/null + then + _nb_dir="$(realpath "${_nb_dir}")" + else + _nb_dir="$(readlink "${_nb_dir}")" + fi + fi + + if [[ ! -d "${_nb_dir}" ]] + then + return 0 + fi + + local _cache_path="${_nb_dir:?}/.cache/nb-completion-cache-v2" + local _completions_cached=() + + if [[ ! -e "${_cache_path}" ]] + then + _nb_cache_completions "${_cache_path}" + fi + + if [[ -e "${_cache_path}" ]] + then + local _counter=0 + + local __line= + while IFS= read -r __line + do + _counter=$((_counter+1)) + + if [[ "${_counter}" -gt 2 ]] + then + _completions_cached+=("${__line}") + fi + done < "${_cache_path}" + + (_nb_cache_completions "${_cache_path}" &) + fi + + if [[ "${?}" -eq 0 ]] + then + compadd -- "${_completions_cached[@]}" + return 0 + else + return 1 + fi +} + +_nb_subcommands "$@" diff --git a/scripts/install-npm-packages.sh b/scripts/install-npm-packages.sh index db4db89..89943b0 100755 --- a/scripts/install-npm-packages.sh +++ b/scripts/install-npm-packages.sh @@ -15,6 +15,10 @@ have npm && { "prettier" "corepack" "standardjs" + # CLI and local web plain text note‑taking, bookmarking, and archiving + # with linking, tagging, filtering, search, Git versioning & syncing, + # Pandoc conversion, + more, in a single portable script. + "nb.sh" ) for pkg in "${packages[@]}"; do