dotfiles/.config/kak/autoload/notes.kak

287 lines
13 KiB
Text

provide-module notes %~
# Global directory for notes.
declare-option str notes_root_dir "%sh{ echo $HOME/notes/kak }"
# Active directory.
#
# Global directory (`notes_root_dir`) or a local override.
declare-option str notes_active_dir "%opt{notes_root_dir}"
declare-option str notes_sym_todo 'TODO'
declare-option str notes_sym_wip 'WIP'
declare-option str notes_sym_done 'DONE'
declare-option str notes_sym_wontdo 'WONTDO'
declare-option str notes_sym_idea 'IDEA'
declare-option str notes_sym_question 'QUESTION'
declare-option str notes_sym_hold 'HOLD'
declare-option str notes_sym_review 'REVIEW'
declare-option str notes_find 'fd -t file .md'
declare-option -hidden str notes_tasks_list_current_line
declare-option -hidden str notes_journal_now
# Main notes mode.
declare-user-mode notes
# Mode to edit tasks.
declare-user-mode notes-tasks
# Mode to list tasks.
declare-user-mode notes-tasks-list
# Mode to navigate journal.
declare-user-mode notes-journal-nav
# Mode to navigate journal (last journals).
declare-user-mode notes-journal-nav-last
set-face global notes_todo green
set-face global notes_wip blue
set-face global notes_done black
set-face global notes_wontdo black
set-face global notes_idea green
set-face global notes_question cyan
set-face global notes_hold red
set-face global notes_review yellow
set-face global notes_issue cyan+u
set-face global notes_subtask_uncheck green
set-face global notes_subtask_check black
set-face global notes_tag blue+i
# Open the daily journal.
define-command notes-journal-open -docstring 'open daily journal' %{
nop %sh{
mkdir -p "$kak_opt_notes_active_dir/journal/$(date +%Y/%b)"
}
evaluate-commands %{
edit "%opt{notes_active_dir}/journal/%sh{ date '+%Y/%b/%a %d' }.md"
set-option buffer notes_journal_now %sh{ date }
}
}
# Open a journal relative to today.
define-command -hidden notes-journal-open-rel -params -1 %{
nop %sh{
mkdir -p "$kak_opt_notes_active_dir/journal/$(date -d ""$kak_opt_notes_journal_now $1"" +%Y/%b)"
}
evaluate-commands %{
edit -existing "%opt{notes_active_dir}/journal/%sh{ date -d ""$kak_opt_notes_journal_now $1"" ""+%Y/%b/%a %d"" }.md"
set-option buffer notes_journal_now %sh{ date -d """$kak_opt_notes_journal_now $1""" }
}
}
# Open a note by prompting the user with a menu.
define-command notes-open -docstring 'open note' %{
prompt -menu -shell-script-candidates "$kak_opt_notes_find $kak_opt_notes_active_dir/notes" 'open note:' %{
edit %sh{
echo "${kak_text%.md}.md"
}
}
}
# Create a new note by prompting the user for its text.
define-command notes-new-note -docstring 'new note' %{
prompt note: %{
edit %sh{
echo "$kak_opt_notes_active_dir/notes/${kak_text%.md}.md"
}
}
}
# Archive a note by prompting the user for which note to operate on.
define-command notes-archive-note -docstring 'archive note' %{
prompt -menu -shell-script-candidates "$kak_opt_notes_find $kak_opt_notes_active_dir/notes" archive: %{
nop %sh{
mkdir -p "$kak_opt_notes_active_dir/archives"
mv "$kak_text" "$kak_opt_notes_active_dir/archives/"
}
}
}
# Prompt the user to pick and open an archived note.
define-command notes-archive-open -docstring 'open archive' %{
prompt -menu -shell-script-candidates "$kak_opt_notes_find $kak_opt_notes_active_dir/archives" 'open archive:' %{
edit %sh{
echo "${kak_text%.md}.md"
}
}
}
# Capture a new note.
define-command notes-capture -docstring 'capture' %{
prompt capture: %{
nop %sh{
echo -e "> $(date '+%a %b %d %Y, %H:%M:%S')\n$kak_text\n" >> "$kak_opt_notes_active_dir/capture.md"
}
}
}
# Open the capture file.
define-command notes-open-capture -docstring 'open capture' %{
edit "%opt{notes_active_dir}/capture.md"
}
# Switch the status of a note to the input parameter.
define-command notes-task-switch-status -params 1 -docstring 'switch task' %{
execute-keys -draft "gif<space>e_c%arg{1}"
}
# Open a GitHub issue. This requires a specific formatting of the file.
define-command notes-task-gh-open-issue -docstring 'open GitHub issue' %{
evaluate-commands -save-regs 'il' %{
try %{
execute-keys -draft '<a-i>w"iy'
execute-keys -draft '%sgithub_project: <ret>;<a-W>_"ly'
nop %sh{
open "https://github.com/$kak_reg_l/issues/$kak_reg_i"
}
}
}
}
define-command -hidden notes-tasks-list-by-regex -params 1 -docstring 'list tasks by status' %{
edit -scratch *notes-tasks-list*
unset-option buffer notes_tasks_list_current_line
execute-keys "%%d|rg -n --column -e '%arg{1}' '%opt{notes_active_dir}/notes' '%opt{notes_active_dir}/journal' '%opt{notes_active_dir}/capture.md'<ret>|sort<ret>gg"
}
# List all tasks.
define-command notes-tasks-list-all -docstring 'list all tasks' %{
notes-tasks-list-by-regex "%opt{notes_sym_todo}|%opt{notes_sym_wip}|%opt{notes_sym_done}|%opt{notes_sym_wontdo}|%opt{notes_sym_idea}|%opt{notes_sym_question}|%opt{notes_sym_hold}"
}
# Command executed when pressing <ret> in a *notes-tasks-list* buffer.
define-command -hidden notes-tasks-list-open %{
set-option buffer notes_tasks_list_current_line %val{cursor_line}
execute-keys -with-hooks -save-regs 'flc' 'giT:"fyllT:"lyllT:"cy:edit "%reg{f}" %reg{l} %reg{c}<ret>'
}
# Run a grepper with the provided arguments as search query.
define-command -hidden notes-grepcmd -params 2 %{
# Initial implementation based on rg <pattern> <path>.
execute-keys ":grep %arg{2} %arg{1}<ret>"
}
# Prompt the user for terms to search in notes, journals, archives and the
# capture file.
define-command notes-search -docstring 'search notes' %{
prompt 'search notes:' %{
notes-grepcmd "%opt{notes_active_dir}" "%val{text}"
}
}
# Synchronize notes remotely.
define-command notes-sync -docstring 'synchronize notes' %{
# First, we always check-in new modifications; then, we check whether we have anything else to send
info -title 'notes' 'starting synchronizing…'
nop %sh{
cd $kak_opt_notes_active_dir
git fetch --prune origin
git rebase --autostash origin/master
git add -A .
git commit -m "$(date +'Sync update %a %b %d %Y')"
git push origin
}
info -title 'notes' 'finished synchronizing'
}
# Toggle overriding the active directory with pwd and vice versa.
define-command notes-override-active-dir -docstring 'override the active directory with PWD' %{
set-option global notes_active_dir %sh{
dir=$(pwd)
if [ "$kak_opt_notes_active_dir" == "$dir" ]; then
echo "$kak_opt_notes_root_dir"
else
echo "$dir"
fi
}
info -title notes "active dir: %opt{notes_active_dir}"
}
add-highlighter shared/notes-tasks group
add-highlighter shared/notes-tasks/todo regex "(%opt{notes_sym_todo})" 1:notes_todo
add-highlighter shared/notes-tasks/wip regex "(%opt{notes_sym_wip})" 1:notes_wip
add-highlighter shared/notes-tasks/done regex "(%opt{notes_sym_done})" 1:notes_done
add-highlighter shared/notes-tasks/wontdo regex "(%opt{notes_sym_wontdo})" 1:notes_wontdo
add-highlighter shared/notes-tasks/idea regex "(%opt{notes_sym_idea})" 1:notes_idea
add-highlighter shared/notes-tasks/question regex "(%opt{notes_sym_question})" 1:notes_question
add-highlighter shared/notes-tasks/hold regex "(%opt{notes_sym_hold})" 1:notes_hold
add-highlighter shared/notes-tasks/review regex "(%opt{notes_sym_review})" 1:notes_review
add-highlighter shared/notes-tasks/issue regex " (#[0-9]+)" 1:notes_issue
add-highlighter shared/notes-tasks/subtask-uncheck regex "-\s* (\[ \])[^\n]*" 1:notes_subtask_uncheck
add-highlighter shared/notes-tasks/subtask-check regex "-\s* (\[x\])\s*([^\n]*)"\
1:notes_subtask_check
add-highlighter shared/notes-tasks-list group
add-highlighter shared/notes-tasks-list/path regex "^((?:\w:)?[^:\n]+):(\d+):(\d+)?" 1:green 2:blue 3:blue
add-highlighter shared/notes-tasks-list/current-line line %{%opt{notes_tasks_list_current_line}} default+b
map global user o ':enter-user-mode notes<ret>' -docstring 'notes'
map global notes A ':notes-archive-note<ret>' -docstring 'archive note'
map global notes a ':notes-archive-open<ret>' -docstring 'open archived note'
map global notes C ':notes-capture<ret>' -docstring 'capture'
map global notes c ':notes-open-capture<ret>' -docstring 'open capture'
map global notes j ':notes-journal-open<ret>' -docstring 'open journal'
map global notes J ':enter-user-mode notes-journal-nav<ret>' -docstring 'navigate journals'
map global notes l ':enter-user-mode notes-tasks-list<ret>' -docstring 'tasks list'
map global notes N ':notes-new-note<ret>' -docstring 'new note'
map global notes n ':notes-open<ret>' -docstring 'open note'
map global notes / ':notes-search<ret>' -docstring 'search in notes'
map global notes S ':notes-sync<ret>' -docstring 'synchronize notes'
map global notes t ':enter-user-mode notes-tasks<ret>' -docstring 'tasks'
map global notes z ':notes-override-active-dir<ret>' -docstring 'switch notes dir with PWD'
map global notes-journal-nav l ':enter-user-mode notes-journal-nav-last<ret>' -docstring 'last…'
map global notes-journal-nav d ':notes-journal-open-rel "-1 day"<ret>' -docstring 'day before'
map global notes-journal-nav D ':notes-journal-open-rel "+1 day"<ret>' -docstring 'day after'
map global notes-journal-nav w ':notes-journal-open-rel "-1 week"<ret>' -docstring 'week before'
map global notes-journal-nav W ':notes-journal-open-rel "+1 week"<ret>' -docstring 'week after'
map global notes-journal-nav m ':notes-journal-open-rel "-1 month"<ret>' -docstring 'month before'
map global notes-journal-nav M ':notes-journal-open-rel "+1 month"<ret>' -docstring 'month after'
map global notes-journal-nav-last m ':notes-journal-open-rel "last monday"<ret>' -docstring 'monday'
map global notes-journal-nav-last t ':notes-journal-open-rel "last tuesday"<ret>' -docstring 'tuesday'
map global notes-journal-nav-last w ':notes-journal-open-rel "last wednesday"<ret>' -docstring 'wednesday'
map global notes-journal-nav-last h ':notes-journal-open-rel "last thursday"<ret>' -docstring 'thursday'
map global notes-journal-nav-last f ':notes-journal-open-rel "last friday"<ret>' -docstring 'friday'
map global notes-journal-nav-last T ':notes-journal-open-rel "last saturday"<ret>' -docstring 'saturday'
map global notes-journal-nav-last S ':notes-journal-open-rel "last sunday"<ret>' -docstring 'sunday'
map global notes-tasks-list a ":notes-tasks-list-all<ret>" -docstring 'list all tasks'
map global notes-tasks-list d ":notes-tasks-list-by-regex %opt{notes_sym_done}<ret>" -docstring 'list done tasks'
map global notes-tasks-list h ":notes-tasks-list-by-regex %opt{notes_sym_hold}<ret>" -docstring 'list hold tasks'
map global notes-tasks-list i ":notes-tasks-list-by-regex %opt{notes_sym_idea}<ret>" -docstring 'list ideas'
map global notes-tasks-list l ":notes-tasks-list-by-regex '\ :[^:]+:'<ret>" -docstring 'list tasks by labels'
map global notes-tasks-list n ":notes-tasks-list-by-regex %opt{notes_sym_wontdo}<ret>" -docstring 'list wontdo tasks'
map global notes-tasks-list q ":notes-tasks-list-by-regex %opt{notes_sym_question}<ret>" -docstring 'list questions'
map global notes-tasks-list r ":notes-tasks-list-by-regex %opt{notes_sym_review}<ret>" -docstring 'list reviews'
map global notes-tasks-list t ":notes-tasks-list-by-regex %opt{notes_sym_todo}<ret>" -docstring 'list todo tasks'
map global notes-tasks-list w ":notes-tasks-list-by-regex %opt{notes_sym_wip}<ret>" -docstring 'list wip tasks'
hook -group notes-tasks global WinCreate \*notes-tasks-list\* %{
map buffer normal '<ret>' ':notes-tasks-list-open<ret>'
add-highlighter window/ ref notes-tasks
add-highlighter window/ ref notes-tasks-list
}
hook -group notes-tasks global WinCreate .*\.md %{
add-highlighter window/ ref notes-tasks
map window notes-tasks d ":notes-task-switch-status %opt{notes_sym_done}<ret>" -docstring 'switch task to done'
map window notes-tasks h ":notes-task-switch-status %opt{notes_sym_hold}<ret>" -docstring 'switch task to hold'
map window notes-tasks i ":notes-task-switch-status %opt{notes_sym_idea}<ret>" -docstring 'switch task to idea'
map window notes-tasks n ":notes-task-switch-status %opt{notes_sym_wontdo}<ret>" -docstring 'switch task to wontdo'
map window notes-tasks q ":notes-task-switch-status %opt{notes_sym_question}<ret>" -docstring 'switch task to question'
map window notes-tasks <ret> ":notes-task-gh-open-issue<ret>" -docstring 'open GitHub issue'
map window notes-tasks r ":notes-task-switch-status %opt{notes_sym_review}<ret>" -docstring 'switch task to review'
map window notes-tasks t ":notes-task-switch-status %opt{notes_sym_todo}<ret>" -docstring 'switch task to todo'
map window notes-tasks w ":notes-task-switch-status %opt{notes_sym_wip}<ret>" -docstring 'switch task to wip'
}
~