summary refs log tree commit diff
diff options
context:
space:
mode:
authorFranck Cuny <franck@fcuny.net>2024-09-30 12:53:34 -0700
committerFranck Cuny <franck@fcuny.net>2024-09-30 12:53:34 -0700
commitd5d0af9e484568fc07d4d9a847e12da4fad12031 (patch)
treee2b7b7691317fd4c7fd11a84927a40cb31009836
parentload my custom denote code (diff)
downloademacs.d-d5d0af9e484568fc07d4d9a847e12da4fad12031.tar.gz
forgot to add the denote related code
-rw-r--r--.gitignore2
-rw-r--r--lisp/my-denote.el65
2 files changed, 66 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 02cbcf1..18bf8e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,5 +12,5 @@
 /transient/
 /bookmarks
 /savehist
-/lisp/
+/lisp/custom.el
 /.org-id-locations
diff --git a/lisp/my-denote.el b/lisp/my-denote.el
new file mode 100644
index 0000000..2513b81
--- /dev/null
+++ b/lisp/my-denote.el
@@ -0,0 +1,65 @@
+;;; my-denote.el --- summary -*- lexical-binding: t -*-
+;; Author: Franck Cuny <franck@fcuny.net>
+
+;;; Commentary:
+
+;; commentary
+
+;;; Code:
+
+;;; https://protesilaos.com/codelog/2024-09-20-emacs-use-denote-for-meetings-events/
+(defvar my-denote-colleagues '("dbullock" "nirmam" "mark")
+  "List of names I collaborate with.
+There is at least one file in the variable `denote-directory' that has
+the name of this person.")
+
+(defvar my-denote-colleagues-prompt-history nil
+  "Minibuffer history for `my-denote-colleagues-new-meeting'.")
+
+(defun my-denote-colleagues-prompt ()
+  "Prompt with completion for a name among `my-denote-colleagues'.
+Use the last input as the default value."
+  (let ((default-value (car my-denote-colleagues-prompt-history)))
+    (completing-read
+     (format-prompt "New meeting with COLLEAGUE" default-value)
+     my-denote-colleagues
+     nil :require-match nil
+     'my-denote-colleagues-prompt-history
+     default-value)))
+
+(defun my-denote-colleagues-get-file (name)
+  "Find file in variable `denote-directory' for NAME colleague.
+If there are more than one files, prompt with completion for one among
+them.
+
+NAME is one among `my-denote-colleagues'."
+  (if-let ((files (denote-directory-files name))
+           (length-of-files (length files)))
+      (cond
+       ((= length-of-files 1)
+        (car files))
+       ((> length-of-files 1)
+        (completing-read "Select a file: " files nil :require-match)))
+    (user-error "No files for colleague with name `%s'" name)))
+
+(defun my-denote-colleagues-new-meeting ()
+  "Prompt for the name of a colleague and insert a timestamped heading therein.
+The name of a colleague corresponds to at least one file in the variable
+`denote-directory'.  In case there are multiple files, prompt to choose
+one among them and operate therein.
+
+Names are defined in `my-denote-colleagues'."
+  (declare (interactive-only t))
+  (interactive)
+  (let* ((name (my-denote-colleagues-prompt))
+         (file (my-denote-colleagues-get-file name))
+         (time (format-time-string "%F %a %R")))  ; remove %R if you do not want the time
+    (with-current-buffer (find-file file)
+      (goto-char (point-max))
+      ;; Here I am assuming we are in `org-mode', hence the leading
+      ;; asterisk for the heading.  Adapt accordingly.
+      (insert (format "* [%s]\n\n" time)))))
+
+(provide 'my-denote)
+
+;;; my-denote.el ends here