2024-06-06 01:26:00 +02:00
#+Title : Phil's Doom Emacs Config
2023-09-21 02:46:05 +02:00
#+STARTUP : indent
2023-08-12 17:25:26 +02:00
* Intro
This is my personal [[https://github.com/doomemacs/doomemacs ][Doom Emacs ]] config. The important bit is that I have some additional keybinds. This file is a catch-all for all the files in $DOOMDIR - you can use ~org-babel-tangle~ to tangle them into their respective files.
Some of the comments are from the default config.el file that ships with Doom Emacs.
You can extract all the source/ config files from here by running Emacs and hitting ~C-c C-v t~ .
2023-09-21 02:46:05 +02:00
A lot of these are swiped from [[https://gitlab.com/dwt1/configuring-emacs/ ][DT's Configuring Emacs config files ]], as well as [[https://github.com/novoid/dot-emacs ][Karl Voit's Emacs config. ]]
2023-08-22 13:06:03 +02:00
2023-08-12 17:25:26 +02:00
* config.el
2023-09-21 02:46:05 +02:00
** Basic settings
*** Author/ personal info
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle config.el
(setq user-full-name "Phil Bajsicki")
2023-09-21 02:46:05 +02:00
#+end_src
*** Global settings
#+begin_src emacs-lisp :tangle config.el
2023-12-20 03:08:40 +01:00
;; must be set before `org` is loaded
(setq org-directory "~/enc/org/ ")
(setq org-agenda-files (directory-files-recursively "~/enc/org/ " ".org$"))
2023-08-12 17:25:26 +02:00
(setq global-auto-revert-mode t)
(setq auth-sources '("~/.authinfo"))
2023-09-21 02:46:05 +02:00
(setq-default backup-inhibited t)
(setq locale-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-clipboard-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
2023-12-20 03:08:40 +01:00
(setq-default indent-tabs-mode t)
2023-09-21 02:46:05 +02:00
#+END_SRC
2023-12-20 03:08:40 +01:00
#+RESULTS :
: t
2023-10-15 22:16:55 +02:00
*** Langtool
2023-10-15 23:24:24 +02:00
Note that for this functionality you do need some resources, namely:
- some kind of Java runtime (OpenJRE for instance)
- [[https://languagetool.org/ ][LanguageTool ]]
This command only sets up the path to your java runtime binary.
2023-10-15 22:16:55 +02:00
#+begin_src emacs-lisp :tangle config.el
(setq langtool-java-bin "/usr/bin/java")
#+end_src
#+RESULTS :
: /usr/bin/java
2023-09-21 02:46:05 +02:00
*** Theming and prettifying
#+begin_src emacs-lisp :tangle config.el
2023-08-12 17:25:26 +02:00
(after! counsel
(setq counsel-outline-display-style 'title))
2023-09-21 02:46:05 +02:00
#+end_src
**** Doom Theme
#+begin_src emacs-lisp :tangle config.el
(load-theme 'doom-one t)
(doom-themes-neotree-config)
(doom-themes-org-config)
#+end_src
**** Fonts
#+begin_src emacs-lisp :tangle config.el
2024-06-06 01:26:00 +02:00
(setq doom-themes-enable-bold t
doom-themes-enable-italic t
doom-font (font-spec :family "Iosevka" :size 14)
doom-big-font (font-spec :family "Iosevka" :size 16)
;; doom-variable-pitch-font (font-spec :family "Iosevka" :size 14)
doom-unicode-font (font-spec :family "Iosevka"))
;; doom-serif-font (font-spec :family "IBM Plex Mono" :size 10 :weight 'light))
;; (set-face-attribute 'default nil :family "Iosevka")
;; (set-face-attribute 'variable-pitch nil :family "Iosevka Aile")
;; (set-face-attribute 'org-modern-symbol nil :family "Iosevka")
2023-09-21 02:46:05 +02:00
#+end_src
2023-08-22 13:06:03 +02:00
2023-09-21 02:46:05 +02:00
#+RESULTS :
2024-06-06 01:26:00 +02:00
: #<font-spec nil nil Iosevka nil nil nil nil nil nil nil nil nil nil >
2023-09-21 02:46:05 +02:00
**** Font Family List
2023-10-15 22:16:55 +02:00
This is a simple command that outputs the fonts you have available in Emacs.
2024-06-06 01:26:00 +02:00
#+begin_src emacs-lisp :results value format: pp :tangle no
2023-09-21 02:46:05 +02:00
(print (font-family-list))
#+end_src
2023-08-22 13:06:03 +02:00
2023-10-15 22:16:55 +02:00
**** Ligature.el
#+begin_src emacs-lisp :tangle config.el
(ligature-set-ligatures 't '("www"))
;; Enable traditional ligature support in eww-mode, if the
;; `variable-pitch' face supports it
(ligature-set-ligatures 'eww-mode '("ff" "fi" "ffi"))
;; Enable all Cascadia Code ligatures in programming modes
(ligature-set-ligatures 'org-mode '("|||>" "<|||" "<== >" "<!--" "####" "~~ >" "***" "||=" "||>"
":::" "::=" "= :=" "= ==" "= =>" "= !=" "= >>" "=<<" "= /=" "!= ="
"!!." ">=>" ">>= " ">>>" ">>-" ">->" "->>" "-->" "---" "-<<"
"<~~" "<~ >" "<* >" "<||" "<| >" "<$ >" "<==" "<= >" "<=<" "<- >"
"<--" "<-<" "<<=" "<<-" "<<<" "<+ >" "</ >" "###" "#_(" "..<"
"..." "+++" "/==" "/ //" "_|_ " "www" "&&" "^=" "~~" "~@" "~= "
"~>" "~ -" "**" "* >" "*/" "||" "|}" "|]" "|=" "|>" "|-" "{|"
"[|" "]#" "::" ":=" ":>" ":<" "$>" "= =" "= >" "!=" "!!" ">:"
">=" ">>" ">-" "-~" "-|" "->" "--" "-<" "<~ " "<*" "<|" "<:"
"<$" "<=" "<>" "<-" "<<" "<+" "</" "#{" "#[" "#:" "#= " "#!"
"##" "#(" "#?" "#_" "%%" ".=" ".-" ".." ".?" "+>" "+ +" "?:"
"?=" "?." "??" ";;" "/*" "/= " "/>" "/ /" "__" "~~" "(*" "* )"
"\\\\" "://"))
;; Enables ligature checks globally in all buffers. You can also do it
;; per mode with `ligature-mode'.
(global-ligature-mode t)
#+end_src
2023-08-22 13:06:03 +02:00
2023-09-21 02:46:05 +02:00
**** Transparency
#+begin_src emacs-lisp :tangle config.el
2023-10-15 22:16:55 +02:00
(set-frame-parameter nil 'alpha-background 85)
(add-to-list 'default-frame-alist '(alpha-background . 85))
2023-09-21 02:46:05 +02:00
#+end_src
**** Helpers for text editing
#+begin_src emacs-lisp :tangle config.el
2023-08-12 17:25:26 +02:00
(setq display-line-numbers-type 'relative)
(setq next-screen-context-lines 4)
2023-09-21 02:46:05 +02:00
(setq-default global-visual-line-mode t)
(setq x-stretch-cursor t)
(setq column-number-mode t)
#+end_src
*** set start of week to Monday (not sunday) http://sunsite.univie.ac.at/textbooks/emacs/emacs_33.html
2024-06-06 01:26:00 +02:00
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-09-21 02:46:05 +02:00
(setq-default calendar-week-start-day 1)
#+END_SRC
** Global Keybinds
Setting this here because I experiment with these occasionally and want them reset properly eaach time.
2023-08-13 17:12:50 +02:00
2023-09-21 02:46:05 +02:00
#+begin_src emacs-lisp :tangle config.el
(global-set-key "\C-g" 'keyboard-quit)
(global-set-key "\C-cu" 'browse-url-chrome)
2023-08-12 17:25:26 +02:00
#+end_src
2023-12-20 03:08:40 +01:00
** Package settings
*** Straight
#+begin_src emacs-lisp :tangle config.el
(setq straight-repository-branch "develop")
#+end_src
2024-06-06 01:26:00 +02:00
*** [disabled] copilot.el
#+begin_src emacs-lisp :tangle no
;; accept completion from copilot and fallback to company
(use-package! copilot
:hook (prog-mode . copilot-mode)
:bind (:map copilot-completion-map
("<tab >" . 'copilot-accept-completion)
("TAB" . 'copilot-accept-completion)
("C-TAB" . 'copilot-accept-completion-by-word)
("C-<tab >" . 'copilot-accept-completion-by-word)))
#+end_src
2023-12-20 03:08:40 +01:00
*** pdf-tools
#+begin_src emacs-lisp :tangle config.el
(use-package! pdf-tools
:defer t
:commands (pdf-loader-install)
:mode "\\.pdf\\'"
:bind (:map pdf-view-mode-map
("n" . pdf-view-next-line-or-next-page)
("p" . pdf-view-previous-line-or-previous-page)
("C-=" . pdf-view-enlarge)
("C--" . pdf-view-shrink))
:init (pdf-loader-install)
:config (add-to-list 'revert-without-query ".pdf"))
(add-hook 'pdf-view-mode-hook #'(lambda () (interactive (display-line-numbers-mode))))
#+end_src
2023-09-21 02:46:05 +02:00
#+RESULTS :
2023-12-20 03:08:40 +01:00
| doom--setq-evil-normal-state-cursor-for-pdf-view-mode-h | (lambda nil (interactive (display-line-numbers-mode))) | pdf-tools-enable-minor-modes |
2023-09-21 02:46:05 +02:00
2023-12-20 03:08:40 +01:00
*** emojify-mode
#+begin_src emacs-lisp :tangle no
(global-emojify-mode)
(global-emojify-mode-line-mode)
#+end_src
2023-08-12 17:25:26 +02:00
2023-12-20 03:08:40 +01:00
*** org-mode
2023-08-12 17:25:26 +02:00
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!
Make .org file automatically open in org-mode.
2023-12-20 03:08:40 +01:00
**** org
2024-06-06 01:26:00 +02:00
2023-12-20 03:08:40 +01:00
***** Basic settings
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle config.el
2023-12-20 03:08:40 +01:00
(add-to-list 'auto-mode-alist
'("\\.org\\'" . org-mode))
(setq org-image-actual-width nil)
(setq org-enforce-todo-dependencies t)
(setq org-reverse-note-order nil)
(setq org-deadline-warning-days 7)
(setq org-blank-before-new-entry (quote ((heading . t)
(plain-list-item . nil))))
2024-06-06 01:26:00 +02:00
(setq org-num-mode t)
2023-09-21 02:46:05 +02:00
(setq org-todo-repeat-to-state "LOOP")
(setq org-remove-highlights-with-change nil)
2024-06-06 01:26:00 +02:00
(setq org-read-date-prefer-future t)
2023-09-21 02:46:05 +02:00
(setq org-special-ctrl-a/e t)
(setq org-special-ctrl-k t)
(setq org-yank-adjusted-subtrees t)
2024-06-06 01:26:00 +02:00
(setq org-M-RET-may-split-line (quote (default . t)))
2023-09-21 02:46:05 +02:00
(setq org-log-done (quote time))
(setq org-log-into-drawer t)
(setq org-catch-invisible-edits "smart")
(setq org-use-property-inheritance nil)
2023-10-15 22:16:55 +02:00
(setq org-duration-format 'h:mm)
2023-09-21 02:46:05 +02:00
(setq org-hierarchical-todo-statistics t)
#+end_src
2023-08-22 13:06:03 +02:00
2023-12-20 03:08:40 +01:00
#+RESULTS :
: t
***** my-org-tree-to-indirect-buffer
2023-09-21 02:46:05 +02:00
#+begin_quote
This beautiful piece of code was done by [[https://www.reddit.com/user/github-alphapapa ][alphapapa ]] and published on
[[https://www.reddit.com/r/orgmode/comments/dbsngi/finally_solving_the_lack_of_a_treeview_navigation/f26qpzr/ ][reddit ]]. Its purpose is to provide more than one indirect buffer when
using =org-tree-to-indirect-buffer()= (via ~C-c C-x b~ ). Further more,
it has a different way of naming these buffers.
Using an advice, the original function gets overwritten.
#+end_quote
--Karl Voit
2023-12-20 03:08:40 +01:00
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-09-21 02:46:05 +02:00
(defun my-org-tree-to-indirect-buffer (&optional arg)
"Create indirect buffer and narrow it to current subtree.
The buffer is named after the subtree heading, with the filename
appended. If a buffer by that name already exists, it is
selected instead of creating a new buffer."
(interactive "P")
(let* ((new-buffer-p)
(pos (point))
(buffer-name (let* ((heading (org-get-heading t t))
(level (org-outline-level))
(face (intern (concat "outline-" (number-to-string level))))
(heading-string (propertize (org-link-display-format heading)
'face face)))
(concat heading-string "::" (buffer-name))))
(new-buffer (or (get-buffer buffer-name)
(prog1 (condition-case nil
(make-indirect-buffer (current-buffer) buffer-name 'clone)
(error (make-indirect-buffer (current-buffer) buffer-name)))
(setq new-buffer-p t)))))
(switch-to-buffer new-buffer)
(when new-buffer-p
;; I don't understand why setting the point again is necessary, but it is.
(goto-char pos)
(rename-buffer buffer-name)
(org-narrow-to-subtree))))
(advice-add 'org-tree-to-indirect-buffer :override 'my-org-tree-to-indirect-buffer)
#+END_SRC
2023-12-20 03:08:40 +01:00
***** my-org-retrieve-url-from-point → C-c o
2023-09-21 02:46:05 +02:00
#+begin_quote
I wanted a function that does not open an web URL within Org mode (via
=C-c C-o= ) but rather copies its URL to the system clipboard for
non-Emacs apps to paste.
Lucky me, I found the ready-to-use solution [[https://emacs.stackexchange.com/a/3990 ][on this page ]] which I bind to previously unused =C-c o= :
#+end_quote
--Karl Voit
2024-06-06 01:26:00 +02:00
#+BEGIN_SRC emacs-lisp :tangle no
2023-09-21 02:46:05 +02:00
(defun my-org-retrieve-url-from-point ()
(interactive)
(let* ((link-info (assoc :link (org-context)))
(text (when link-info
;; org-context seems to return nil if the current element
;; starts at buffer-start or ends at buffer-end
(buffer-substring-no-properties (or (cadr link-info) (point-min))
(or (caddr link-info) (point-max))))))
(if (not text)
(error "Not in org link")
(add-text-properties 0 (length text) '(yank-handler (my-yank-org-link)) text)
(kill-new text))))
#+END_SRC
2024-06-06 01:26:00 +02:00
#+BEGIN_SRC emacs-lisp :tangle no
2023-09-21 02:46:05 +02:00
(global-set-key (kbd "C-c o") 'my-org-retrieve-url-from-point)
#+END_SRC
2023-12-20 03:08:40 +01:00
***** org-element cache verification
2023-09-21 02:46:05 +02:00
2022-01-16: This has a positive impact on the performance as long as
you would not need it for consistency warnings. Re-enable it if
something is fishy and you want the self-check functionality again.
2023-12-20 03:08:40 +01:00
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-09-21 02:46:05 +02:00
(setq org-element--cache-self-verify nil)
#+END_SRC
2023-12-20 03:08:40 +01:00
#+RESULTS :
***** Theming
2023-09-21 02:46:05 +02:00
:PROPERTIES:
:ID: b663a9ef-f08e-436f-913d-98e4234cf2cd
:END:
#+begin_src emacs-lisp config.el
(setq org-fontify-todo-headline t)
(setq org-footnote-section nil)
(setq org-table-duration-hour-zero-padding nil)
2023-08-22 13:06:03 +02:00
(setq org-superstar-headline-bullets-list
'("⁖" "◉" "○" "✸" "✿"))
2023-09-21 02:46:05 +02:00
(setq org-use-property-inheritance '(category columns archive logging))
2023-08-22 13:06:03 +02:00
#+end_src
2023-09-21 02:46:05 +02:00
https://www.emacswiki.org/emacs/TruncateLines =M-x toggle-truncate-lines=
#+BEGIN_SRC emacs-lisp
2023-12-20 03:08:40 +01:00
;; (setq-default truncate-lines t)
2023-09-21 02:46:05 +02:00
(setq org-src-fontify-natively t)
(setq org-hide-leading-stars t)
2024-06-06 01:26:00 +02:00
2023-09-21 02:46:05 +02:00
#+END_SRC
2023-12-20 03:08:40 +01:00
****** Set the width of inline images:
2024-06-06 01:26:00 +02:00
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-09-21 02:46:05 +02:00
(setq org-image-actual-width '(600))
#+END_SRC
2023-12-20 03:08:40 +01:00
****** org-modern
2023-08-22 13:06:03 +02:00
#+begin_src emacs-lisp :tangle config.el
2024-06-06 01:26:00 +02:00
(package-initialize)
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
;; (modus-themes-load-operandi)
;; Choose some fonts
;; (set-face-attribute 'default nil :family "Iosevka")
;; (set-face-attribute 'variable-pitch nil :family "Iosevka Aile")
;; (set-face-attribute 'org-modern-symbol nil :family "Iosevka")
;; Add frame borders and window dividers
2023-09-21 02:46:05 +02:00
(modify-all-frames-parameters
2024-06-06 01:26:00 +02:00
'((right-divider-width . 0)
2023-09-21 02:46:05 +02:00
(internal-border-width . 0)))
(dolist (face '(window-divider
window-divider-first-pixel
window-divider-last-pixel))
(face-spec-reset-face face)
(set-face-foreground face (face-attribute 'default :background)))
(set-face-background 'fringe (face-attribute 'default :background))
(setq
;; Edit settings
org-auto-align-tags nil
org-tags-column 0
org-catch-invisible-edits 'show-and-error
2024-06-06 01:26:00 +02:00
org-special-ctrl-a/e t
2023-09-21 02:46:05 +02:00
org-insert-heading-respect-content t
;; Org styling, hide markup etc.
org-hide-emphasis-markers t
org-pretty-entities t
;; Agenda styling
org-agenda-tags-column 0
org-agenda-block-separator ?─
org-agenda-time-grid
'((daily today require-timed)
(800 1000 1200 1400 1600 1800 2000)
" ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄")
org-agenda-current-time-string
2024-06-06 01:26:00 +02:00
"◀── now ─────────────────────────────────────────────────")
;; Ellipsis styling
;; (setq org-ellipsis "…")
;; (set-face-attribute 'org-ellipsis nil :inherit 'default :box nil)
2023-09-21 02:46:05 +02:00
(global-org-modern-mode)
2023-08-22 13:06:03 +02:00
2023-08-12 17:25:26 +02:00
#+end_src
2024-06-06 01:26:00 +02:00
#+RESULTS :
: t
****** Directory to org
#+begin_src elisp :tangle config.el
(defun my-dir-to-org (dir org-file)
"Create a file ORG-FILE which has all txt files in DIR as linked headlines
and the contents of the files below the headlines."
(interactive "DDirectory to convert: \nFFilename: ")
(let ((files (directory-files
dir t ".*\\.txt\\'")))
(with-temp-file org-file
(dolist (file files)
(insert (concat "* " (file-name-nondirectory file) "\n\n"))
(insert-file-contents file)
(goto-char (point-max))
(insert "\n")))))
(defun my-dir-to-org-with-links (dir org-file)
"Create a file ORG-FILE which has all txt files in DIR as linked headlines
and the contents of the files below the headlines."
(interactive "DDirectory to convert: \nFFilename: ")
(let ((files (directory-files
dir t ".*\\.txt\\'")))
(with-temp-file org-file
(dolist (file files)
(insert (concat "* " "[[" file " ][" (file-name-nondirectory file) " ]]\n\n"))
(insert-file-contents file)
(goto-char (point-max))
(insert "\n")))))
(defun my-mass-conversion (source-dir target-dir)
"Create one org file per directory of SOURCE-DIR inside TARGET-DIR."
(interactive "DDirectory to convert: \nDTarget Directory:")
(let ((dirs-full
(remove-if-not #'file-directory-p
(directory-files
source-dir t
directory-files-no-dot-files-regexp))))
(mapc (lambda (dir)
(my-dir-to-org dir
(concat target-dir
(file-name-base dir) ".org")))
dirs-full)))
#+end_src
#+RESULTS :
: my-mass-conversion
2023-12-20 03:08:40 +01:00
***** Dependencies
2023-09-21 02:46:05 +02:00
#+begin_src emacs-lisp :tangle config.el
(setq-default org-enforce-todo-dependencies t)
(setq org-enforce-todo-checkbox-dependencies t)
#+END_SRC
2024-06-06 01:26:00 +02:00
***** org-auto-tangle
#+begin_src emacs-lisp :tangle config.el
(require 'org-auto-tangle)
(add-hook 'org-mode-hook 'org-auto-tangle-mode)
#+end_src
***** auto-tangle-mode
#+begin_src emacs-lisp :tangle yes
#+end_src
2023-12-20 03:08:40 +01:00
**** Hooks
***** append and update time-stamps for =Time-stamp: <>= in headers:
2023-09-21 02:46:05 +02:00
#+begin_src emacs-lisp :tangle config.el
(add-hook 'write-file-hooks 'time-stamp)
(add-hook 'org-mode-hook
(lambda ()
;; yasnippet
;;disabled; (make-variable-buffer-local 'yas/trigger-key)
;;disabled; (org-set-local 'yas/trigger-key [tab])
;;disabled; (define-key yas/keymap [tab] 'yas/next-field-group)
;; flyspell mode for spell checking everywhere
;;disabled; (flyspell-mode 1)
;; auto-fill mode on
(auto-fill-mode 1)))
#+end_src
2024-06-06 01:26:00 +02:00
***** expand macros inline
#+begin_src emacs-lisp :tangle config.el
(add-to-list 'font-lock-extra-managed-props 'display)
(font-lock-add-keywords
'org-mode
'(("\\({{{[a-zA-Z#%)(_-+0-9]+}}} \\)" 0
`(face nil display
,(format "%s"
(let* ((input-str (match-string 0))
(el (with-temp-buffer
(insert input-str)
(goto-char (point-min))
(org-element-context)))
(text (org-macro-expand el org-macro-templates)))
(if text
text
input-str)))))))
#+end_src
#+RESULTS:
2023-12-20 03:08:40 +01:00
**** Keybinds
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle config.el
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-ch" 'counsel-org-link)
(global-set-key "\C-cne" 'elgantt-open)
2023-08-22 13:06:03 +02:00
(global-set-key "\C-cnn" 'org-capture)
2023-08-12 17:25:26 +02:00
#+end_src
2023-12-20 03:08:40 +01:00
***** Timestamp keybinds
2023-08-12 22:48:12 +02:00
Inserts timestamps in the proper format. ~'(16)~ stands for two universal arguments, keeping the command from prompting for the time. Two keybinds here, which insert an active or inactive timestamp.
#+begin_src emacs-lisp :tangle config.el
(global-set-key "\C-cia" '(lambda ()(interactive)
2023-09-21 02:46:05 +02:00
(org-time-stamp '(16))))
2023-08-12 22:48:12 +02:00
(global-set-key "\C-cii" '(lambda () (interactive)
2023-09-21 02:46:05 +02:00
(org-time-stamp-inactive '(16))))
2023-08-12 22:48:12 +02:00
#+end_src
2023-08-22 13:06:03 +02:00
2024-06-06 01:26:00 +02:00
***** Automated timestamps in headings
I need this because hitting the above is tedious.
For the files whose paths match the strings in the function, it will advise the org-insert-heading function to insert an inactive timestamp into the new heading.
This turns making new entries from ~C-<return> C-i i~ into just ~C-<return>~ . Much easier, and I don't have to think about this any more.
#+begin_src emacs-lisp :tangle config.el
2024-07-29 12:31:22 +02:00
(after! org-mode
(add-hook! 'org-insert-heading-hook
2024-06-06 01:26:00 +02:00
(if
(or
(string-match-p "journal.org" buffer-file-name)
(string-match-p "money" buffer-file-name)
(string-match-p "therapy.org" buffer-file-name))
((lambda ()
(interactive)
(org-time-stamp-inactive '(16))
(newline)))
(setq org-insert-heading-hook nil)
)))
#+end_src
#+RESULTS :
2023-12-20 03:08:40 +01:00
**** Todo keywords
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle config.el
2023-12-20 03:08:40 +01:00
(setq org-todo-keywords
'((sequence
2024-06-06 01:26:00 +02:00
"INBOX(i!)"
"TASK(t!)" ; A task that needs doing & is ready to do
"PROJ(p!)" ; A project, which usually contains other tasks
"LOOP(r!)" ; A recurring task
"WAIT(w!)" ; Something external is holding up this task
"HOLD(h!)" ; This task is paused/on hold because of me
2023-12-20 03:08:40 +01:00
"|"
2024-06-06 01:26:00 +02:00
"DONE(d!@)" ; Task successfully completed
"KILL(k!@)") ; Task was cancelled, aborted or is no longer applicable
2023-12-20 03:08:40 +01:00
(sequence
"DECIDE()" ; for making decisions
"|"
2024-06-06 01:26:00 +02:00
"OKAY(o!)" ; okay as-is
"YES(y!)" ; take action
"NO(n!)")) ; don't take action
2023-12-20 03:08:40 +01:00
org-todo-keyword-faces
'(
("INBOX" :foreground "cyan" :weight bold)
("TASK" :foreground "purple" :weight bold)
("PROJ" :foreground "violet" :weight bold)
("LOOP" :foreground "magenta" :weight bold)
("WAIT" :foreground "yellow" :weight bold)
("HOLD" :foreground "orange" :weight bold)
("DONE" :foreground "green" :weight bold)
("KILL" :foreground "grey" :weight bold)))
2023-08-12 17:25:26 +02:00
#+end_src
2023-09-21 02:46:05 +02:00
#+RESULTS :
| INBOX | :foreground | cyan | :weight | bold |
| TASK | :foreground | purple | :weight | bold |
| PROJ | :foreground | violet | :weight | bold |
| LOOP | :foreground | magenta | :weight | bold |
| WAIT | :foreground | yellow | :weight | bold |
| HOLD | :foreground | orange | :weight | bold |
| DONE | :foreground | green | :weight | bold |
| KILL | :foreground | grey | :weight | bold |
Change font for DONE tasks
- https://lists.gnu.org/archive/html/emacs-orgmode/2007-03/msg00179.html
#+BEGIN_SRC emacs-lisp :tangle no
(setq org-fontify-done-headline t)
(custom-set-faces
'(org-done ((t (:foreground "PaleGreen"
:weight normal
:strike-through t))))
'(org-headline-done
((((class color) (min-colors 16) (background dark))
(:foreground "LightSalmon" :strike-through t)))))
#+END_SRC
2023-12-20 03:08:40 +01:00
**** Capture templates
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle config.el
2024-06-06 01:26:00 +02:00
(setq org-capture-templates '(("t" "inbox" entry (file+headline "~/enc/org/agenda.org" "Inbox") "* %i%?")
("i" "idea" entry (file+headline "~/enc/org/agenda.org" "Ideas") "* %?")
("d" "reminder" entry (file+headline "~/enc/org/agenda.org" "Reminders") "* %i%? \n %U")
("p" "person" entry (file+headline "~/enc/org/people.org" "Sort")
2023-08-22 13:06:03 +02:00
"* %(org-contacts-template-name)
2023-08-12 17:25:26 +02:00
:PROPERTIES:
:EMAIL: %(org-contacts-template-email)
2024-06-06 01:26:00 +02:00
:PHONE:
2023-08-12 17:25:26 +02:00
:ALIAS:
:NICKNAME:
:IGNORE:
:ICON:
:NOTE:
:ADDRESS:
:BIRTHDAY:
:END:")))
#+end_src
2023-09-21 02:46:05 +02:00
2024-06-06 01:26:00 +02:00
#+RESULTS :
| t | inbox | entry | (file+headline ~/enc/org/agenda.org Inbox) | * %i%? |
| i | idea | entry | (file+headline ~/enc/org/agenda.org Ideas) | * %? |
| d | reminder | entry | (file+headline ~/enc/org/agenda.org Reminders) | * %i%? |
2023-12-20 03:08:40 +01:00
**** preserving all heading levels when archiving
2023-09-21 02:46:05 +02:00
Karl Voit:
#+begin_quote
Preserve the hierarchy when archiving: [[https://fuco1.github.io/2017-04-20-Archive-subtrees-under-the-same-hierarchy-as-original-in-the-archive-files.html ][blog article ]], [[https://gist.github.com/Fuco1/e86fb5e0a5bb71ceafccedb5ca22fcfb ][source code (GitHub gist) ]]
#+end_quote
2024-06-06 01:26:00 +02:00
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-09-21 02:46:05 +02:00
(setq org-archive-default-command #'org-archive-subtree-hierarchically)
(defun org-archive-subtree-hierarchically (&optional prefix)
(interactive "P")
(let* ((fix-archive-p (and (not prefix)
(not (use-region-p))))
(afile (car (org-archive--compute-location
(or (org-entry-get nil "ARCHIVE" 'inherit) org-archive-location))))
(buffer (or (find-buffer-visiting afile) (find-file-noselect afile))))
(org-archive-subtree prefix)
(when fix-archive-p
(with-current-buffer buffer
(goto-char (point-max))
(while (org-up-heading-safe))
(let* ((olpath (org-entry-get (point) "ARCHIVE_OLPATH"))
(path (and olpath (split-string olpath "/")))
(level 1)
tree-text)
(when olpath
(org-mark-subtree)
(setq tree-text (buffer-substring (region-beginning) (region-end)))
(let (this-command (inhibit-message t)) (org-cut-subtree)) ; we don’ t want to see "Cut subtree" messages
(goto-char (point-min))
(save-restriction
(widen)
(-each path
(lambda (heading)
(if (re-search-forward
(rx-to-string
`(: bol (repeat ,level "*") (1+ " ") ,heading)) nil t)
(org-narrow-to-subtree)
(goto-char (point-max))
(unless (looking-at "^")
(insert "\n"))
(insert (make-string level ?*)
" "
heading
"\n"))
(cl-incf level)))
(widen)
(org-end-of-subtree t t)
(org-paste-subtree level tree-text))))))))
#+END_SRC
2023-12-20 03:08:40 +01:00
**** my-dired-insert-lfile-link-list-to-other-org-window()
2023-09-21 02:46:05 +02:00
#+begin_quote
| 2022-06-20 | I had this idea and implemented it |
Development task: id:2022-06-20-implement-add-lfile-links-to-buffer-with-marked-dired-files
[[https://emacs.stackexchange.com/questions/60359/is-there-a-quicker-way-to-create-links-to-attachments ][This stackexchange snippet ]] had the almost exactly perfect code which I adapted.
The idea of the process is:
1. I have an Org-mode buffer and a dired buffer side-by-side (which is my usual setup).
2. I place the cursor in the Org-mode buffer so that I may add a list.
3. I switch to the dired buffer and mark one or more files.
4. I invoke this function.
This results in a list that gets added to the Org-mode buffer similar to:
: - [[lfile:This is an example.odt ][This is an example.odt ]]
: - [[lfile:2022-06-20 an image.png ][2022-06-20 an image.png ]]
#+end_quote
2024-06-06 01:26:00 +02:00
#+begin_src emacs-lisp :results none :tangle no
2023-09-21 02:46:05 +02:00
(defun my-dired-insert-lfile-link-list-to-other-org-window (files)
;; adapted by Karl Voit from https://emacs.stackexchange.com/a/60369
(interactive
(list (dired-get-marked-files)))
(unless (eq major-mode 'dired-mode)
(user-error "This command must be triggered in a dired buffer"))
(let ((dired-win (selected-window))
(orgmode-win
(get-window-with-predicate
(lambda (window)
(with-current-buffer (window-buffer window)
(eq major-mode 'org-mode))))))
(unless orgmode-win
(user-error
"Can't attach to subtree. No window displaying an Org buffer"))
(select-window orgmode-win)
(dolist (file files)
(let* ((fname (file-name-nondirectory file))
(link (format "lfile:%s" fname))
(desc fname))
;;(push (list link desc) org-stored-links) ;; original idea was to insert to this buffer in order to paste via C-c C-l
(insert (format "%s" (concat "- [[" link " ][" desc " ]]\n")))
))
(select-window dired-win)))
#+end_src
2023-12-20 03:08:40 +01:00
**** link colors
2023-09-21 02:46:05 +02:00
#+begin_quote
| 2021-01-11 | moved commands to =my-set-linkcolors= and defined 3 categories of colors |
- I got the idea from: https://www.reddit.com/r/emacs/comments/hywxef/visually_differentiate_between_links_to_files_and/
- possible values for faces: https://kitchingroup.cheme.cmu.edu/blog/2016/11/04/New-link-features-in-org-9/
- and =add-face-text-property= : https://www.gnu.org/software/emacs/manual/html_node/elisp/Faces.html#Faces
- Emacs colors: http://www.raebear.net/computers/emacs-colors/
- If you are interested in taking this any further: https://github.com/stardiviner/org-link-beautify
#+end_quote
2024-06-06 01:26:00 +02:00
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-09-21 02:46:05 +02:00
(setq my-linkcolor-org "wheat3")
(setq my-linkcolor-file "MediumSeaGreen")
(setq my-linkcolor-web "DeepSkyBlue")
(defun my-set-linkcolors ()
"Defines the colors of various link colors"
(interactive)
;; Org links --------------------------------------------------------------------------
(org-link-set-parameters "id" :face `(:foreground ,my-linkcolor-org :underline t))
(org-link-set-parameters "contact" :face `(:foreground ,my-linkcolor-org :underline t))
;; File links --------------------------------------------------------------------------
(org-link-set-parameters "file" :face `(:foreground ,my-linkcolor-file :underline t))
;; defined elsewhere;; (org-link-set-parameters "tsfile" :face '`(:foreground "DarkSeaGreen" :underline t))
(org-link-set-parameters "pdf" :face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "EPA" :face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "EPAAFO" :face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "JAFO" :face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "DAKEPA" :face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "BMTSK" :face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "ISO" :face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "gemSpec_DS_Anbieter"
:face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "gemSpec_Net"
:face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "gemSpec_PKI"
:face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "gemSpec_IDP_Dienst"
:face `(:foreground ,my-linkcolor-file :underline t))
(org-link-set-parameters "messageid"
:face `(:foreground ,my-linkcolor-file :underline t))
;; Web links --------------------------------------------------------------------------
(org-link-set-parameters "http" :face `(:foreground ,my-linkcolor-web :underline t))
(org-link-set-parameters "https" :face `(:foreground ,my-linkcolor-web :underline t))
)
(defun my-set-linkcolors ()
"Defines the colors of various link colors"
(interactive)
;; Org links --------------------------------------------------------------------------
(org-link-set-parameters "id" :face '(:foreground "wheat3" :underline t))
(org-link-set-parameters "contact" :face '(:foreground "wheat3" :underline t))
;; File links --------------------------------------------------------------------------
(org-link-set-parameters "file" :face '(:foreground "MediumSeaGreen" :underline t))
;; defined elsewhere;; (org-link-set-parameters "tsfile" :face ''(:foreground "DarkSeaGreen" :underline t))
(org-link-set-parameters "pdf" :face '(:foreground "MediumSeaGreen" :underline t))
(org-link-set-parameters "EPA" :face '(:foreground "MediumSeaGreen" :underline t))
(org-link-set-parameters "EPAAFO" :face '(:foreground "MediumSeaGreen" :underline t))
(org-link-set-parameters "JAFO" :face '(:foreground "MediumSeaGreen" :underline t))
(org-link-set-parameters "DAKEPA" :face '(:foreground "MediumSeaGreen" :underline t))
(org-link-set-parameters "BMTSK" :face '(:foreground "MediumSeaGreen" :underline t))
(org-link-set-parameters "gemSpec_DS_Anbieter"
:face '(:foreground "MediumSeaGreen" :underline t))
(org-link-set-parameters "gemSpec_Net"
:face '(:foreground "MediumSeaGreen" :underline t))
(org-link-set-parameters "gemSpec_PKI"
:face '(:foreground "MediumSeaGreen" :underline t))
(org-link-set-parameters "gemSpec_IDP_Dienst"
:face '(:foreground "MediumSeaGreen" :underline t))
(org-link-set-parameters "messageid"
:face '(:foreground "MediumSeaGreen" :underline t))
;; Web links --------------------------------------------------------------------------
(org-link-set-parameters "http" :face '(:foreground "DeepSkyBlue" :underline t))
(org-link-set-parameters "https" :face '(:foreground "DeepSkyBlue" :underline t))
)
(my-set-linkcolors) ;; set colors when loading
#+END_SRC
- test links
- file: [[file:foo/bar.txt ]] [[file:foo/bar.txt ][description ]]
- tsfile: [[tsfile:foo/bar.txt ]] [[tsfile:foo/bar.txt ][description ]]
- lfile: [[lfile:foo/bar.txt ]] [[tsfile:foo/bar.txt ][description ]]
- pdf: pdf:foo.pdf [[pdf:foo.pdf ][description ]]
- http: http://Karl-Voit.at [[http:/ /Karl-Voit.at][description]]
- https: https://Karl-Voit.at [[https:/ /Karl-Voit.at][description]]
- id: id:foo-bar [[id:foo-bar ][description ]]
- contact: [[contact:example ]] [[contact:example ][description ]]
- message-id: [[messageid:foobar@example.com ][Email link ]]
- EPA: [[EPA:1234 ]] [[EPA:1234 ][description ]]
- EPAAFO: [[EPAAFO:1234 ]] [[EPAAFO:1234 ][description ]]
- JAFO: [[JAFO:1234 ]] [[JAFO:1234 ][description ]]
- DAKEPA: [[DAKEPA:1234 ]] [[DAKEPA:1234 ][description ]]
- BMTSK: [[BMTSK:1234 ]] [[BMTSK:1234 ][description ]]
- as of [2021-01-11 Mon] (before unifying color concept):
- Org links had: snow3
- File links: DarkSeaGreen, wheat2
- Web links: DeepSkyBlue
2024-06-06 01:26:00 +02:00
*** org-edna
https://www.nongnu.org/org-edna-el/
#+begin_src emacs-lisp :tangle config.el
#+end_src
*** mu4e
#+begin_src elisp :tangle config.el
(add-to-list 'load-path "/usr/share/emacs/site-lisp/mu4e/ ")
(setq mu4e-change-filenames-when-moving t)
(setq mu4e-update-interval (* 10 60))
(setq mu4e-get-mail-command "mbsync -a")
(setq mu4e-maildir "~/enc/ .mail")
(setq mu4e-drafts-folder "/Drafts")
(setq mu4e-sent-folder "/Sent")
(setq mu4e-refile-folder "/Refile")
(setq mu4e-trash-folder "/Trash")
(mu4e t)
#+end_src
#+RESULTS :
2023-09-21 02:46:05 +02:00
2024-06-06 01:26:00 +02:00
*** sly
#+begin_src emacs-lisp :tangle config.el
;; (load (expand-file-name "~/.roswell/helper.el"))
(setq inferior-lisp-program "sbcl --dynamic-space-size 8192 -Q -l ~/.sbclrc")
#+end_src
#+RESULTS :
: sbcl --dynamic-space-size 8192 -Q -l ~/.sbclrc
*** multiple-cursors
#+begin_src emacs-lisp :tangle config.el
(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
(global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this)
#+end_src
#+RESULTS :
: mc/mark-all-like-this
*** org-transclusion
2023-10-15 22:16:55 +02:00
#+begin_src emacs-lisp :tangle config.el
(use-package! org-transclusion
:after org
:init
(map!
2024-06-06 01:26:00 +02:00
:map global-map "<f12 >" #'org-transclusion-add
2023-10-15 22:16:55 +02:00
:leader
:prefix "n"
:desc "Org Transclusion Mode" "t" #'org-transclusion-mode))
#+end_src
2023-09-21 02:46:05 +02:00
2024-06-06 01:26:00 +02:00
#+RESULTS :
: org-transclusion
*** org-babel
2023-09-21 02:46:05 +02:00
#+begin_src emacs-lisp :tangle config.el
(add-hook 'org-babel-after-execute-hook 'org-display-inline-images)
#+end_src
When some code generates an image file, display it in the results:
2022-01-16: this has some performance impact because it affects all babel blocks of the current file
#+BEGIN_SRC emacs-lisp :tangle no
(add-hook 'org-babel-after-execute-hook 'org-display-inline-images)
#+END_SRC
2024-06-06 01:26:00 +02:00
#+BEGIN_SRC emacs-lisp :tangle no
2023-09-21 02:46:05 +02:00
(add-hook 'org-babel-after-execute-hook
(lambda ()
(unless (eq this-command 'org-babel-tangle)
(org-display-inline-images nil nil
;; 2023-02-08: org-back...-or-point-min doesn't exist any more: (save-excursion (org-back-to-heading-or-point-min t))
(save-excursion (org-back-to-heading t))
(save-excursion (or (outline-next-heading) (point-max)))))))
#+END_SRC
2024-06-06 01:26:00 +02:00
*** org-export*** LaTeX
2023-12-20 03:08:40 +01:00
#+begin_src emacs-lisp :tangle config.el
(with-eval-after-load 'ox-latex
(add-to-list 'org-latex-classes
2024-06-06 01:26:00 +02:00
'("tufte-handout"
"\\documentclass[nobib]{tufte-handout}
\\usepackage{nicefrac}
\\usepackage{units}
[NO-DEFAULT-PACKAGES]
[EXTRA]"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
'("memoir"
2023-12-20 03:08:40 +01:00
"\\documentclass{memoir}"
("\\chapter{%s}" . "\\chapter*{%s}")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}"))))
2024-06-06 01:26:00 +02:00
#+end_src
#+begin_src emacs-lisp :tangle no
(print org-latex-classes)
#+end_src
#+RESULTS :
| memoir | \documentclass{memoir} | (\chapter{%s} . \chapter*{%s}) | (\section{%s} . \section*{%s}) | (\subsection{%s} . \subsection*{%s}) | (\subsubsection{%s} . \subsubsection*{%s}) | |
| article | \documentclass[11pt]{article} | (\section{%s} . \section*{%s}) | (\subsection{%s} . \subsection*{%s}) | (\subsubsection{%s} . \subsubsection*{%s}) | (\paragraph{%s} . \paragraph*{%s}) | (\subparagraph{%s} . \subparagraph*{%s}) |
| report | \documentclass[11pt]{report} | (\part{%s} . \part*{%s}) | (\chapter{%s} . \chapter*{%s}) | (\section{%s} . \section*{%s}) | (\subsection{%s} . \subsection*{%s}) | (\subsubsection{%s} . \subsubsection*{%s}) |
| book | \documentclass[11pt]{book} | (\part{%s} . \part*{%s}) | (\chapter{%s} . \chapter*{%s}) | (\section{%s} . \section*{%s}) | (\subsection{%s} . \subsection*{%s}) | (\subsubsection{%s} . \subsubsection*{%s}) |
| tufte-handout | \documentclass[nobib]{tufte-handout} | | | | | |
#+begin_src
(setq org-latex-default-class "tufte-handout"
org-latex-pdf-process '("latexmk -pdf -bibtex-cond -f -outdir=%o %f"))
2023-12-20 03:08:40 +01:00
#+end_src
#+RESULTS :
2024-06-06 01:26:00 +02:00
| latexmk -pdf -bibtex-cond -f -outdir=%o %f |
2023-09-21 02:46:05 +02:00
2024-06-06 01:26:00 +02:00
*** org-super-links
2023-09-21 02:46:05 +02:00
***** Quick related link function
#+begin_src emacs-lisp :tangle config.el
(defun org-super-links-quick-related ()
(interactive)
(let ((org-super-links-link-prefix "\nrelated: "))
(org-super-links-link)))
(setq org-super-links-related-into-drawer t)
(setq org-super-links-related-drawer-default-name "RELATED"
org-super-links-link-prefix 'org-super-links-link-prefix-timestamp)
(setq org-export-with-broken-links t) ;; avoiding error on export
#+end_src
***** Keybinds
:PROPERTIES:
:ID: 86ac73be-4cf1-4262-8aa8-e03c519b5b6e
:END:
Replace org-store-link and org-insert-link with org-super-links alternatives.
#+begin_src emacs-lisp :tangle config.el
(global-unset-key (kbd "C-c l"))
(global-set-key (kbd "C-c l l") 'org-super-links-link)
(global-set-key (kbd "C-c l s") 'org-super-links-store-link)
(global-set-key (kbd "C-c l i") 'org-super-links-insert-drawer-link)
(global-set-key (kbd "C-c l r") 'org-super-links-quick-related)
(global-set-key (kbd "C-c l d") 'org-super-links-delete-link)
#+end_src
#+RESULTS :
: org-super-links-delete-link
2024-06-06 01:26:00 +02:00
*** org-super-agenda
2023-12-20 03:08:40 +01:00
#+begin_src emacs-lisp :tangle no
2023-09-21 02:46:05 +02:00
(org-super-agenda-mode)
2023-12-20 03:08:40 +01:00
(setq super-agenda-groups
'(;; Each group has an implicit boolean OR operator between its selectors.
2023-09-21 02:46:05 +02:00
(:name "Today" ; Optionally specify section name
:time-grid t ; Items that appear on the time grid
)
(:name "DEADLINES" :deadline t :order 1)
(:name "Focus | [A]" :tag "Focus" :priority "A" :order 2 :face (:append t :weight bold))
;; (:name "Important" :priority "A" :order 4)
;; (:name "Habits" :habit t :order 3)
;; (:name "Shopping" :tag "Besorgung" :order 8)
;; Boolean AND group matches items that match all subgroups
;; :and (:tag "shopping" :tag "@town")
;; Multiple args given in list with implicit OR
;; :tag ("food" "dinner"))
;; :habit t
;; :tag "personal")
(:name "Started" :and (:todo "TASK" :not (:tag "someday") :not (:priority "C") :not (:priority "B") ) :order 10)
;;(:name "Space-related (non-moon-or-planet-related)"
;; ;; Regexps match case-insensitively on the entire entry
;; :and (:regexp ("space" "NASA")
;; ;; Boolean NOT also has implicit OR between selectors
;; :not (:regexp "moon" :tag "planet")))
;;(:name "BWG" :tag "@BWG" :order 16)
;; (:name "read" :tag "2read" :order 22)
;; Groups supply their own section names when none are given
(:name "Someday" :and ( :todo ("WAIT" "HOLD" "INBOX") :tag "someday" :not (:priority "C") :not (:priority "B"))
;; Show this group at the end of the agenda (since it has the
;; highest number). If you specified this group last, items
;; with these todo keywords that e.g. have priority A would be
;; displayed in that group instead, because items are grouped
;; out in the order the groups are listed.
:order 25)
;; "other items": an auto-group with order 99 ----------------------------
(:name "Prio ≤ B" :priority<= "B"
;; Show this section after "Today" and "Important", because
;; their order is unspecified, defaulting to 0. Sections
;; are displayed lowest-number-first.
:order 105)
(:name "reward"
:tag ("reward" "lp")
:order 110
)
(:name "Waiting…" :todo "WAIT" :order 118) ; Set order of this section
2023-12-20 03:08:40 +01:00
)
2023-09-21 02:46:05 +02:00
(defun my-super-agenda()
"generates my super-agenda"
(interactive)
(org-super-agenda-mode)
(let
((org-super-agenda-groups super-agenda-groups))
(org-agenda nil "a")
2023-12-20 03:08:40 +01:00
))
2023-09-21 02:46:05 +02:00
#+end_src
2024-06-06 01:26:00 +02:00
*** Org-wild-notifier
2023-08-12 17:25:26 +02:00
This lets me get desktop notifications for TODO items.
#+begin_src emacs-lisp :tangle config.el
2024-06-06 01:26:00 +02:00
(org-wild-notifier-mode)
(setq alert-default-style 'libnotify
org-wild-notifier-alert-time '(0 5 15 60)
org-wild-notifier-keyword-whitelist nil
;; good for testing
org-wild-notifier--alert-severity 'high
alert-fade-time 50
)
2023-08-12 17:25:26 +02:00
#+end_src
2024-06-06 01:26:00 +02:00
#+RESULTS :
: 50
*** org-id
**** my-id-get-or-generate
2023-09-21 02:46:05 +02:00
Straight from Karl Voit's config.
2024-06-06 01:26:00 +02:00
#+BEGIN_SRC emacs-lisp :tangle no
2023-09-21 02:46:05 +02:00
(defun my-id-get-or-generate()
"Returns the ID property if set or generates and returns a new one if not set.
The generated ID is stripped off potential progress indicator cookies and
sanitized to get a slug. Furthermore, it is prepended with an ISO date-stamp
if none was found before."
(interactive)
(when (not (org-id-get))
(progn
(let* (
(my-heading-text (nth 4 (org-heading-components)));; retrieve heading string
(my-heading-text (replace-regexp-in-string "\\(\\[[0-9]+%\\]\\)" "" my-heading-text));; remove progress indicators like "[25%]"
(my-heading-text (replace-regexp-in-string "\\(\\[[0-9]+/[0-9]+ \\]\\)" "" my-heading-text));; remove progress indicators like "[2/7]"
(my-heading-text (replace-regexp-in-string "\\(\\[#[ABC]\\]\\)" "" my-heading-text));; remove priority indicators like "[#A]"
(my-heading-text (replace-regexp-in-string "\\[\\[\\(.+?\\)\\]\\[" "" my-heading-text t));; removes links, keeps their description and ending brackets
;; (my-heading-text (replace-regexp-in-string "[<\\[][12][0-9]\\{3\\}-[0-9]\\{2\\}-[0-9]\\{2\\}\\( .*?\\)[ >\\]]" "" my-heading-text t));; removes day of week and time from date- and time-stamps (doesn't work somehow)
(my-heading-text (replace-regexp-in-string "<[12][0-9]\\{3\\}-[0-9]\\{2\\}-[0-9]\\{2\\}\\( .*?\\) >" "" my-heading-text t));; removes day of week and time from active date- and time-stamps
(my-heading-text (replace-regexp-in-string "\\[[12][0-9]\\{3\\}-[0-9]\\{2\\}-[0-9]\\{2\\}\\( .*?\\)\\]" "" my-heading-text t));; removes day of week and time from inactive date- and time-stamps
(new-id (my-generate-sanitized-alnum-dash-string my-heading-text));; get slug from heading text
(my-created-property (assoc "CREATED" (org-entry-properties))) ;; nil or content of CREATED time-stamp
)
(when (not (string-match "[12][0-9][0-9][0-9]-[01][0-9]-[0123][0-9]-.+" new-id))
;; only if no ISO date-stamp is found at the beginning of the new id:
(if my-created-property (progn
;; prefer date-stamp of CREATED property (if found):
(setq my-created-datestamp (substring (org-entry-get nil "CREATED" nil) 1 11)) ;; returns "2021-12-16" or nil (if no CREATED property)
(setq new-id (concat my-created-datestamp "-" new-id))
)
;; use today's date-stamp if no CREATED property is found:
(setq new-id (concat (format-time-string "%Y-%m-%d-") new-id))))
(org-set-property "ID" new-id)
)
)
)
(kill-new (concat "id:" (org-id-get)));; put ID in kill-ring
(org-id-get);; retrieve the current ID in any case as return value
)
#+END_SRC
2024-06-06 01:26:00 +02:00
*** Org-refile
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle config.el
(setq org-refile-targets '((nil :maxlevel . 9)
(org-agenda-files :maxlevel . 9)))
(setq org-outline-path-complete-in-steps nil)
(setq org-refile-use-outline-path t)
#+end_src
(setq find-file-visit-truename t)
2024-06-06 01:26:00 +02:00
*** org-contacts
2023-09-21 02:46:05 +02:00
#+begin_src emacs-lisp :tangle config.el
(setq org-contacts-files '("~/enc/org/people.org"))
#+end_src
2023-08-12 22:48:12 +02:00
*** org-roam
2024-06-06 01:26:00 +02:00
**** org-roam
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle config.el
(setq org-roam-v2-ack t)
(setq org-roam-completion-everywhere t)
(setq org-roam-directory
(file-truename "~/enc/org/roam"))
(org-roam-db-autosync-mode)
(org-roam-db-autosync-enable)
(setq org-roam-capture-templates
2023-08-12 22:48:12 +02:00
'(("n" "default" plain
2023-08-12 17:25:26 +02:00
"%?"
2023-09-21 02:46:05 +02:00
:if-new (file+head "${slug}.org" "#+title: ${title}\n#+category: ${title}\n#+filetags: \n")
:empty-lines 1
2023-08-12 22:48:12 +02:00
:unnarrowed t)
("j" "journal" plain
"%?"
2023-09-21 02:46:05 +02:00
:if-new (file+head "journal/journal-${slug}.org" "#+title: ${title}\n#+category: 📔${title}\n#+filetags: 📔\n")
2023-08-22 13:06:03 +02:00
:empty-lines 1
2023-08-12 22:48:12 +02:00
:unnarrowed t)
("t" "Therapy" plain
2023-09-21 02:46:05 +02:00
"#+title: ${title}\n"
:if-new (file+head "therapy/therapy-${slug}.org" "#+title: ${title}\n#+category: 📗 ${title}\n#+filetags: 📗\n")
2023-08-22 13:06:03 +02:00
:empty-lines 1
:unnarrowed)))
2023-08-12 22:48:12 +02:00
#+end_src
2024-06-06 01:26:00 +02:00
**** Keybinds
#+begin_src emacs-lisp :tangle config.el
(define-prefix-command 'org-roam-map)
(global-set-key "\C-r" 'org-roam-map)
(define-key org-roam-map "o" 'org-roam-buffer-toggle)
(define-key org-roam-map "f" 'org-roam-node-find)
(define-key org-roam-map "i" 'org-roam-node-insert)
(define-key org-roam-map "n" 'org-roam-capture)
#+end_src
*** org-agenda
**** Keybinds
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle config.el
(global-set-key "\C-ca" 'org-agenda)
(define-prefix-command 'org-agenda-map)
(global-set-key "\C-a" 'org-agenda-map)
(define-key org-agenda-map "n" 'org-agenda-capture)
(define-key org-agenda-map "a" 'org-agenda)
#+end_src
2024-06-06 01:26:00 +02:00
**** Settings
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle config.el
(setq org-agenda-start-day nil
2024-06-06 01:26:00 +02:00
org-agenda-span 'day
org-agenda-dim-blocked-tasks t
2023-08-12 17:25:26 +02:00
org-agenda-sorting-strategy
2024-06-06 01:26:00 +02:00
'(time-up priority-up category-keep)
org-deadline-warning-days 4
2023-08-12 17:25:26 +02:00
org-log-into-drawer t
2024-06-06 01:26:00 +02:00
org-treat-insert-todo-heading-as-state-change t
2023-08-12 17:25:26 +02:00
org-clock-into-drawer t
2023-09-21 02:46:05 +02:00
org-agenda-log-mode-items '(closed clock state)
2024-06-06 01:26:00 +02:00
org-agenda-prefix-format '((agenda . " %l %i %c %s %t")
(todo . " %i %-12:c")
(tags . " %i $-12:c")
(search . " %i %-12:c"))
org-agenda-compact-blocks nil
org-agenda-use-tag-inheritance (quote (agenda));; agenda performance
org-agenda-block-separator "---------")
2023-08-22 13:06:03 +02:00
2023-12-20 03:08:40 +01:00
(add-hook 'org-agenda-mode-hook '(lambda () (hl-line-mode 1)))
2023-08-12 17:25:26 +02:00
#+end_src
2023-09-21 02:46:05 +02:00
2023-12-20 03:08:40 +01:00
#+RESULTS :
2024-06-06 01:26:00 +02:00
| (lambda nil (hl-line-mode 1)) | +org-habit-resize-graph-h | org-fancy-priorities-mode |
2023-09-21 02:46:05 +02:00
2024-06-06 01:26:00 +02:00
***** From Karl Voit
2023-09-21 02:46:05 +02:00
Remove completed deadline tasks from the agenda view
#+BEGIN_SRC emacs-lisp :tangle config.el
(setq org-agenda-skip-deadline-if-done t)
#+END_SRC
Remove completed scheduled tasks from the agenda view
#+BEGIN_SRC emacs-lisp :tangle config.el
(setq org-agenda-skip-scheduled-if-done t)
#+END_SRC
Remove completed items from search results
#+BEGIN_SRC emacs-lisp :tangle no
(setq org-agenda-skip-timestamp-if-done t)
#+END_SRC
Include agenda archive files when searching for things
#+BEGIN_SRC emacs-lisp :tangle config.el
(setq org-agenda-text-search-extra-files (quote (agenda-archives)))
#+END_SRC
show state changes in log-mode of agenda
#+BEGIN_SRC emacs-lisp :tangle config.el
(setq org-agenda-log-mode-items (quote (state)))
#+END_SRC
do not search for time in heading when displaying a date-stamp
#+BEGIN_SRC emacs-lisp :tangle config.el
(setq org-agenda-search-headline-for-time nil)
#+END_SRC
add diary entries in agenda view
http://orgmode.org/org.html#Weekly_002fdaily-agenda
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-12-20 03:08:40 +01:00
(setq org-agenda-include-diary t)
2023-09-21 02:46:05 +02:00
#+END_SRC
Show all future entries for repeating tasks
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-12-20 03:08:40 +01:00
(setq org-agenda-repeating-timestamp-show-all t)
2023-09-21 02:46:05 +02:00
#+END_SRC
Show all agenda dates - even if they are empty
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-12-20 03:08:40 +01:00
(setq org-agenda-show-all-dates t)
2023-09-21 02:46:05 +02:00
#+END_SRC
Sorting order for tasks on the agenda
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-12-20 03:08:40 +01:00
(setq org-agenda-sorting-strategy
2024-06-06 01:26:00 +02:00
(quote ((agenda time-up user-defined-up priority-down category-keep)
2023-12-20 03:08:40 +01:00
(todo priority-down category-keep)
(tags priority-down category-keep)
(search category-keep))))
2023-09-21 02:46:05 +02:00
#+END_SRC
2024-06-06 01:26:00 +02:00
#+RESULTS :
| agenda | time-up | user-defined-up | priority-down | category-keep |
| todo | priority-down | category-keep | | |
| tags | priority-down | category-keep | | |
| search | category-keep | | | |
2023-09-21 02:46:05 +02:00
Start the weekly agenda today
#+BEGIN_SRC emacs-lisp :tangle config.el
(setq org-agenda-start-on-weekday nil)
#+END_SRC
Non-nil means skip timestamp line if same entry shows because of deadline.
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-12-20 03:08:40 +01:00
(setq org-agenda-skip-timestamp-if-deadline-is-shown t)
2023-09-21 02:46:05 +02:00
#+END_SRC
Enable display of the time grid so we can see the marker for the current time
#+BEGIN_SRC emacs-lisp :tangle no
(setq org-agenda-time-grid
((daily today remove-match)
#("----------------" 0 16
(org-heading t))
(800 1000 1200 1400 1600 1800 2000)))
#+END_SRC
Sticky agendas remain opened in the background so that you don't
need to regenerate them each time you hit the corresponding
keystroke. This is a big time saver.
#+BEGIN_SRC emacs-lisp :tangle no
(setq org-agenda-sticky t)
#+END_SRC
Scrolling through agenda using C-p and C-n instead of PageUp/PageDown
also in agenda. Default setting is C-p/C-n for scrolling one line at a
time.
#+BEGIN_SRC emacs-lisp :tangle config.el
(define-key org-agenda-mode-map (kbd "C-p") 'my-scroll-down-half)
(define-key org-agenda-mode-map (kbd "C-n") 'my-scroll-up-half)
#+END_SRC
From [[https://www.reddit.com/r/orgmode/comments/e4stk2/adding_a_separator_line_between_days_in_emacs/ ][reddit ]]: Adding a separator line between days.
Disabled 2020-01-03 because I usually see one single day only.
2023-12-20 03:08:40 +01:00
#+BEGIN_SRC emacs-lisp :tangle config.el
2023-09-21 02:46:05 +02:00
(setq org-agenda-format-date (lambda (date) (concat "\n"
(make-string (window-width) 9472)
"\n"
(org-agenda-format-date-aligned date))))
#+END_SRC
2024-06-06 01:26:00 +02:00
**** Exports
2023-09-21 02:46:05 +02:00
Export subtree (by default) instead of whole buffer:
http://orgmode.org/manual/The-Export-Dispatcher.html
2023-12-20 03:08:40 +01:00
#+BEGIN_SRC emacs-lisp :tangle no
2023-09-21 02:46:05 +02:00
(setq org-export-initial-scope 'subtree)
#+END_SRC
With a densly interconnected Org knowledge-base (e.g., see
=org-super-links= ) and a "few but large Org mode files" in combination
with "I'm using export methods on sub-heading levels mostly", you end
up with errors that are caused by links that link stuff which is
outside of the sub-heading hierarchy which should be currently
exported.
Therefore, you'll need this setting for preventing those errors.
Please be aware that you won't get notified when links that should be
part of the export result get broken because of a typo or similar.
#+BEGIN_SRC emacs-lisp :tangle config.el
(setq org-export-with-broken-links t)
#+END_SRC
2024-06-06 01:26:00 +02:00
***** Org-Reveal - generate nice presentations out of Org-mode
2023-09-21 02:46:05 +02:00
https://github.com/yjwen/org-reveal
#+BEGIN_QUOTE
- =Reveal.js= is a tool for creating good-looking HTML presentations, authored by Hakim El Hattab.
- For an example of a reveal.js presentation, see [[http://lab.hakim.se/reveal-js/#/ ][here ]].
- =Org-Reveal= exports your Org documents to reveal.js presentations.
- With Org-reveal, you can create beautiful presentations with 3D effects from simple but powerful Org contents.
#+END_QUOTE
#+BEGIN_SRC emacs-lisp :tangle no
(use-package ox-reveal
:ensure t
;;:if (my-system-type-is-windows)
:defer 110
2023-12-20 03:08:40 +01:00
:config)
2023-09-21 02:46:05 +02:00
#+END_SRC
2024-06-06 01:26:00 +02:00
***** my-org-copy-region-as-markdown
2023-09-21 02:46:05 +02:00
| 2022-05-03 | initial setup and disabled because of error |
I've found this nugget on http://mbork.pl/2021-05-02_Org-mode_to_Markdown_via_the_clipboard.
I often work with tools that accept Markdown as input syntax. When I
prefer Org-mode for authoring, I just have to mark the result in a
region, invoke this snippet and paste in the other tool.
Please enable Markdown export as stated on https://lists.gnu.org/archive/html/emacs-orgmode/2022-05/msg00062.html
: (require 'ox-md)
#+BEGIN_SRC emacs-lisp :tangle config.el
(defun my-org-copy-region-as-markdown ()
"Copy the region (in Org) to the system clipboard as Markdown."
(interactive)
(if (use-region-p)
(let* ((region
(buffer-substring-no-properties
(region-beginning)
(region-end)))
(markdown
(org-export-string-as region 'md t '(:with-toc nil))))
(gui-set-selection 'CLIPBOARD markdown))))
#+END_SRC
Debugging:
#+BEGIN_SRC emacs-lisp :tangle no
(setq region "/foo/ *bar* https://example.com baz")
(org-export-string-as region 'md t '(:with-toc nil))
#+END_SRC
2023-08-12 17:25:26 +02:00
2024-06-06 01:26:00 +02:00
**** org-habits
#+begin_src emacs-lisp :tangle config.el
(add-to-list 'org-modules 'habit)
(setq org-habit-following-days 2
org-habit-preceding-days 7
org-habit-show-all-today nil
org-habit-show-habits-only-for-today t
org-habit-show-habits t)
#+end_src
#+RESULTS :
: t
**** org-habit-stats
#+begin_src emacs-lisp :tangle config.el
(define-key org-mode-map (kbd "C-c h") 'org-habit-stats-view-habit-at-point)
(define-key org-agenda-mode-map (kbd "H") 'org-habit-stats-view-habit-at-point-agenda)
(add-hook 'org-after-todo-state-change-hook 'org-habit-stats-update-properties)
#+end_src
#+RESULTS :
| org-habit-stats-update-properties |
**** org-download
this is here as a reminder of the config options, so no tangling
#+begin_src emacs-lisp :tangle no
(setq-default org-download-image-dir "~/enc/org/ .attach")
;; can also set for the individual buffer
;; -*- mode: Org; org-download-image-dir: "~/Pictures/foo"; -* -
#+end_src
*** yasnippets
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle config.el
(setq doom-snippets-enable-short-helpers t)
2024-06-06 01:26:00 +02:00
2023-08-22 13:06:03 +02:00
#+end_src
2024-06-06 01:26:00 +02:00
*** dired-open
2023-08-22 13:06:03 +02:00
#+begin_src emacs-lisp :tangle config.el
(setq dired-open-extensions '(("gif" . "sxiv")
("jpg" . "sxiv")
("png" . "sxiv")
("mkv" . "mpv")
("mp4" . "mpv")))
2023-08-12 17:25:26 +02:00
#+end_src
2024-06-06 01:26:00 +02:00
*** mode-icons
2023-09-21 02:46:05 +02:00
#+begin_src emacs-lisp :tangle config.el
2023-12-20 03:08:40 +01:00
(mode-icons-mode)
(add-hook 'dired-mode-hook #'mode-icons--mode-disable) ;; with mode-icons, visiting a dir with dired takes up *lots* of CPU for =mode-icons-reset= (performance-issue)
2023-09-21 02:46:05 +02:00
#+end_src
2024-06-06 01:26:00 +02:00
*** csv-mode
2023-09-21 02:46:05 +02:00
#+begin_src emacs-lisp :tangle config.el
(add-to-list 'auto-mode-alist '("\\.[Cc][Ss][Vv]\\'" . csv-mode))
(autoload 'csv-mode "csv-mode"
"Major mode for editing comma-separated value files." t)
#+end_src
2024-06-06 01:26:00 +02:00
*** whisper.el (S2T; speech to text)
2023-09-21 02:46:05 +02:00
- https://github.com/natrys/whisper.el
#+BEGIN_QUOTE
You will use these functions:
- =whisper-run= : Toggle between recording from your microphone and transcribing
- =whisper-file= : Same as before but transcribes a local file on disk
Invoking =whisper-run= with a prefix argument (C-u) has the same effect as =whisper-file= .
Both of these functions will automatically compile whisper.cpp
dependency and download language model the first time they are run.
When recording is in progress, invoking them stops it and starts
transcribing. Otherwise if compilation, download (of model file) or
transcription job is in progress, calling them again cancels that.
#+END_QUOTE
Use =whisper-run= once to start recording and a second time for start
the translation process which puts the text into the buffer. This
works *offline* (without cloud or network) and amazingly well for English.
2024-06-06 01:26:00 +02:00
#+BEGIN_SRC emacs-lisp :results none :tangle no
2023-09-21 02:46:05 +02:00
(use-package whisper
:load-path (lambda () (expand-file-name (concat my-user-emacs-directory "contrib/whisper.el/ ")))
;; :bind ("C-H-r" . whisper-run)
:config
(setq whisper-install-directory (concat my-user-emacs-directory "bin/")
whisper-model "base"
whisper-language "de"
whisper-translate nil)
:defer 110
)
#+END_SRC
2024-06-06 01:26:00 +02:00
*** hledger-mode
2023-09-21 02:46:05 +02:00
#+begin_src emacs-lisp :tangle config.el
;; To open files with .journal extension in hledger-mode
(add-to-list 'auto-mode-alist '("\\.journal\\'" . hledger-mode))
;; Provide the path to you journal file.
;; The default location is too opinionated.
(setq hledger-jfile "~/enc/org/hledger/2023.journal")
;;; Auto-completion for account names
;; For company-mode users,
(add-to-list 'company-backends 'hledger-company)
#+end_src
2024-06-06 01:26:00 +02:00
*** gptel
#+begin_src emacs-lisp :tangle config.el
(use-package! gptel
:config
2024-07-29 12:31:22 +02:00
(setq! gptel-api-key "thisisanapikey")
2024-06-06 01:26:00 +02:00
(setq! gptel-max-tokens 8192)
2024-07-29 12:31:22 +02:00
(setq gptel-model "model"
2024-06-06 01:26:00 +02:00
gptel-backend (gptel-make-openai "llama-cpp"
2024-07-29 12:31:22 +02:00
:key "thisisanapikey"
2024-06-06 01:26:00 +02:00
:stream t
:protocol "http"
2024-07-29 12:31:22 +02:00
:host "localhost:6666"
2024-06-06 01:26:00 +02:00
:models '("model"))))
(gptel-make-openai "llama-cpp" ;Any name
2024-07-29 12:31:22 +02:00
:key "thisisanapikey"
2024-06-06 01:26:00 +02:00
:stream t ;Stream responses
:protocol "http"
2024-07-29 12:31:22 +02:00
:host "localhost:6666" ;Llama.cpp server location
2024-06-06 01:26:00 +02:00
:models '("model")) ;Any names, doesn't matter for Llama
(setq gptel--debug t)
#+end_src
#+RESULTS :
: t
*** erc
**** config
#+begin_src emacs-lisp :tangle config.el
;; Set our nickname & real-name as constant variables
(setq
erc-nick "phil_bb" ; Our IRC nick
erc-user-full-name "Phil B.") ; Our /whois name
;; Define a function to connect to a server
(defun erc/libera ()
(interactive)
(erc :server "irc.libera.chat"
:port "6667"))
#+end_src
#+RESULTS :
: erc/libera
2023-08-12 17:25:26 +02:00
* custom.el
Custom variables. Note that this file is generally set up automatically by Emacs, so I'm not exporting this block. I'm keeping the default warning commants in just for completion here.
2023-08-12 22:48:12 +02:00
#+begin_src emacs-lisp :tangle no
2024-06-06 01:26:00 +02:00
(custom-set-variables)
2023-08-12 17:25:26 +02:00
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)
#+end_src
* init.el
This is the state as of <2023-08-12 Sat >. I'm sure Doom Emacs will expand/ change/ add/ remove things over time, but this is what I use right now.
2023-09-21 02:46:05 +02:00
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle init.el
2023-09-21 02:46:05 +02:00
;;; init.el -*- lexical-binding: t; -* -
;; This file controls what Doom modules are enabled and what order they load
;; in. Remember to run 'doom sync' after modifying it!
;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's
;; documentation. There you'll find a link to Doom's Module Index where all
;; of our modules are listed, including what flags they support.
;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or
;; 'C-c c k' for non-vim users) to view its documentation. This works on
;; flags as well (those symbols that start with a plus).
;;
;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its
;; directory (for easy access to its source code).
2023-08-12 17:25:26 +02:00
(doom! :input
2023-09-21 02:46:05 +02:00
;;bidi ; (tfel ot) thgir etirw uoy gnipleh
;;chinese
;;japanese
;;layout ; auie,ctsrnm is the superior home row
:completion
2024-06-06 01:26:00 +02:00
(company +childframe) ; the ultimate code completion backend
2023-09-21 02:46:05 +02:00
;;helm ; the *other* search engine for love and life
;;ido ; the other *other* search engine...
;;ivy ; a search engine for love and life
vertico ; the search engine of the future
:ui
;;deft ; notational velocity for Emacs
doom ; what makes DOOM look the way it does
doom-dashboard ; a nifty splash screen for Emacs
doom-quit ; DOOM quit-message prompts when you quit Emacs
2023-10-15 22:16:55 +02:00
(emoji +unicode) ; 🙂
2023-09-21 02:46:05 +02:00
;;hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW
2023-10-15 22:16:55 +02:00
hydra
2023-09-21 02:46:05 +02:00
indent-guides ; highlighted indent columns
2023-10-15 22:16:55 +02:00
(ligatures +iosevka +extra) ; ligatures and symbols to make your code pretty again
minimap ; show a map of the code on the side
2023-09-21 02:46:05 +02:00
modeline ; snazzy, Atom-inspired modeline, plus API
nav-flash ; blink cursor line after big motions
;;neotree ; a project drawer, like NERDTree for vim
ophints ; highlight the region an operation acts on
(popup +defaults) ; tame sudden yet inevitable temporary windows
;;tabs ; a tab bar for Emacs
treemacs ; a project drawer, like neotree but cooler
unicode ; extended unicode support for various languages
(vc-gutter +pretty) ; vcs diff in the fringe
vi-tilde-fringe ; fringe tildes to mark beyond EOB
;;window-select ; visually switch windows
workspaces ; tab emulation, persistence & separate workspaces
;;zen ; distraction-free coding or writing
:editor
;;(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
;;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
;;objed ; text object editing for the innocent
;;parinfer ; turn lisp into python, sort of
;;rotate-text ; cycle region at point between text candidates
snippets ; my elves. They type so I don't have to
word-wrap ; soft wrapping with language-aware indent
:emacs
dired ; making dired pretty [functional]
electric ; smarter, keyword-based electric-indent
;;ibuffer ; interactive buffer management
(undo +tree) ; persistent, smarter undo for your inevitable mistakes
vc ; version-control and Emacs, sitting in a tree
:term
;;eshell ; the elisp shell that works everywhere
;;shell ; simple shell REPL for Emacs
;;term ; basic terminal emulator for Emacs
vterm ; the best terminal emulation in Emacs
:checkers
syntax ; tasing you for every semicolon you forget
2023-12-20 03:08:40 +01:00
;;(spell +flyspell) ; tasing you for misspelling mispelling
2023-09-21 02:46:05 +02:00
grammar ; tasing grammar mistake every you make
:tools
2023-12-20 03:08:40 +01:00
ansible
2023-09-21 02:46:05 +02:00
;;biblio ; Writes a PhD for you (citation needed)
;;collab ; buffers with friends
2023-12-20 03:08:40 +01:00
debugger ; FIXME stepping through code, to help you add bugs
2023-09-21 02:46:05 +02:00
;;direnv
2023-12-20 03:08:40 +01:00
docker
editorconfig ; let someone else argue about tabs vs spaces
2023-09-21 02:46:05 +02:00
;;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
magit ; a git porcelain for Emacs
;;make ; run make tasks from Emacs
;;pass ; password manager for nerds
pdf ; pdf enhancements
;;prodigy ; FIXME managing external services & code builders
rgb ; creating color strings
;;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
(:if IS-MAC macos) ; improve compatibility with macOS
;;tty ; improve the terminal Emacs experience
:lang
;;agda ; types of types of types of types...
;;beancount ; mind the GAAP
(cc +lsp) ; C > C+ + == 1
2023-12-20 03:08:40 +01:00
(clojure +lsp) ; java with a lisp
2023-09-21 02:46:05 +02:00
common-lisp ; if you've seen one lisp, you've seen them all
;;coq ; proofs-as-programs
;;crystal ; ruby at the speed of c
;;csharp ; unity, .NET, and mono shenanigans
data ; config/data formats
2024-06-06 01:26:00 +02:00
(dart +flutter) ; paint ui and not much else
2023-09-21 02:46:05 +02:00
;;dhall
;;elixir ; erlang done right
;;elm ; care for a cup of TEA?
emacs-lisp ; drown in parentheses
;;erlang ; an elegant language for a more civilized age
;;ess ; emacs speaks statistics
;;factor
;;faust ; dsp, but you get to keep your soul
;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER)
;;fsharp ; ML stands for Microsoft's Language
;;fstar ; (dependent) types and (monadic) effects and Z3
gdscript ; the language you waited for
;;(go +lsp) ; the hipster dialect
;;(graphql +lsp) ; Give queries a REST
(haskell +lsp) ; a language that's lazier than I am
;;hy ; readability of scheme w/ speed of python
;;idris ; a language you can depend on
json ; At least it ain't XML
2024-06-06 01:26:00 +02:00
(java +lsp) ; the poster child for carpal tunnel syndrome
2023-12-20 03:08:40 +01:00
(javascript +lsp) ; all(hope(abandon(ye(who(enter(here))))))
(julia +lsp) ; a better, faster MATLAB
2023-09-21 02:46:05 +02:00
;;kotlin ; a better, slicker Java(Script)
latex ; writing papers in Emacs has never been so fun
;;lean ; for folks with too much to prove
;;ledger ; be audit you can be
lua ; one-based indices? one-based indices
markdown ; writing docs for people to ignore
;;nim ; python + lisp at the speed of c
nix ; I hereby declare "nix geht mehr!"
;;ocaml ; an objective camel
2023-12-20 03:08:40 +01:00
(org +dragndrop +pandoc +pretty +gnuplot +roam2) ; organize your plain life in plain text
2023-09-21 02:46:05 +02:00
php ; perl's insecure younger brother
plantuml ; diagrams for confusing people more
;;purescript ; javascript, but functional
2023-12-20 03:08:40 +01:00
(python +lsp) ; beautiful is better than ugly
2023-09-21 02:46:05 +02:00
;;qt ; the 'cutest' gui framework ever
;;racket ; a DSL for DSLs
raku ; the artist formerly known as perl6
;;rest ; Emacs as a REST client
;;rst ; ReST in peace
;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"}
;;(rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap()
;;scala ; java, but good
;;(scheme +guile) ; a fully conniving family of lisps
2023-12-20 03:08:40 +01:00
(sh +lsp) ; she sells {ba,z,fi}sh shells on the C xor
2023-09-21 02:46:05 +02:00
;;sml
;;solidity ; do you need a blockchain? No.
;;swift ; who asked for emoji variables?
;;terra ; Earth and Moon in alignment for performance.
2023-12-20 03:08:40 +01:00
(web +lsp) ; the tubes
2023-09-21 02:46:05 +02:00
yaml ; JSON, but readable
2023-12-20 03:08:40 +01:00
(zig +lsp) ; C, but simpler
2023-09-21 02:46:05 +02:00
:email
2024-06-06 01:26:00 +02:00
(mu4e +org +gmail)
2023-09-21 02:46:05 +02:00
;;notmuch
;;(wanderlust +gmail)
:app
calendar
;;emms
everywhere ; *leave* Emacs!? You must be joking
;;irc ; how neckbeards socialize
(rss +org) ; emacs as an RSS reader
;;twitter ; twitter client https://twitter.com/vnought
:config
;;literate
2023-12-20 03:08:40 +01:00
(default +bindings))
2023-09-21 02:46:05 +02:00
2023-08-12 17:25:26 +02:00
#+end_src
2023-09-21 02:46:05 +02:00
2023-12-20 03:08:40 +01:00
#+RESULTS :
2023-08-12 17:25:26 +02:00
* packages.el
** Info from the included (default) comments:
To install a package with Doom you must declare them here and run 'doom sync' on the command line, then restart Emacs for the changes to take effect -- or use 'M-x doom/reload'.
*** Install from MELPA, ELPA or emacsmirror:
#+begin_src emacs-lisp :tangle no
(package! some-package)
#+end_src
*** Install a package directly from git repo:
Specify a ~:recipe~ . [[https://github.com/raxod502/straight.el#the-recipe-format ][Documentation. ]]
#+begin_src emacs-lisp :tangle no
(package! another-package :recipe (:host github
:repo "username/repo"))
#+end_src
If there is no PACKAGENAME.el file, or it's in a subdirectory, specify ~:files~ in the ~:recipe~ :
#+begin_src emacs-lisp :tangle no
(package! this-package
:recipe (:host github :repo "username/repo"
:files ("some-file.el" "src/lisp/ *.el")))
#+end_src
*** Disable packages included with Doom Emacs:
#+begin_src emacs-lisp :tangle no
~(package! builtin-package :disable t)~
#+end_src
*** Override package recipe:
If a property in a ~:recipe~ isn't specified, it will use defaults from Doom/MELPA/ELPA/Emacsmirror.
#+begin_src emacs-lisp :tangle no
(package! builtin-package :recipe (:nonrecursive t))
(package! builtin-package-2 :recipe (:repo "myfork/package"))
#+end_src
You can override the recipe of a built in package without having to
specify all the properties for `:recipe'. These will inherit the rest
of its recipe from Doom or MELPA/ELPA/Emacsmirror:
*** Install package from specific branch:
You can set the ~:branch~ property. This is required for some packages.
#+begin_src emacs-lisp :tangle no
(package! builtin-package :recipe (:branch "develop"))
#+end_src
*** Install a specific commit:
You can set ~:pin~ .
#+begin_src emacs-lisp :tangle no
(package! builtin-package :pin "1a2b3c4d5e")
#+end_src
*** Unpin a commit:
Doom's packages are pinned to a specific commit and updated from release to
release. You can ~unpin!~ them. Note ~(unpin! t)~ unpins all the packages and can break your Emacs.
#+begin_src emacs-lisp :tangle no
(unpin! pinned-package)
(unpin! pinned-package another-pinned-package)
(unpin! t)
2024-06-06 01:26:00 +02:00
#+end_src
2023-08-12 17:25:26 +02:00
** Packages:
*** Core
#+begin_src emacs-lisp :tangle packages.el
;; -*- no-byte-compile: t; -* -
;;; $DOOMDIR/packages.el
(unpin! straight)
(package! beacon)
(package! counsel)
(package! deft)
#+end_src
2023-08-22 13:06:03 +02:00
*** Themes
#+begin_src emacs-lisp :tangle packages.el
(package! all-the-icons)
(package! all-the-icons-dired)
(package! doom-themes)
#+end_src
2023-08-12 17:25:26 +02:00
*** Modes:
#+begin_src emacs-lisp :tangle packages.el
(package! battle-haxe)
(package! fish-mode)
(package! typescript-mode)
2024-06-06 01:26:00 +02:00
(package! terraform-mode)
2023-08-12 17:25:26 +02:00
(package! wc-mode)
2023-09-21 02:46:05 +02:00
(package! plantuml-mode)
(package! csv-mode)
2023-08-12 17:25:26 +02:00
#+end_src
2023-08-22 13:06:03 +02:00
*** dired
#+begin_src emacs-lisp :tangle packages.el
(package! dired-open)
#+end_src
2023-09-21 02:46:05 +02:00
*** various?
#+begin_src emacs-lisp :tangle packages.el
;; (package! helm-xref)
#+end_src
2023-12-20 03:08:40 +01:00
*** pdf-tools
#+begin_src emacs-lisp :tangle packages.el
(package! pdf-tools)
#+end_src
2023-08-22 13:06:03 +02:00
2023-09-21 02:46:05 +02:00
*** Org
2023-08-12 17:25:26 +02:00
#+begin_src emacs-lisp :tangle packages.el
2023-09-21 02:46:05 +02:00
;; Fix for org-roam link issue
(package! org-auto-tangle)
2023-10-15 22:16:55 +02:00
(package! ox-slack)
2023-12-20 03:08:40 +01:00
(package! ox-tufte)
2024-06-06 01:26:00 +02:00
(package! ox-gemini
:recipe (
:host sourcehut
:repo "abrahms/ox-gemini"))
2023-12-20 03:08:40 +01:00
(package! org-special-block-extras)
2023-10-15 22:16:55 +02:00
(package! org-transclusion)
2023-09-21 02:46:05 +02:00
(package! org-modern)
(package! org-ql)
(package! org-sidebar
:recipe (
:host github
:repo "alphapapa/org-sidebar"
))
2023-08-12 17:25:26 +02:00
(package! org-contacts)
2023-08-22 13:06:03 +02:00
(package! org-bullets)
(package! org-download)
2023-08-12 17:25:26 +02:00
(package! org-cliplink)
2023-09-21 02:46:05 +02:00
(package! org-roam)
2024-06-06 01:26:00 +02:00
;; (package! org-super-agenda)
2023-08-12 17:25:26 +02:00
(package! org-wild-notifier)
2024-06-06 01:26:00 +02:00
(package! org-habit-stats)
2023-08-12 17:25:26 +02:00
#+end_src
2024-06-06 01:26:00 +02:00
*** Yasnippet
#+begin_src emacs-lisp :tangle packages.el
#+end_src
2023-08-12 17:25:26 +02:00
*** Org-depend
Ensure task dependencies are met.
2023-09-21 02:46:05 +02:00
#+begin_src emacs-lisp :tangle no
2023-08-12 17:25:26 +02:00
(package! org-depend
:recipe (
:host github
:repo "fgeller/org-mode"
:files ("contrib/lisp/org-depend.el")))
#+end_src
2023-09-21 02:46:05 +02:00
*** org-edna
:PROPERTIES:
:ID: a6c4440f-10b5-4353-acc9-bfcab0a089a3
:END:
#+begin_src emacs-lisp :tangle packages.el
(package! org-edna)
(package! org-super-links
:recipe (
:type git
:host github
:repo "toshism/org-super-links"
:branch "develop"
))
#+end_src
2023-08-12 17:25:26 +02:00
*** Elgantt
2023-09-21 02:46:05 +02:00
:PROPERTIES:
:ID: 2d5897d1-6e8c-4163-a131-42daef5856cb
:END:
2023-08-12 17:25:26 +02:00
Pretty Gantt chart for your agenda.
#+begin_src emacs-lisp :tangle packages.el
(package! elgantt
:recipe (:host github :repo "legalnonsense/elgantt"))
#+end_src
2023-09-21 02:46:05 +02:00
*** mode-icons
#+begin_src emacs-lisp :tangle packages.el
(package! mode-icons)
#+end_src
*** qrencode
#+begin_src emacs-lisp :tangle packages.el
(package! qrencode)
#+end_src
*** hledger
#+begin_src emacs-lisp :tangle packages.el
(package! hledger-mode)
#+end_src
2024-06-06 01:26:00 +02:00
*** copilot.el
#+begin_src emacs-lisp :tangle no
(package! copilot
:recipe (:host github :repo "zerolfx/copilot.el" :files ("*.el" "dist")))
#+end_src
*** elpher
#+begin_src emacs-lisp :tangle packages.el
(package! elpher)
#+end_src
*** multiple-cursors
#+begin_src emacs-lisp :tangle packages.el
(package! multiple-cursors)
#+end_src
*** gptel
#+begin_src emacs-lisp :tangle packages.el
(package! gptel
:recipe (:host github
:repo "karthink/gptel"
:files ("*.el")))
#+end_src