diff options
| author | Mountain Man <43313373+MountainMan1312@users.noreply.github.com> | 2023-05-12 23:37:53 -0400 |
|---|---|---|
| committer | Mountain Man <43313373+MountainMan1312@users.noreply.github.com> | 2023-05-12 23:37:53 -0400 |
| commit | afdc9cf3d7963d971921546168a545e620daec33 (patch) | |
| tree | c8d9547701b2c0cf7aec69824988f8d22f70b8a5 | |
| parent | Modify .gitignore (diff) | |
| download | mmosmacs-afdc9cf3d7963d971921546168a545e620daec33.tar.gz mmosmacs-afdc9cf3d7963d971921546168a545e620daec33.tar.bz2 mmosmacs-afdc9cf3d7963d971921546168a545e620daec33.zip | |
Bulk org/org-roam PKMS overhaul
This is a large set of changes to PKMS functionality in general.
It was necessary to develop the whole thing as a unit like this, but I
do not have the energy to refactor all this crap into separate atomic
commit. Whoever finds this will just have to deal with it. I am sorry.
| -rw-r--r-- | init.el | 246 |
1 files changed, 225 insertions, 21 deletions
| @@ -116,6 +116,8 @@ | |||
| 116 | 116 | ||
| 117 | (load-theme 'jazz t) | 117 | (load-theme 'jazz t) |
| 118 | 118 | ||
| 119 | (set-background-color "black") | ||
| 120 | |||
| 119 | 121 | ||
| 120 | ;; --------------------------------- | 122 | ;; --------------------------------- |
| 121 | ;; Fonts | 123 | ;; Fonts |
| @@ -125,7 +127,8 @@ | |||
| 125 | 127 | ||
| 126 | (set-face-attribute 'default nil :font "Iosevka" :height 120) | 128 | (set-face-attribute 'default nil :font "Iosevka" :height 120) |
| 127 | (set-face-attribute 'fixed-pitch nil :font "Iosevka" :height 120) | 129 | (set-face-attribute 'fixed-pitch nil :font "Iosevka" :height 120) |
| 128 | (set-face-attribute 'variable-pitch nil :font "DejaVu Sans" :height 120 :weight 'regular) | 130 | ;;(set-face-attribute 'variable-pitch nil :font "Exo" :height 120 :weight 'regular) |
| 131 | (set-face-attribute 'variable-pitch nil :font "-UKWN-Exo 2-normal-normal-normal-*-*-*-*-*-*-0-iso10646-1" :height 120) | ||
| 129 | 132 | ||
| 130 | 133 | ||
| 131 | 134 | ||
| @@ -229,7 +232,8 @@ | |||
| 229 | (global-display-line-numbers-mode t) | 232 | (global-display-line-numbers-mode t) |
| 230 | 233 | ||
| 231 | ;; Disable line numbers in specific modes | 234 | ;; Disable line numbers in specific modes |
| 232 | (dolist (mode '(org-mode-hook)) | 235 | (dolist (mode '(org-mode-hook |
| 236 | org-agenda-mode-hook)) | ||
| 233 | (add-hook mode (lambda () (display-line-numbers-mode 0)))) | 237 | (add-hook mode (lambda () (display-line-numbers-mode 0)))) |
| 234 | 238 | ||
| 235 | 239 | ||
| @@ -370,7 +374,9 @@ | |||
| 370 | ;; -------------------------------------------- | 374 | ;; -------------------------------------------- |
| 371 | ;; Using `org', `org-roam', and a note-hierarchy I've developed over | 375 | ;; Using `org', `org-roam', and a note-hierarchy I've developed over |
| 372 | ;; several years of trial-and-error, I keep all my notes in a logical | 376 | ;; several years of trial-and-error, I keep all my notes in a logical |
| 373 | ;; organized collection. | 377 | ;; organized collection. I feel this knowledgebase system can handle |
| 378 | ;; almost any bit of information I can throw at it, and it is flexible | ||
| 379 | ;; enough to adapt when I find new things it can't handle. | ||
| 374 | ;; --------------------------------------------------------------------- | 380 | ;; --------------------------------------------------------------------- |
| 375 | 381 | ||
| 376 | ;; --------------------------------- | 382 | ;; --------------------------------- |
| @@ -385,7 +391,6 @@ | |||
| 385 | ;; is opened. | 391 | ;; is opened. |
| 386 | (defun mm/org-mode-setup () | 392 | (defun mm/org-mode-setup () |
| 387 | (org-indent-mode) | 393 | (org-indent-mode) |
| 388 | (auto-fill-mode) | ||
| 389 | (visual-line-mode) | 394 | (visual-line-mode) |
| 390 | (variable-pitch-mode)) | 395 | (variable-pitch-mode)) |
| 391 | 396 | ||
| @@ -396,32 +401,37 @@ | |||
| 396 | (font-lock-add-keywords 'org-mode | 401 | (font-lock-add-keywords 'org-mode |
| 397 | '(("^ *\\([-]\\) " | 402 | '(("^ *\\([-]\\) " |
| 398 | (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•")))))) | 403 | (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•")))))) |
| 399 | 404 | ;; Set font sizes | |
| 400 | ;; Set font size per heading level | 405 | (dolist (face '((org-level-1 . 1.5) |
| 401 | (dolist (face '((org-level-1 . 1.7) | 406 | (org-level-2 . 1.4) |
| 402 | (org-level-2 . 1.5) | ||
| 403 | (org-level-3 . 1.3) | 407 | (org-level-3 . 1.3) |
| 404 | (org-level-4 . 1.1) | 408 | (org-level-4 . 1.2) |
| 405 | (org-level-5 . 1.1) | 409 | (org-level-5 . 1.1) |
| 406 | (org-level-6 . 1.1) | 410 | (org-level-6 . 1.1) |
| 407 | (org-level-7 . 1.1) | 411 | (org-level-7 . 1.1) |
| 408 | (org-level-8 . 1.1))) | 412 | (org-level-8 . 1.1))) |
| 409 | (set-face-attribute (car face) nil :font "DejaVu Sans" :weight 'regular :height (cdr face))) | 413 | (set-face-attribute (car face) nil |
| 410 | 414 | :font "-UKWN-Exo 2-normal-normal-normal-*-*-*-*-*-*-0-iso10646-1" | |
| 411 | 415 | :weight 'regular | |
| 416 | :height (cdr face)) | ||
| 412 | ;; Ensure anything that should be | 417 | ;; Ensure anything that should be |
| 413 | ;; fixed-pitch actually is. | 418 | ;; fixed-pitch actually is. |
| 414 | (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch) | 419 | (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch) |
| 415 | (set-face-attribute 'org-table nil :inherit 'fixed-pitch) | 420 | (set-face-attribute 'org-table nil :inherit 'fixed-pitch) |
| 416 | (set-face-attribute 'org-formula nil :inherit 'fixed-pitch) | 421 | (set-face-attribute 'org-formula nil :inherit 'fixed-pitch) |
| 417 | (set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch)) | 422 | (set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch)) |
| 418 | (set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch)) | 423 | (set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch)) |
| 419 | (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch)) | 424 | (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch)) |
| 420 | (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch)) | 425 | (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch)) |
| 421 | (set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch)) | 426 | (set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch)) |
| 422 | (set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch) | 427 | (set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch) |
| 423 | (set-face-attribute 'line-number nil :inherit 'fixed-pitch) | 428 | (set-face-attribute 'org-time-grid nil :inherit 'fixed-pitch) |
| 424 | (set-face-attribute 'line-number-current-line nil :inherit 'fixed-pitch)) | 429 | (set-face-attribute 'org-scheduled nil :inherit 'fixed-pitch) |
| 430 | (set-face-attribute 'org-agenda-structure nil :inherit 'fixed-pitch) | ||
| 431 | (set-face-attribute 'org-agenda-date nil :inherit 'fixed-pitch) | ||
| 432 | (set-face-attribute 'org-agenda-date-today nil :inherit 'fixed-pitch) | ||
| 433 | (set-face-attribute 'org-agenda-current-time nil :inherit 'fixed-pitch) | ||
| 434 | (set-face-attribute 'org-agenda-calendar-event nil :inherit 'fixed-pitch))) | ||
| 425 | 435 | ||
| 426 | 436 | ||
| 427 | ;; `org' configuration | 437 | ;; `org' configuration |
| @@ -429,11 +439,15 @@ | |||
| 429 | :straight t | 439 | :straight t |
| 430 | :hook (org-mode . mm/org-mode-setup) | 440 | :hook (org-mode . mm/org-mode-setup) |
| 431 | :config | 441 | :config |
| 442 | (mm/org-font-setup) | ||
| 432 | (setq org-ellipsis " ►" | 443 | (setq org-ellipsis " ►" |
| 433 | org-hide-leading-stars t | 444 | org-hide-leading-stars t |
| 434 | org-adapt-indentation t | 445 | org-adapt-indentation t |
| 435 | org-support-shift-select 'always) | 446 | org-support-shift-select 'always |
| 436 | (mm/org-font-setup)) | 447 | org-return-follows-link t) |
| 448 | (advice-add 'org-refile :after 'org-save-all-org-buffers) | ||
| 449 | :bind | ||
| 450 | ("C-c t l" . org-toggle-link-display)) | ||
| 437 | 451 | ||
| 438 | 452 | ||
| 439 | ;; Make org heading bullets look nicer | 453 | ;; Make org heading bullets look nicer |
| @@ -444,6 +458,196 @@ | |||
| 444 | (org-bullets-bullet-list '("•"))) | 458 | (org-bullets-bullet-list '("•"))) |
| 445 | 459 | ||
| 446 | 460 | ||
| 461 | ;; Auto-show emphasis markers on hover | ||
| 462 | (use-package org-appear | ||
| 463 | :straight t | ||
| 464 | :hook (org-mode . org-appear-mode) | ||
| 465 | :config | ||
| 466 | (setq org-hide-emphasis-markers t | ||
| 467 | org-appear-autolinks t | ||
| 468 | org-appear-autosubmarkers t)) | ||
| 469 | |||
| 470 | |||
| 471 | ;; Show link hints to make following links easier | ||
| 472 | (use-package link-hint | ||
| 473 | :straight t | ||
| 474 | :bind | ||
| 475 | ("C-c l o" . link-hint-open-link) | ||
| 476 | ("C-c l c" . link-hint-copy-link)) | ||
| 477 | |||
| 478 | |||
| 479 | ;; --------------------------------- | ||
| 480 | ;; `org-roam' | ||
| 481 | ;; ---------- | ||
| 482 | ;; Org roam adds a ton of PKMS | ||
| 483 | ;; functionality to org. | ||
| 484 | ;; --------------------------------- | ||
| 485 | |||
| 486 | ;; Define function to insert a link to a node without opening it | ||
| 487 | (defun mm/org-roam-node-insert-immediate (arg &rest args) | ||
| 488 | "This version of `org-roam-node-insert' inserts a node without opening it." | ||
| 489 | (interactive "P") | ||
| 490 | (let ((args (cons arg args)) | ||
| 491 | (org-roam-capture-templates (list (append (car org-roam-capture-templates) | ||
| 492 | '(:immediate-finish))))) | ||
| 493 | (apply #'org-roam-node-insert args))) | ||
| 494 | |||
| 495 | |||
| 496 | ;; Add Dendron-like note refactoring functionality | ||
| 497 | ;; This was taken from https://github.com/vicrdguez/dendroam | ||
| 498 | (cl-defmethod mm/org-roam-node-current-file (node) | ||
| 499 | (file-name-base (org-roam-node-file node))) | ||
| 500 | |||
| 501 | (cl-defmethod mm/org-roam-node-hierarchy-title (node) | ||
| 502 | (capitalize (car (last (split-string (org-roam-node-title node) | ||
| 503 | "\\."))))) | ||
| 504 | |||
| 505 | (defun mm/org-roam-refactor-file () | ||
| 506 | (interactive) | ||
| 507 | (let* ((initial-file (buffer-file-name)) | ||
| 508 | (initial-slug (file-name-base initial-file)) | ||
| 509 | (new-slug (read-string "Refactor: " initial-slug)) | ||
| 510 | (new-file (concat | ||
| 511 | (expand-file-name new-slug org-roam-directory) | ||
| 512 | ".org"))) | ||
| 513 | (rename-file initial-file new-file) | ||
| 514 | (kill-current-buffer) | ||
| 515 | (find-file new-file))) | ||
| 516 | |||
| 517 | (cl-defmethod mm/org-roam-node-hierarchy (node) | ||
| 518 | (funcall 'mm/org-roam-format-hierarchy (org-roam-node-file node))) | ||
| 519 | |||
| 520 | (cl-defmethod mm/org-roam-node-current-file (node) | ||
| 521 | (file-name-base (buffer-file-name))) | ||
| 522 | |||
| 523 | (defun mm/org-roam-get-same-hierarchy-files (hierarchy) | ||
| 524 | "Gets all the nodes that share the same HIERARCHY totally or partially" | ||
| 525 | (let ((files (mapcar #'car (org-roam-db-query [:select [file] | ||
| 526 | :from nodes | ||
| 527 | :where (like file $r1)] | ||
| 528 | (concat "%" hierarchy "%"))))) files)) | ||
| 529 | |||
| 530 | (defun mm/org-roam-refactor-hierarchy (&optional current) | ||
| 531 | (interactive) | ||
| 532 | (let* | ||
| 533 | ((initial-file (file-name-nondirectory (buffer-file-name))) | ||
| 534 | (initial-slug (file-name-base initial-file)) | ||
| 535 | (new-slug (file-name-base (read-string "Refactor: " initial-slug))) | ||
| 536 | (initial-slug-no-title | ||
| 537 | (file-name-base initial-slug)) | ||
| 538 | (files-to-upd (if current `(,initial-file) | ||
| 539 | (mm/org-roam-get-same-hierarchy-files | ||
| 540 | initial-slug-no-title)))) | ||
| 541 | (dolist (file files-to-upd) | ||
| 542 | (let ((new-file | ||
| 543 | (replace-regexp-in-string initial-slug-no-title new-slug file))) | ||
| 544 | (rename-file file new-file) | ||
| 545 | (if (equal buffer-file-name file) | ||
| 546 | (progn | ||
| 547 | (kill-current-buffer) | ||
| 548 | (find-file new-file))))))) | ||
| 549 | |||
| 550 | |||
| 551 | ;; `org-roam' configuration | ||
| 552 | (use-package org-roam | ||
| 553 | :straight t | ||
| 554 | :custom | ||
| 555 | (org-roam-directory (file-truename "~/kb")) | ||
| 556 | (make-directory org-roam-directory 'parents) | ||
| 557 | (org-roam-db-location (concat org-roam-directory "/org-roam.db")) | ||
| 558 | (org-roam-capture-templates | ||
| 559 | '(("d" "default" plain "%?" | ||
| 560 | :unnarrowed t | ||
| 561 | :if-new (file+head "${title}.org" | ||
| 562 | "#+TITLE:")))) | ||
| 563 | (org-roam-dailies-capture-templates | ||
| 564 | '(("d" "default" plain "%?" | ||
| 565 | :unnarrowed t | ||
| 566 | :if-new (file+head "daily.%<%Y.%m.%d>.org" | ||
| 567 | "#+TITLE: Daily Log for %<%Y-%m-%d>\n")))) | ||
| 568 | (org-roam-complete-everywhere t) | ||
| 569 | :config | ||
| 570 | (org-roam-setup) | ||
| 571 | (org-roam-db-autosync-mode) | ||
| 572 | (require 'org-roam-dailies) | ||
| 573 | (setq org-roam-dailies-directory "") | ||
| 574 | :bind (("C-c n f" . org-roam-node-find) | ||
| 575 | ("C-c n c" . org-roam-capture) | ||
| 576 | ("C-c n d t" . org-roam-dailies-goto-today) | ||
| 577 | ("C-c n d y" . org-roam-dailies-goto-yesterday) | ||
| 578 | ("C-c n i" . mm/org-roam-node-insert-immediate) | ||
| 579 | ("C-c n I" . org-roam-node-insert) | ||
| 580 | ("C-c n u" . org-roam-update-org-id-locations) | ||
| 581 | ("C-c n r h" . mm/org-roam-refactor-hierarchy) | ||
| 582 | ("C-c n r f" . mm/org-roam-refactor-file))) | ||
| 583 | |||
| 584 | |||
| 585 | ;; --------------------------------- | ||
| 586 | ;; Task / Time Management | ||
| 587 | ;; ---------------------- | ||
| 588 | ;; I track everything in org. It | ||
| 589 | ;; makes it easier to remember | ||
| 590 | ;; things, which is handy because I | ||
| 591 | ;; am quite forgetful. | ||
| 592 | ;; --------------------------------- | ||
| 593 | |||
| 594 | ;; Agenda configuration | ||
| 595 | (use-package org | ||
| 596 | :config | ||
| 597 | (setq org-agenda-start-with-log-mode t | ||
| 598 | org-agenda-files '("~/kb/agenda.org") | ||
| 599 | org-todo-keywords'((sequence "TODO(t)" "IN-PROGRESS(i)" "WAITING(w)" "HOLD(h)" "REVIEW(re)" "|" "DONE(d)" "CANCELED(c)") | ||
| 600 | (sequence "EVENT(e)" "|" "MISSED_EVENT(me)" "ATTENDED_EVENT(ae)") | ||
| 601 | (sequence "APPT(ap)" "|" "MISSED_APPT(ma)" "ATTENDED_APPT(aa)") | ||
| 602 | (sequence "REMINDER(rm)")) | ||
| 603 | org-agenda-span 7 | ||
| 604 | org-agenda-start-day "0d" | ||
| 605 | org-agenda-start-on-weekday nil | ||
| 606 | org-agenda-use-time-grid t | ||
| 607 | org-agenda-time-grid (quote ((daily today remove-match) | ||
| 608 | (0 100 200 300 400 500 600 700 800 900 | ||
| 609 | 1000 1100 1200 1300 1400 1500 1600 | ||
| 610 | 1700 1800 1900 2000 2100 2200 2300) | ||
| 611 | "......." ".")) | ||
| 612 | org-agenda-include-diary t | ||
| 613 | org-agenda-show-future-repeats nil | ||
| 614 | org-agenda-repeating-timestamp-show-all nil | ||
| 615 | org-agenda-skip-scheduled-if-done t | ||
| 616 | org-agenda-skip-deadline-if-done t | ||
| 617 | org-agenda-show-done-always-green nil | ||
| 618 | org-agenda-compact-blocks t | ||
| 619 | org-log-done 'time | ||
| 620 | org-log-into-drawer t) | ||
| 621 | (require 'org-habit) | ||
| 622 | (add-to-list 'org-modules 'org-habit) | ||
| 623 | (setq org-habit-show-habits t | ||
| 624 | org-habit-show-habits-only-for-today nil | ||
| 625 | org-habit-show-all-today nil | ||
| 626 | org-habit-graph-column 60 | ||
| 627 | org-habit-following-days 1 | ||
| 628 | org-habit-preceding-days 21) | ||
| 629 | :bind (("C-c a" . org-agenda-list))) | ||
| 630 | |||
| 631 | |||
| 632 | ;; Update agenda periodically every `mm/refresh-agenda-time-seconds' seconds. | ||
| 633 | ;; This was taken from https://emacs.stackexchange.com/a/68767/38877 | ||
| 634 | (defvar mm/refresh-agenda-time-seconds 15) | ||
| 635 | (defvar mm/refresh-agenda-timer nil | ||
| 636 | "Timer for `mm/refresh-agenda-timer-function' to reschedule itself, or NIL") | ||
| 637 | (defun mm/refresh-agenda-timer-function () | ||
| 638 | "If the user types a command while `mm/refresh-agenda-timer' is active, the next time this function is called from it's main idle timer, deactivate `mm/refresh-agenda-timer'." | ||
| 639 | (when mm/refresh-agenda-timer | ||
| 640 | (cancel-timer mm/refresh-agenda-timer)) | ||
| 641 | ;;(lambda () (save-window-excursion (org-agenda nil "a"))) | ||
| 642 | (save-window-excursion (org-agenda nil "a")) | ||
| 643 | (setq mm/refresh-agenda-timer | ||
| 644 | (run-with-idle-timer | ||
| 645 | (time-add (current-idle-time) mm/refresh-agenda-time-seconds) | ||
| 646 | nil | ||
| 647 | 'mm/refresh-agenda-timer-function))) | ||
| 648 | (run-with-idle-timer mm/refresh-agenda-time-seconds t 'mm/refresh-agenda-timer-function) | ||
| 649 | |||
| 650 | |||
| 447 | 651 | ||
| 448 | 652 | ||
| 449 | ;; --------------------------------------------------------------------- | 653 | ;; --------------------------------------------------------------------- |