blob: 71a8dc7a5bac13c846f9780804e83c4f5aae5824 (
plain)
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#!/usr/bin/env bash
# Notes/TODO management & quick search engine via tmux
NOTES_DIR="$HOME/documents/main"
TODO_FILE="$NOTES_DIR/inbox/tasks/TODO.md"
EDITOR="nvim"
NOTE_SESSION_NAME="note"
BROWSER_PREFERENCES=("firefox" "chromium" "google-chrome" "brave-browser" "chrome")
SEARCH_URL="https://www.google.com/search?q="
# simple error printing
error() {
echo "Error: $1" >&2
}
# add a TODO entry with timestamp
add_todo() {
local todo_text="$1"
[ -z "$todo_text" ] && return 1
[ ! -f "$TODO_FILE" ] && echo -e "# TODO List\n" > "$TODO_FILE"
echo "- [ ] $todo_text ($(date '+%Y-%m-%d %H:%M'))" >> "$TODO_FILE"
tmux display-message "Added TODO: $todo_text"
}
# open a web search
search_web() {
local query="$1"
[ -z "$query" ] && return 1
local encoded_query=$(printf '%s' "$query" | sed 's/ /+/g' | sed 's/[^a-zA-Z0-9+._-]//g')
local search_url="${SEARCH_URL}${encoded_query}"
if command -v xdg-open >/dev/null 2>&1; then
xdg-open "$search_url" >/dev/null 2>&1 &
else
for browser in "${BROWSER_PREFERENCES[@]}"; do
command -v "$browser" >/dev/null 2>&1 && $browser "$search_url" >/dev/null 2>&1 & break
done
fi
tmux display-message "Opening search for: $query"
}
# display the notes menu (in-editor or popup)
open_menu() {
tmux set -gF '@last_session_name' '#S'
if tmux has-session -t "$NOTE_SESSION_NAME" 2>/dev/null && tmux list-panes -t "$NOTE_SESSION_NAME" -F "#{pane_current_command}" | grep -q "^nvim$"; then
# menu for active nvim session
tmux display-menu -T "#[align=center] Notes (nvim-mode)" \
"New note" n "command-prompt -p 'Enter note title:' 'send-keys -t $NOTE_SESSION_NAME \":e $NOTES_DIR/%%.md\" Enter'" \
"Open note" o "send-keys -t $NOTE_SESSION_NAME \":cd $NOTES_DIR | FzfLua files\" Enter" \
"TODO List" t "send-keys -t $NOTE_SESSION_NAME \":e $TODO_FILE\" Enter" \
"Add Quick TODO" T "command-prompt -p 'Enter TODO:' 'run-shell \"$0 --add-todo %%\"'" \
"Grep/find patterns" g "send-keys -t $NOTE_SESSION_NAME \":cd $NOTES_DIR | FzfLua live_grep\" Enter" \
"Web Search" s "command-prompt -p 'Search query:' 'run-shell \"$0 --search %%\"'" \
"Quit (q)" q ""
else
# popup menu outside of nvim
tmux display-menu -T "#[align=center] Notes (popup-mode)" \
"New note" n "command-prompt -p 'Enter note title:' \"display-popup -w 100% -h 100% -E 'tmux new-session -A -s $NOTE_SESSION_NAME \\\"$EDITOR $NOTES_DIR/%%.md\\\"'\"" \
"Open note" o "display-popup -w 100% -h 100% -E \"tmux new-session -A -s $NOTE_SESSION_NAME 'fzf --preview \\\"bat --style=numbers --color=always --line-range=:500 {}\\\" --preview-window=up:60% --height=90% --layout=reverse --border=sharp --ansi < <(find $NOTES_DIR -type f -name \\\"*.md\\\") | xargs -r $EDITOR'\"" \
"TODO List" t "display-popup -w 100% -h 100% -E \"tmux new-session -A -s $NOTE_SESSION_NAME \\\"$EDITOR $TODO_FILE\\\"\"" \
"Add Quick TODO" T "command-prompt -p 'Enter TODO:' 'run-shell \"$0 --add-todo %%\"'" \
"Grep/find patterns" g "display-popup -w 100% -h 100% -E \"tmux new-session -A -s $NOTE_SESSION_NAME 'rg --color=always --line-number --no-heading --smart-case . $NOTES_DIR | fzf --delimiter=: --preview \\\"bat --style=numbers --color=always --line-range=:500 {1}\\\" --preview-window=up:60% --height=90% --layout=reverse --border=sharp --ansi | cut -d ':' -f 1 | xargs -r $EDITOR'\"" \
"Web Search" s "command-prompt -p 'Search query:' 'run-shell \"$0 --search %%\"'" \
"Quit (q)" q ""
fi
}
# make sure tmux is installed
command -v tmux >/dev/null 2>&1 || { error "tmux is not installed."; exit 1; }
# handle CLI arguments
if [ "$1" = "--add-todo" ]; then
shift
add_todo "$*"
exit 0
fi
if [ "$1" = "--search" ]; then
shift
search_web "$*"
exit 0
fi
if [ "$1" = "--new" ]; then
if tmux has-session -t "$NOTE_SESSION_NAME" 2>/dev/null; then
# reuse existing session
tmux display-popup -w 100% -h 100% -E "
FILE=\$(find $NOTES_DIR -type f -name '*.md' \
| fzf --preview 'bat --style=numbers --color=always --line-range=:500 {}' \
--preview-window=up:60% --height=90% --layout=reverse --border=sharp --ansi)
[ -n \"\$FILE\" ] && tmux send-keys -t $NOTE_SESSION_NAME \":e \$FILE\" Enter
"
else
open_menu
fi
exit 0
fi
# default behavior: toggle or open menu
if [ -z "$1" ]; then
if tmux has-session -t "$NOTE_SESSION_NAME" 2>/dev/null; then
CURRENT_SESSION=$(tmux display-message -p '#S')
[ "$CURRENT_SESSION" = "$NOTE_SESSION_NAME" ] && tmux detach-client || tmux display-popup -E -x200% -y0 -w50% -h99% "tmux attach-session -t $NOTE_SESSION_NAME"
else
open_menu
fi
fi
|