/ scripts / restore-nvim-dirs.sh
restore-nvim-dirs.sh
 1  #!/usr/bin/env bash
 2  # Restore the most recent Neovim backup created by backup-nvim-dirs.sh.
 3  # Current (broken) dirs are renamed with a .broken-TIMESTAMP suffix before restore.
 4  # Usage: ./scripts/restore-nvim-dirs.sh
 5  
 6  set -e
 7  
 8  # Find the latest backup timestamp across all three dirs
 9  latest=$(
10    {
11      ls -d ~/.local/share/nvim.bak-* 2>/dev/null
12      ls -d ~/.local/state/nvim.bak-* 2>/dev/null
13      ls -d ~/.cache/nvim.bak-*       2>/dev/null
14    } \
15    | sed 's/.*\.bak-//' \
16    | sort -r \
17    | head -1
18  )
19  
20  if [ -z "$latest" ]; then
21    echo "No Neovim backups found (looked for nvim.bak-* in share/state/cache)." >&2
22    exit 1
23  fi
24  
25  echo "Latest backup: bak-${latest}"
26  echo ""
27  
28  broken_suffix="broken-$(date '+%Y%m%d-%H%M%S')"
29  restored=0
30  
31  restore_dir() {
32    local base="$1"      # e.g. ~/.local/share/nvim
33    local backup="${base}.bak-${latest}"
34  
35    if [ ! -d "$backup" ]; then
36      echo "  skip  ${base}  (no backup for this timestamp)"
37      return
38    fi
39  
40    if [ -d "$base" ]; then
41      mv "$base" "${base}.${broken_suffix}"
42      echo "  stashed  ${base} -> ${base##*/}.${broken_suffix}"
43    fi
44  
45    mv "$backup" "$base"
46    echo "  restored ${backup##*/} -> ${base##*/}"
47    restored=1
48  }
49  
50  restore_dir ~/.local/share/nvim
51  restore_dir ~/.local/state/nvim
52  restore_dir ~/.cache/nvim
53  
54  echo ""
55  if [ "$restored" -eq 0 ]; then
56    echo "Nothing restored."
57  else
58    echo "Done. Restart Neovim."
59  fi