diff --git a/config.el b/config.el index 031d823..20ebb5d 100644 --- a/config.el +++ b/config.el @@ -21,19 +21,14 @@ ;; ;; They all accept either a font-spec, font string ("Input Mono-12"), or xlfd ;; font string. You generally only need these two: -(setq doom-font (font-spec :family "Fira Mono" :size 14.0)) +(setq doom-font (font-spec :family "Fira Mono" :size 14.0) + doom-variable-pitch-font (font-spec :family "Liberation Serif" :size 16.0)) ;; There are two ways to load a theme. Both assume the theme is installed and ;; available. You can either set `doom-theme' or manually load a theme with the ;; `load-theme' function. This is the default: (setq doom-theme 'doom-solarized-light) -;; TODO: Restore session at startup -;; (add-hook 'window-setup-hook #'doom-load-session 'append) - -;; If you use `org' and don't want your org files in the default location below, -;; change `org-directory'. It must be set before org loads! - ;; https://github.com/hlissner/doom-emacs/issues/4832 ;; (after! org ;; (defun +org--restart-mode-h () @@ -47,6 +42,10 @@ ;; change `org-directory'. It must be set before org loads! (setq org-directory "~/Nextcloud/org/") +(after! org + ;; Store org links to info pages + (add-to-list 'org-modules 'ol-info)) + ;; (defun max/org-gtd--incubate () ;; "Process GTD inbox item by incubating it. ;; Allow the user apply user-defined tags from @@ -96,8 +95,8 @@ ;; (autoload #'org-pomodoro-active-p "org-pomodoro" nil t) - (map! :map evil-org-agenda-mode-map - :m "c p" #'org-agenda-set-property) + ;; (map! :map evil-org-agenda-mode-map + ;; :m "c p" #'org-agenda-set-property) ;; (defun max/skip-habits () ;; "Skip trees that are habits." @@ -227,7 +226,6 @@ (use-package! org-inline-pdf :hook (org-mode . org-inline-pdf-mode)) - (use-package! indium :hook ((js-mode typescript-mode) . indium-interaction-mode) :init @@ -235,8 +233,7 @@ :config (map! :localleader :map indium-interaction-mode-map - "I" #'indium-launch) - ) + "I" #'indium-launch)) ;; (use-package! ox-mm ;; :after org) @@ -310,6 +307,14 @@ ;; ;; (add-hook 'kill-emacs-hook 'org-caldav-sync-at-close) ;; ) +(use-package! org-roam-ui + :after org-roam + :config + (setq org-roam-ui-sync-theme t + org-roam-ui-follow t + org-roam-ui-update-on-save t + org-roam-ui-open-on-start t)) + (setq +org-roam-open-buffer-on-find-file nil) (after! org-roam @@ -363,10 +368,15 @@ citar-notes-paths `(,org-roam-directory) citar-bibliography '("~/Nextcloud/Papers/library.bib"))) -(use-package citar-org-roam +(use-package! citar-org-roam :after citar org-roam :no-require - :config (citar-org-roam-mode)) + :config + (setq citar-org-roam-subdir "reference") + (citar-org-roam-mode)) + +(use-package! nov + :mode ("\\.epub\\'" . nov-mode)) ;; Taken from: https://github.com/hlissner/doom-emacs/pull/6077 ;; (use-package! org-roam-bibtex @@ -411,6 +421,9 @@ (after! projectile (setq projectile-project-search-path '(("~/Projects" . 1)))) +(after! typescript-mode + (setq typescript-indent-level 2)) + ;; (setq ns-auto-hide-menu-bar t) ;(defun switch-to-agenda () @@ -511,6 +524,11 @@ (setq +workspaces-on-switch-project-behavior t) +(map! :leader + (:prefix "TAB" + :desc "Move workspace left" ">" #'+workspace/swap-right + :desc "Move workspace left" "<" #'+workspace/swap-left)) + (after! evil-snipe (setq evil-snipe-spillover-scope 'visible)) @@ -523,6 +541,21 @@ (advice-add #'restart-emacs--get-emacs-binary :override #'max/restart-emacs--get-emacs-binary)) +(after! yasnippet + (setq yas-triggers-in-field t)) + +(use-package! moinmoin-mode + :mode ("\\.wiki" . moinmoin-mode)) + +(use-package! centered-cursor-mode + :config + (setq ccm-recenter-at-end-of-file t) + (map! :leader :desc "Centered cursor mode" "t -" #'centered-cursor-mode)) + +(with-eval-after-load 'doom-themes + (doom-themes-neotree-config) + (setq doom-themes-neotree-enable-variable-pitch nil)) + ;; (server-start) ;; (use-package! mac-pseudo-daemon diff --git a/email.el b/email.el index a4efb61..d7783fa 100644 --- a/email.el +++ b/email.el @@ -103,6 +103,7 @@ ;; Sign sent email automatically ;; (add-hook 'message-send-hook 'mml-secure-message-sign-smime) + (require 'khalel-icalendar) ) ;; (defun max/mu4e-view-import-attachment-calendar (msg attnum) diff --git a/gtd.el b/gtd.el index 1098a0a..f67ec57 100644 --- a/gtd.el +++ b/gtd.el @@ -1,31 +1,32 @@ ;;; gtd.el -*- lexical-binding: t; -*- -(require 'org) +(after! org + (setq org-return-follows-link t + org-complete-tags-always-offer-all-agenda-tags t + org-agenda-files (mapcar 'file-truename + (file-expand-wildcards (concat org-directory "gtd/*.org")))) + ;; org-agenda-files (append (mapcar 'file-truename + ;; (file-expand-wildcards (concat org-directory "gtd/*.org"))) + ;; (list (expand-file-name (funcall #'gtd-get-current-journal) org-directory)))) + (setq org-capture-templates + `(("i" "Inbox" entry (file "gtd/inbox.org") + ,(concat "* %?\n" + ":PROPERTIES:\n:CREATED: %U\n:END:") :prepend t) + ;; ("j" "Journal" entry (file+datetree ,(funcall #'gtd-get-current-journal)) + ("j" "Journal" entry (file+datetree "gtd/journal.org") + ,(concat "* %?\n" + ":PROPERTIES:\n:CREATED: %U\n:END:")) + ("@" "Inbox [mu4e]" entry (file "gtd/inbox.org") + ;; "* Process [[mu4e:msgid:%:message-id][%:fromname - %:subject]] :email:\n%U\n")) + ,(concat "* Process %a %?\n" + ":PROPERTIES:\n:CREATED: %U\n:END:") :prepend t))) -(setq org-return-follows-link t - org-complete-tags-always-offer-all-agenda-tags t - org-agenda-files (append (mapcar 'file-truename - (file-expand-wildcards (concat org-directory "gtd/*.org"))) - (list (expand-file-name (funcall #'gtd-get-current-journal) org-directory)))) - -(setq org-capture-templates -`(("i" "Inbox" entry (file "gtd/inbox.org") - ,(concat "* %?\n" - ":PROPERTIES:\n:CREATED: %U\n:END:") :prepend t) - ("j" "Journal" entry (file+datetree ,(gtd-get-current-journal)) - ,(concat "* %?\n" - ":PROPERTIES:\n:CREATED: %U\n:END:")) - ("@" "Inbox [mu4e]" entry (file "gtd/inbox.org") - ;; "* Process [[mu4e:msgid:%:message-id][%:fromname - %:subject]] :email:\n%U\n")) - ,(concat "* Process %a %?\n" - ":PROPERTIES:\n:CREATED: %U\n:END:") :prepend t))) - -(setq org-refile-allow-creating-parent-nodes 'confirm - org-refile-target-verify-function (lambda (&rest _) (null (org-get-todo-state))) - ;; org-refile-target-verify-function nil - ;; org-refile-targets '(("tasks.org" . (:maxlevel . 2)))) - org-refile-targets '(("tasks.org" . (:maxlevel . 2)) - ("someday.org" . (:level . 0)))) + (setq org-refile-allow-creating-parent-nodes 'confirm + org-refile-target-verify-function (lambda (&rest _) (null (org-get-todo-state))) + ;; org-refile-target-verify-function nil + ;; org-refile-targets '(("tasks.org" . (:maxlevel . 2)))) + org-refile-targets '(("tasks.org" . (:maxlevel . 2)) + ("someday.org" . (:level . 0))))) (defun gtd-capture-inbox () (interactive) @@ -50,6 +51,7 @@ ;; Insert CREATED property timestamps for non-captured headlines (use-package! org-expiry + :after org :config (map! :map org-mode-map "C-c c" #'org-expiry-insert-created) @@ -57,13 +59,15 @@ ;; Automatically trigger state changes in projects (use-package! org-edna + :after org :config - (setq org-edna-use-inheritance t) - (org-edna-mode)) + (org-edna-mode) + (setq org-edna-use-inheritance t)) (use-package! org-super-agenda :after org :config + (org-super-agenda-mode) (setq org-agenda-window-setup 'current-window org-agenda-restore-windows-after-quit t org-agenda-block-separator nil @@ -77,6 +81,7 @@ ((org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline)) (org-deadline-warning-days 0))) + ;; TODO combine the two queries into one (tags "inbox" ((org-agenda-overriding-header "") (org-agenda-prefix-format " %?-14t% s") (org-super-agenda-groups @@ -84,7 +89,7 @@ :anything t))))) (alltodo "" ((org-agenda-overriding-header "") (org-agenda-prefix-format " %i %-14:c ") - (org-agenda-sorting-strategy '(category-up)) + ;; (org-agenda-sorting-strategy '(category-up)) (org-agenda-skip-function '(org-agenda-skip-entry-if 'scheduled)) (org-super-agenda-groups @@ -99,42 +104,39 @@ (:discard (:anything t))))))))))) ;; Automatically save gtd files after some actions on them -;; Taken from: https://www.labri.fr/perso/nrougier/GTD/index.html +;; Source: https://www.labri.fr/perso/nrougier/GTD/index.html (defun gtd-save-org-buffers () "Save `org-agenda-files' buffers without user confirmation. See also `org-save-all-org-buffers'" (interactive) (message "Saving org-agenda-files buffers...") (save-some-buffers t (lambda () - (when (member (buffer-file-name) org-agenda-files) - t))) + (when (member (buffer-file-name) org-agenda-files) + t))) (message "Saving org-agenda-files buffers... done")) -(advice-add 'org-refile :after (lambda (&rest _) (gtd-save-org-buffers))) -(advice-add 'org-todo :after (lambda (&rest _) (gtd-save-org-buffers))) -(advice-add 'org-add-note :after (lambda (&rest _) (gtd-save-org-buffers))) -(advice-add 'org-clock-in :after (lambda (&rest _) (gtd-save-org-buffers))) - -(map! :map 'override - "" #'gtd-agenda) +(after! org + (advice-add 'org-refile :after (lambda (&rest _) (gtd-save-org-buffers))) + (advice-add 'org-todo :after (lambda (&rest _) (gtd-save-org-buffers))) + (advice-add 'org-add-note :after (lambda (&rest _) (gtd-save-org-buffers))) + (advice-add 'org-clock-in :after (lambda (&rest _) (gtd-save-org-buffers)))) (defun gtd-agenda () (interactive) (org-agenda nil "g")) -;; (defun gtd-archive-subtree () -;; "Archive the current subtree to a yearly journal." -;; (when (not (equal "DONE" (org-get-todo-state))) -;; (org-todo "DONE")) +(map! :map 'override + "" #'gtd-agenda) -;; Archiving +;; +;;; Archiving -(defun gtd-get-current-journal () - "Returns journal file as a string for the current year." - (let ((year (number-to-string (caddr (calendar-current-date))))) - (concat "journal/" year ".org"))) +;; Store archived entries in .org_archive in a datetree +(after! org + (setq org-archive-location "%s_archive::datetree/")) -(setq org-archive-location (concat (funcall #'gtd-get-current-journal) "::datetree/")) +;; +;;; Calendar (defun max/khalel--insert-import-file-header (sdate edate) "Insert imported events file header information into current buffer. @@ -146,12 +148,7 @@ the current import date range." (insert (format "*Events scheduled between %s and %s*:\n" sdate edate))) (use-package! khalel - :commands (khalel-export-org-subtree-to-calendar - khalel-import-events - khalel-edit-calender-event - khalel-add-capture-template) - :init - (khalel-add-capture-template) + :after org :config (advice-add #'khalel--insert-import-file-header :override #'max/khalel--insert-import-file-header) (advice-add #'khalel-import-events :around #'doom-shut-up-a) @@ -160,6 +157,16 @@ the current import date range." khalel-import-start-date "-15d" khalel-import-end-date "+30d" khalel-import-org-file (expand-file-name "gtd/calendar.org" org-directory) + khalel-import-format "* {title} {cancelled} :{calendar}:\n\ +:PROPERTIES:\n:CALENDAR: {calendar}\n\ +:LOCATION: {location}\n\ +:ID: {uid}\n\ +:END:\n\ +<{start-date-long} {start-time}>--<{end-date-long} {end-time}>\n\ +{description}\n\ +[[elisp:(khalel-edit-calendar-event)][Edit this event]]\ + [[elisp:(progn (khalel-run-vdirsyncer) (khalel-import-events))]\ +[Sync and update all]]\n" khalel-import-org-file-header "#+TITLE: Calendar\n\n\ *NOTE*: this file has been generated by \ [[elisp:(khalel-import-events)][khalel-import-events]] \ @@ -173,11 +180,21 @@ to synchronize with remote calendars. Consider adding this file to your list of agenda files so that events \ show up there.\n\n")) -(setq org-clock-persist t - ;; Useful when clocking in on a waiting task - org-clock-in-switch-to-state "NEXT" - org-clock-out-when-done '("DONE" "CNCL" "WAIT") - org-clock-persist-query-resume nil) +(after! org + (khalel-add-capture-template)) + +(defun gtd-capture-event () + (interactive) + (org-capture nil "e")) + +(map! "C-c e" #'gtd-capture-event) + +(after! org + (setq org-clock-persist t + ;; Useful when clocking in on a waiting task + org-clock-in-switch-to-state "NEXT" + org-clock-out-when-done '("DONE" "CNCL" "WAIT") + org-clock-persist-query-resume nil)) (use-package! org-clock-convenience :after org diff --git a/init.el b/init.el index 2e5a0cf..b3da911 100644 --- a/init.el +++ b/init.el @@ -39,7 +39,7 @@ ;;minimap ; show a map of the code on the side modeline ; snazzy, Atom-inspired modeline, plus API ;; nav-flash ; blink the current line after jumping - ;;neotree ; a project drawer, like NERDTree for vim + neotree ; a project drawer, like NERDTree for vim ophints ; highlight the region an operation acts on (popup +defaults +all) ; tame sudden yet inevitable temporary windows ;;tabs ; an tab bar for Emacs @@ -55,7 +55,7 @@ (evil +everywhere); come to the dark side, we have cookies file-templates ; auto-snippets for empty files fold ; (nigh) universal code folding - ;;(format +onsave) ; automated prettiness + (format +onsave) ; automated prettiness ;;god ; run Emacs commands without modifier keys ;;lispy ; vim for lisp, for people who don't like vim multiple-cursors ; editing in many places at once @@ -88,15 +88,15 @@ biblio ; Writes a PhD for you (citation needed) ;;debugger ; FIXME stepping through code, to help you add bugs direnv - ;;docker + docker ;;editorconfig ; let someone else argue about tabs vs spaces ;;ein ; tame Jupyter notebooks with emacs (eval +overlay) ; run code, run (also, repls) ;;gist ; interacting with github gists lookup ; navigate your code and its documentation - ;;lsp ; M-x vscode + lsp ; M-x vscode (magit +forge) ; a git porcelain for Emacs - ;;make ; run make tasks from Emacs + make ; run make tasks from Emacs pass ; password manager for nerds pdf ; pdf enhancements ;;prodigy ; FIXME managing external services & code builders @@ -104,6 +104,7 @@ ;;taskrunner ; taskrunner for all your projects ;;terraform ; infrastructure as code ;;tmux ; an API for interacting with tmux + tree-sitter ; syntax and parsing, sitting in a tree... ;;upload ; map local to remote projects via ssh/ftp :os @@ -136,9 +137,9 @@ ;;(haskell +lsp) ; a language that's lazier than I am ;;hy ; readability of scheme w/ speed of python ;;idris ; - ;;json ; At least it ain't XML + json ; At least it ain't XML (java +meghanada) ; the poster child for carpal tunnel syndrome - (javascript +lsp) ; all(hope(abandon(ye(who(enter(here)))))) + (javascript +lsp +tree-sitter) ; all(hope(abandon(ye(who(enter(here)))))) ;;julia ; a better, faster MATLAB ;;kotlin ; a better, slicker Java(Script) (latex +latexmk) ; writing papers in Emacs has never been so fun @@ -149,11 +150,11 @@ ;;nim ; python + lisp at the speed of c nix ; I hereby declare "nix geht mehr!" ;;ocaml ; an objective camel - (org +noter +roam2 +dragndrop +pomodoro) ; organize your plain life in plain text + (org +noter +journal +roam2 +dragndrop +pomodoro) ; organize your plain life in plain text ;;php ; perl's insecure younger brother ;;plantuml ; diagrams for confusing people more ;;purescript ; javascript, but functional - ;;python ; beautiful is better than ugly + (python +lsp +poetry) ; beautiful is better than ugly ;;qt ; the 'cutest' gui framework ever ;;racket ; a DSL for DSLs ;;raku ; the artist formerly known as perl6 @@ -168,8 +169,8 @@ ;;solidity ; do you need a blockchain? No. ;;swift ; who asked for emoji variables? ;;terra ; Earth and Moon in alignment for performance. - ;;web ; the tubes - ;;yaml ; JSON, but readable + web ; the tubes + yaml ; JSON, but readable ;;zig ; C, but simpler :email diff --git a/packages.el b/packages.el index da2642c..6a3dd57 100644 --- a/packages.el +++ b/packages.el @@ -50,10 +50,10 @@ ;; our package manager can't deal with; see raxod502/straight.el#279) ;(package! builtin-package :recipe (:branch "develop")) -(package! org-inline-pdf :pin "b2dfbf41efac55edacde8a8a6bd0275418de6454") -(package! org-clock-convenience :pin "efc9773a8dedf834cf4a78fb6f5f8fffe55ef8eb") -(package! org-roam-bibtex :pin "3ac2445f431bc39aa0ca5abfc80e28c0c06f0738") -;; (package! org-super-agenda) +(package! org-inline-pdf) +(package! org-clock-convenience) +;; (package! org-roam-bibtex :pin "3ac2445f431bc39aa0ca5abfc80e28c0c06f0738") +(package! org-super-agenda) ;; (package! mu4e-alert) ;; (package! clip2org) (package! centered-cursor-mode) @@ -65,9 +65,17 @@ ;; (package! mac-pseudo-daemon) ;; (package! nix-docbook-mode) (package! base16-theme) -(package! citar-org-roam - :recipe (:host github :repo "emacs-citar/citar-org-roam")) +(package! citar-org-roam) +;; (package! citar-org-roam +;; :recipe (:host github :repo "emacs-citar/citar-org-roam")) (package! pdf-tools :built-in 'prefer) -(package! org-gtd) +(package! nov) +;; (package! org-gtd) (package! khalel) +(package! jl-encrypt + :recipe (:host gitlab :repo "lechten/defaultencrypt")) ;; (package! weblorg) + +;; org-roam-ui keeps up with the latest features in org-roam +(unpin! org-roam) +(package! org-roam-ui) diff --git a/snippets/mu4e-compose-mode/mfg b/snippets/mu4e-compose-mode/mfg index 5d6868f..856ec64 100644 --- a/snippets/mu4e-compose-mode/mfg +++ b/snippets/mu4e-compose-mode/mfg @@ -1,6 +1,6 @@ # -*- mode: snippet -*- -# name: Liele Grüße -# key: lg, +# name: Mit freundlichen Grüßen +# key: mfg, # -- Mit freundlichen Grüßen, -Max Schlüter +Max Schlüter \ No newline at end of file