diff options
| author | Lukasz Kasprzak <lukasz.kasprzak@pm.me> | 2026-01-29 01:27:17 +0100 |
|---|---|---|
| committer | Lukasz Kasprzak <lukasz.kasprzak@pm.me> | 2026-01-29 01:27:17 +0100 |
| commit | 70e6d80c2d367480478eacf46363ee88a0e994ff (patch) | |
| tree | 3585660271002a776a8756994c92f8e546f98044 /dmenu-vimwiki-open | |
| parent | 646bb0d8df0e720c966dc2992dcf7fe1154d17cf (diff) | |
| download | bin-70e6d80c2d367480478eacf46363ee88a0e994ff.tar.gz bin-70e6d80c2d367480478eacf46363ee88a0e994ff.zip | |
added lots of new dmenu scripts
Diffstat (limited to 'dmenu-vimwiki-open')
| -rwxr-xr-x | dmenu-vimwiki-open | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/dmenu-vimwiki-open b/dmenu-vimwiki-open new file mode 100755 index 0000000..e8c4891 --- /dev/null +++ b/dmenu-vimwiki-open @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Optional dmenu theming +# shellcheck disable=SC1090 +[[ -r "${HOME}/.local/bin/dmenu-theming" ]] && . "${HOME}/.local/bin/dmenu-theming" + +DMENU="${DMENU:-dmenu}" +PROMPT="${PROMPT:-VimWiki: }" +EDITOR_CMD="${EDITOR_CMD:-vim}" +TERM_CMD="${TERM_CMD:-st -e}" + +# Set this to your VimWiki root directory +VIMWIKI_ROOT="${VIMWIKI_ROOT:-${HOME}/vimwiki}" # <-- CHANGE if needed + +CACHE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/dmenu" +CACHE_FILE="${CACHE_DIR}/vimwiki_files.txt" +CACHE_TTL_SECONDS="${CACHE_TTL_SECONDS:-30}" # how long to trust the cache + +mkdir -p "$CACHE_DIR" + +now_epoch() { date +%s; } + +cache_is_fresh() { + [[ -r "$CACHE_FILE" ]] || return 1 + local mtime + mtime="$(stat -c %Y "$CACHE_FILE" 2>/dev/null || echo 0)" + local age=$(( $(now_epoch) - mtime )) + [[ "$age" -le "$CACHE_TTL_SECONDS" ]] +} + +build_cache() { + if command -v fd >/dev/null 2>&1; then + # Relative paths, ignore common junk + (cd "$VIMWIKI_ROOT" && fd -t f -H \ + -E .git -E .cache -E node_modules -E .venv -E __pycache__ \ + -E attachments -E media \ + .) > "$CACHE_FILE" + else + (cd "$VIMWIKI_ROOT" && find . -type f \ + ! -path './.git/*' \ + ! -path './.cache/*' \ + ! -path './node_modules/*' \ + ! -path './.venv/*' \ + ! -path './__pycache__/*' \ + ! -path './attachments/*' \ + ! -path './media/*' \ + -print | sed 's|^\./||') > "$CACHE_FILE" + fi + + # Sort for stable menu + sort -u -o "$CACHE_FILE" "$CACHE_FILE" +} + +[[ -d "$VIMWIKI_ROOT" ]] || { printf "ERROR: VimWiki root not found: %s\n" "$VIMWIKI_ROOT" >&2; exit 1; } + +cache_is_fresh || build_cache + +picked="$( + cat "$CACHE_FILE" \ + | ${DMENU} -i -l 20 -p "$PROMPT" ${lines:-} ${colors:-} ${font:-} \ + || true +)" +[[ -n "$picked" ]] || exit 0 + +# Safety: no parent traversal +case "$picked" in + *'..'* ) exit 0 ;; +esac + +target="${VIMWIKI_ROOT}/${picked}" +[[ -e "$target" ]] || { printf "ERROR: missing: %s\n" "$target" >&2; exit 1; } + +exec ${TERM_CMD} "$EDITOR_CMD" "$target" + |
