aboutsummaryrefslogtreecommitdiff
path: root/dm-vimwiki-open
blob: e8c489199f1d69fcf045efcef00f94f5673dc6ad (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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"