feat(emacs): experiments with org

This commit is contained in:
Pavel Korytov 2023-10-19 12:57:45 +03:00
parent 73a79196a3
commit 806abfae2e
2 changed files with 225 additions and 3 deletions

View file

@ -571,6 +571,11 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer."
(setq accent-custom '((a (ā)) (setq accent-custom '((a (ā))
(A (Ā))))) (A (Ā)))))
(use-package binky
:straight t
:init
(my-leader-def "j" #'binky-binky))
(use-package projectile (use-package projectile
:straight t :straight t
:config :config
@ -3263,6 +3268,26 @@ Returns (<buffer> . <workspace-index>) or nil."
"* %?\n" "* %?\n"
"/Entered on/ %U")))) "/Entered on/ %U"))))
(use-package org-super-agenda
:straight t
:after (org)
:config
;; Alphapapa doesn't like evil
(general-define-key
:keymaps '(org-super-agenda-header-map)
"h" nil
"j" nil
"k" nil
"l" nil))
(defun my/org-super-agenda--make-agenda-header-around (fun name)
(remove-text-properties 0 (length name) '(line-prefix nil) name)
(remove-text-properties 0 (length name) '(wrap-prefix nil) name)
(funcall fun (substring-no-properties name)))
(with-eval-after-load 'org-super-agenda
(advice-add 'org-super-agenda--make-agenda-header :around #'my/org-super-agenda--make-agenda-header-around))
(use-package org-ql (use-package org-ql
:after (org) :after (org)
:if (not my/remote-server) :if (not my/remote-server)
@ -3273,7 +3298,60 @@ Returns (<buffer> . <workspace-index>) or nil."
;; See https://github.com/alphapapa/org-ql/pull/237 ;; See https://github.com/alphapapa/org-ql/pull/237
(setq org-ql-regexp-part-ts-time (setq org-ql-regexp-part-ts-time
(rx " " (repeat 1 2 digit) ":" (repeat 2 digit) (rx " " (repeat 1 2 digit) ":" (repeat 2 digit)
(optional "-" (repeat 1 2 digit) ":" (repeat 2 digit))))) (optional "-" (repeat 1 2 digit) ":" (repeat 2 digit))))
)
(defun my/org-meeting--prompt ()
(let* ((meetings (org-ql-query
:select #'element-with-markers
:from (org-agenda-files)
:where '(and (todo) (tags "mt") (ts-active :from today to 31))
:order-by 'scheduled))
(data (mapcar
(lambda (meeting)
(let ((raw-value (org-element-property :raw-value meeting))
(scheduled (org-format-timestamp
(org-element-property :scheduled meeting)
(cdr org-time-stamp-formats))))
(cons (format "%-30s %s" raw-value
(propertize scheduled 'face 'org-agenda-date))
meeting)))
meetings))
(ivy-prescient-sort-commands nil))
(cdr
(assoc
(completing-read "Meeting: " data nil t)
data))))
(defun my/org-meeting--format-link (meeting)
(format "[[file:%s::*%s][%s]]"
(buffer-file-name
(marker-buffer
(org-element-property :org-marker meeting)))
(org-element-property :raw-value meeting)
(org-element-property :raw-value meeting)))
(defun my/org-meeting-link ()
(interactive)
(let ((meeting (my/org-meeting--prompt)))
(org-set-property "MEETING" (my/org-meeting--format-link meeting))))
(defun my/org-ql-meeting-tasks (meeting)
(interactive (list (my/org-meeting--prompt)))
(org-ql-search (org-agenda-files)
`(property "MEETING" ,(my/org-meeting--format-link meeting))
:sort '(date priority todo)
:buffer (format "*Meeting Tasks: %s*" (org-element-property :raw-value meeting))
:super-groups '((:auto-outline-path t))))
(defun my/org-ql-meeting-tasks-agenda ()
(interactive)
(let ((meeting (save-window-excursion
(org-agenda-switch-to)
(org-back-to-heading)
(org-ql--add-markers
(org-element-at-point)))))
(my/org-ql-meeting-tasks meeting)))
(use-package org-habit-stats (use-package org-habit-stats
:straight (:host github :repo "ml729/org-habit-stats") :straight (:host github :repo "ml729/org-habit-stats")
@ -4028,6 +4106,31 @@ KEYS is a list of cons cells like (<label> . <time>)."
:after (calfw org) :after (calfw org)
:straight t) :straight t)
(defun my/org-timeblock-conf ()
(display-line-numbers-mode -1))
(use-package org-timeblock
:straight (:host github :repo "ichernyshovvv/org-timeblock")
:commands (org-timeblock-mode)
:init
(my-leader-def "ot" #'org-timeblock)
:config
(add-hook 'org-timeblock-mode-hook #'my/org-timeblock-conf)
(general-define-key
:keymaps '(org-timeblock-mode-map)
:states '(normal visual)
"j" #'org-timeblock-forward-block
"h" #'org-timeblock-backward-column
"l" #'org-timeblock-forward-column
"k" #'org-timeblock-backward-block
"M-[" #'org-timeblock-day-earlier
"M-]" #'org-timeblock-day-later
"H" #'org-timeblock-day-earlier
"L" #'org-timeblock-day-later
"RET" #'org-timeblock-goto
"t" #'org-timeblock-todo-set
"q" #'quit-window))
(defun my/enable-org-latex () (defun my/enable-org-latex ()
(interactive) (interactive)
(customize-set-variable 'org-highlight-latex-and-related '(native)) (customize-set-variable 'org-highlight-latex-and-related '(native))

123
Emacs.org
View file

@ -993,6 +993,15 @@ Input accented characters.
(setq accent-custom '((a (ā)) (setq accent-custom '((a (ā))
(A (Ā))))) (A (Ā)))))
#+end_src #+end_src
**** binky
Experimenting with this package.
#+begin_src emacs-lisp
(use-package binky
:straight t
:init
(my-leader-def "j" #'binky-binky))
#+end_src
** Working with projects ** Working with projects
Packages related to managing projects. Packages related to managing projects.
@ -4563,10 +4572,37 @@ Settings for Org capture mode. The goal here is to have a non-disruptive process
"/Entered on/ %U")))) "/Entered on/ %U"))))
#+end_src #+end_src
**** org-super-agenda
[[https://github.com/alphapapa/org-super-agenda][org-super-agenda]] is alphapapa's extension to group items in org-agenda.
#+begin_src emacs-lisp
(use-package org-super-agenda
:straight t
:after (org)
:config
;; Alphapapa doesn't like evil
(general-define-key
:keymaps '(org-super-agenda-header-map)
"h" nil
"j" nil
"k" nil
"l" nil))
#+end_src
It doesn't look great with org-bars mode, so...
#+begin_src emacs-lisp
(defun my/org-super-agenda--make-agenda-header-around (fun name)
(remove-text-properties 0 (length name) '(line-prefix nil) name)
(remove-text-properties 0 (length name) '(wrap-prefix nil) name)
(funcall fun (substring-no-properties name)))
(with-eval-after-load 'org-super-agenda
(advice-add 'org-super-agenda--make-agenda-header :around #'my/org-super-agenda--make-agenda-header-around))
#+end_src
**** org-ql **** org-ql
[[https://github.com/alphapapa/org-ql][org-ql]] is a package to query the org files. I've tried using it for: [[https://github.com/alphapapa/org-ql][org-ql]] is a package to query the org files. I've tried using it for:
- Grabbing done tasks / meetings / etc for review workflow - Grabbing done tasks / meetings / etc for review workflow
- Adding Trello tasks into Agenga
None of that worked out, but I'll keep the package here in case I have some more ideas. None of that worked out, but I'll keep the package here in case I have some more ideas.
@ -4581,9 +4617,64 @@ None of that worked out, but I'll keep the package here in case I have some more
;; See https://github.com/alphapapa/org-ql/pull/237 ;; See https://github.com/alphapapa/org-ql/pull/237
(setq org-ql-regexp-part-ts-time (setq org-ql-regexp-part-ts-time
(rx " " (repeat 1 2 digit) ":" (repeat 2 digit) (rx " " (repeat 1 2 digit) ":" (repeat 2 digit)
(optional "-" (repeat 1 2 digit) ":" (repeat 2 digit))))) (optional "-" (repeat 1 2 digit) ":" (repeat 2 digit))))
)
#+end_src #+end_src
**** Link tasks to meetings
#+begin_src emacs-lisp
(defun my/org-meeting--prompt ()
(let* ((meetings (org-ql-query
:select #'element-with-markers
:from (org-agenda-files)
:where '(and (todo) (tags "mt") (ts-active :from today to 31))
:order-by 'scheduled))
(data (mapcar
(lambda (meeting)
(let ((raw-value (org-element-property :raw-value meeting))
(scheduled (org-format-timestamp
(org-element-property :scheduled meeting)
(cdr org-time-stamp-formats))))
(cons (format "%-30s %s" raw-value
(propertize scheduled 'face 'org-agenda-date))
meeting)))
meetings))
(ivy-prescient-sort-commands nil))
(cdr
(assoc
(completing-read "Meeting: " data nil t)
data))))
(defun my/org-meeting--format-link (meeting)
(format "[[file:%s::*%s][%s]]"
(buffer-file-name
(marker-buffer
(org-element-property :org-marker meeting)))
(org-element-property :raw-value meeting)
(org-element-property :raw-value meeting)))
(defun my/org-meeting-link ()
(interactive)
(let ((meeting (my/org-meeting--prompt)))
(org-set-property "MEETING" (my/org-meeting--format-link meeting))))
(defun my/org-ql-meeting-tasks (meeting)
(interactive (list (my/org-meeting--prompt)))
(org-ql-search (org-agenda-files)
`(property "MEETING" ,(my/org-meeting--format-link meeting))
:sort '(date priority todo)
:buffer (format "*Meeting Tasks: %s*" (org-element-property :raw-value meeting))
:super-groups '((:auto-outline-path t))))
(defun my/org-ql-meeting-tasks-agenda ()
(interactive)
(let ((meeting (save-window-excursion
(org-agenda-switch-to)
(org-back-to-heading)
(org-ql--add-markers
(org-element-at-point)))))
(my/org-ql-meeting-tasks meeting)))
#+end_src
**** Tracking habits **** Tracking habits
Let's see how this goes. Let's see how this goes.
@ -5653,6 +5744,34 @@ An example contact entry can look like this:
:after (calfw org) :after (calfw org)
:straight t) :straight t)
#+end_src #+end_src
*** org-timeblock
#+begin_src emacs-lisp
(defun my/org-timeblock-conf ()
(display-line-numbers-mode -1))
(use-package org-timeblock
:straight (:host github :repo "ichernyshovvv/org-timeblock")
:commands (org-timeblock-mode)
:init
(my-leader-def "ot" #'org-timeblock)
:config
(add-hook 'org-timeblock-mode-hook #'my/org-timeblock-conf)
(general-define-key
:keymaps '(org-timeblock-mode-map)
:states '(normal visual)
"j" #'org-timeblock-forward-block
"h" #'org-timeblock-backward-column
"l" #'org-timeblock-forward-column
"k" #'org-timeblock-backward-block
"M-[" #'org-timeblock-day-earlier
"M-]" #'org-timeblock-day-later
"H" #'org-timeblock-day-earlier
"L" #'org-timeblock-day-later
"RET" #'org-timeblock-goto
"t" #'org-timeblock-todo-set
"q" #'quit-window))
#+end_src
** UI ** UI
*** LaTeX fragments *** LaTeX fragments
A function to enable LaTeX native highlighting. Not setting this as default, because it loads LaTeX stuff. A function to enable LaTeX native highlighting. Not setting this as default, because it loads LaTeX stuff.