(add-to-list 'load-path "~/.config/doom/elisp")
Yooooooooooo let’s go
;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-
;; Place your private configuration here! Remember, you do not need to run 'doom
;; sync' after modifying this file!
;; Some functionality uses this to identify you, e.g. GPG configuration, email
;; clients, file templates and snippets.
(setq user-full-name "Thomas F. K. Jorna"
user-mail-address "[email protected]")
;; 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!
(setq org-directory "~/OneDrive/org-roam/"
org-roam-directory "~/OneDrive/org-roam")
;; This determines the style of line numbers in effect. If set to `nil', line
;; numbers are disabled. For relative line numbers, set this to `relative'.
(setq display-line-numbers-type t)
;; Here are some additional functions/macros that could help you configure Doom:
;;
;; - `load!' for loading external *.el files relative to this one
;; - `use-package!' for configuring packages
;; - `after!' for running code after a package has loaded
;; - `add-load-path!' for adding directories to the `load-path', relative to
;; .
Basic things you can keep in place without being locked into nano
(setq nano-font-family-monospaced "Overpass Mono")
(setq nano-font-family-proportional "Noto Serif")
(setq nano-font-size 13)
;(defvar nano-theme-light-var t)
(require 'disp-table)
(require 'nano-theme-dark)
(require 'nano-theme-light)
;(require 'nano-layout)
;(require 'nano-base-colors)
(require 'nano-faces)
(nano-faces)
The real fun begins here
(require 'nano-theme)
(nano-theme)
(require 'nano-modeline)
;(require 'nano-writer)
;;(nano-theme)
;;
Obsolete function due to nano-toggle-face
(defun nano-change-theme-dark ()
(interactive)
(progn
(nano-theme-set-dark)
(nano-faces)
(nano-theme)))
(defun nano-change-theme-light ()
(interactive)
(progn
(nano-theme-set-light)
(nano-faces)
(nano-theme)))
(defun nano-change-theme ()
(interactive)
(if nano-theme-light-var (nano-change-theme-dark) (nano-change-theme-light))
(setq nano-theme-light-var (not nano-theme-light-var)))
I always want this, regardless of whether I am uisng nano or not.
(setq default-frame-alist
(append (list
;; '(font . "Roboto Mono Emacs Regular:size=14")
'(min-height . 1) '(height . 45)
'(min-width . 1) '(width . 81)
'(vertical-scroll-bars . nil)
'(internal-border-width . 40)
'(left-fringe . 0)
'(right-fringe . 0)
'(tool-bar-lines . 0)
'(menu-bar-lines . 0))))
; (setq centaur-tabs-style "wave")
; (setq centaur-tabs-set-bar 'under)
;; Note: If you're not using Spacmeacs, in order for the underline to display
;; correctly you must add the following line:
;(setq x-underline-at-descent-line t)
;;
;;; Packages
I’m either using nano or doom-theme, this is the latter
(setq doom-theme 'doom-flatwhite)
To set the fringes how i want them, i.e, in the opposite color of the background.
(add-hook! 'solaire-mode-hook
;(set-face-attribute 'solaire-fringe-face nil :background (face-background 'solaire-hl-line-face))
(set-face-attribute 'fringe nil :background (face-background 'solaire-default-face))
)
It’s nice to have both mono and proportional fonts in org-mode, but mostly proportional, as we are writing.
(use-package! mixed-pitch
:hook (org-mode . mixed-pitch-mode)
:config
(setq mixed-pitch-face 'variable-pitch))
There’s not a lot of good fonts I’ve noticed. Fira code is the one I keep coming back to.
(setq doom-font (font-spec :family "FiraCode Nerd Font" :size 15 :weight 'light)
doom-variable-pitch-font (font-spec :family "Roboto" :style "Regular" :size 12 :weight 'regular))
;; There are two ways to load a theme. Both assume the theme is installed and
;; available. You an either set `doom-theme' or manually load a theme with the
;; `load-theme' function. This is the default:
(defvar +modeline--old-bar-height nil)
;;;###autoload
(defun +modeline-resize-for-font-h ()
"Adjust the modeline's height when the font size is changed by
`doom/increase-font-size' or `doom/decrease-font-size'.
Meant for `doom-change-font-size-hook'."
(unless +modeline--old-bar-height
(setq +modeline--old-bar-height doom-modeline-height))
(let ((default-height +modeline--old-bar-height)
(scale (or (frame-parameter nil 'font-scale) 0)))
(setq doom-modeline-height
(if (> scale 0)
(+ default-height (* scale doom-font-increment))
default-height))))
;;;###autoload
(defun +modeline-update-env-in-all-windows-h (&rest _)
"Update version strings in all buffers."
(dolist (window (window-list))
(with-selected-window window
(when (fboundp 'doom-modeline-update-env)
(doom-modeline-update-env))
(force-mode-line-update))))
;;;###autoload
(defun +modeline-clear-env-in-all-windows-h (&rest _)
"Blank out version strings in all buffers."
(unless (featurep! +light)
(dolist (buffer (buffer-list))
(with-current-buffer buffer
(setq doom-modeline-env--version
(bound-and-true-p doom-modeline-load-string)))))
(force-mode-line-update t))
(use-package! doom-modeline
:hook (after-init . doom-modeline-mode)
:hook (doom-modeline-mode . size-indication-mode) ; filesize in modeline
:hook (doom-modeline-mode . column-number-mode) ; cursor column in modeline
:init
(unless after-init-time
;; prevent flash of unstyled modeline at startup
(setq-default mode-line-format nil))
;; We display project info in the modeline ourselves
(setq projectile-dynamic-mode-line nil)
;; Set these early so they don't trigger variable watchers
(setq doom-modeline-bar-width 3
doom-modeline-github nil
doom-modeline-mu4e nil
doom-modeline-persp-name nil
doom-modeline-minor-modes nil
doom-modeline-major-mode-icon nil
doom-modeline-buffer-file-name-style 'relative-from-project
;; Only show file encoding if it's non-UTF-8 and different line endings
;; than the current OSes preference
doom-modeline-buffer-encoding 'nondefault
doom-modeline-default-eol-type
(cond (IS-MAC 2)
(IS-WINDOWS 1)
(0)))
;; Fix modeline icons in daemon-spawned graphical frames. We have our own
;; mechanism for disabling all-the-icons, so we don't need doom-modeline to do
;; it for us. However, this may cause unwanted padding in the modeline in
;; daemon-spawned terminal frames. If it bothers you, you may prefer
;; `doom-modeline-icon' set to `nil'.
(when (daemonp)
(setq doom-modeline-icon t))
:config
;; HACK Fix #4102 due to empty all-the-icons return value (caused by
;; `doom--disable-all-the-icons-in-tty-a' advice) in tty daemon frames.
(defadvice! +modeline-disable-icon-in-daemon-a (orig-fn &rest args)
:around #'doom-modeline-propertize-icon
(when (display-graphic-p)
(apply orig-fn args)))
;; Fix an issue where these two variables aren't defined in TTY Emacs on MacOS
(defvar mouse-wheel-down-event nil)
(defvar mouse-wheel-up-event nil)
(add-hook 'after-setting-font-hook #'+modeline-resize-for-font-h)
(add-hook 'doom-load-theme-hook #'doom-modeline-refresh-bars)
(add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline)
(add-hook! 'magit-mode-hook
(defun +modeline-hide-in-non-status-buffer-h ()
"Show minimal modeline in magit-status buffer, no modeline elsewhere."
(if (eq major-mode 'magit-status-mode)
(doom-modeline-set-vcs-modeline)
(hide-mode-line-mode))))
;; Some functions modify the buffer, causing the modeline to show a false
;; modified state, so force them to behave.
(defadvice! +modeline--inhibit-modification-hooks-a (orig-fn &rest args)
:around #'ws-butler-after-save
(with-silent-modifications (apply orig-fn args))))
(defun doom-modeline--set-char-widths (alist)
"Set correct widths of icons characters in ALIST."
(while (char-table-parent char-width-table)
(setq char-width-table (char-table-parent char-width-table)))
(dolist (pair alist)
(let ((width 1)
(chars (cdr pair))
(table (make-char-table nil)))
(dolist (char chars)
(set-char-table-range table char width))
(optimize-char-table table)
(set-char-table-parent table char-width-table)
(setq char-width-table table))))
(after! doom-modeline
(setq doom-modeline-enable-word-count t
doom-modeline-header-line nil
;doom-modeline-hud nil
doom-themes-padded-modeline t
doom-flatwhite-brighter-modeline nil
doom-plain-brighter-modeline nil))
(add-hook! 'doom-modeline-mode-hook
(progn
(set-face-attribute 'header-line nil
:background (face-background 'mode-line)
:foreground (face-foreground 'mode-line))
))
Trying to make my own thing work
(after! doom-modeline
(doom-modeline-def-modeline 'main
'(bar matches buffer-info vcs word-count)
'(buffer-position misc-info major-mode)))
Very cool indicator of where you are in the buffer. Works not that well with `doom-modeline` though.
(use-package! mlscroll
:preface
;(setq mlscroll-mode-line-font-width 9)
:init
(message "Init mode line %s" 'mode-line)
(setq mlscroll-right-align nil)
(add-to-list 'mode-line-misc-info '(:eval (mlscroll-mode-line)) 'append)
(setq mlscroll-width-chars 15)
(setq mlscroll-border 6)
(setq mlscroll-in-color "#555555")
;(setq mlscroll-mode-line-font-width 9)
:config
(mlscroll-mode 1)
;(setq mlscroll-mode-line-font-with 9)
)
(use-package! dashboard
:init
(dashboard-setup-startup-hook)
;(setq initial-buffer-choice
; (lambda () (get-buffer "*dashboard*")))
:config
(setq dashboard-center-content t
dashboard-banner-logo-title "Emacs"
dashboard-startup-banner 'logo
dashboard-set-file-icons t
dashboard-set-heading-icons t
dashboard-set-init-info t
dashboard-week-agenda t
))
Love me some tabs, but the doom defaults could be better.
(after! centaur-tabs
(setq centaur-tabs-style "wave"))
The Doom defaults are nice, but I really dislike that the size of the posframe keeps changing. Also I want it to be on top and with some margin, which requires some extra config
(defvar ivy-posframewidth 120)
(setq ivy-posframe-width
(round (* 0.6 (frame-width))))
;; Please just keep the width fixed
(defun set-ivy-posframe-width ()
(progn
(setq ivy-posframe-width
(round (* 0.6 (frame-width))))
(setq ivy-posframe-parameters
`((min-width . 90)
(width . ,ivy-posframe-width)
(height . ,ivy-height)
))))
(defun posframe-poshandler-frame-top-center-margin (info)
"Posframe's position handler.
Get a position which let posframe stay onto its
parent-frame's top center. The structure of INFO can
be found in docstring of `posframe-show'."
(cons (/ (- (plist-get info :parent-frame-width)
(plist-get info :posframe-width))
2)
100))
(defun thomas/ivy-posframe-display-at-frame-top-center (str)
(ivy-posframe--display str #'posframe-poshandler-frame-top-center-margin))
(use-package! ivy-posframe
:hook (ivy-mode . ivy-posframe-mode)
:config
(add-hook! 'ivy-posframe-hook #'set-ivy-posframe-width)
(setq ivy-fixed-height-minibuffer nil
ivy-posframe-display-functions-alist '((t . thomas/ivy-posframe-display-at-frame-top-center))
ivy-posframe-border-width 2
ivy-posframe-parameters
`((min-width . 90)
(width . ,ivy-posframe-width)
(min-height . ,ivy-height)
(height . ,ivy-height)
))
;; default to posframe display function
;(setf (alist-get t ivy-posframe-display-functions-alist)
; #'+ivy-display-at-frame-center-near-bottom-fn)
;; posframe doesn't work well with async sources (the posframe will
;; occasionally stop responding/redrawing), and causes violent resizing of the
;; posframe.
(dolist (fn '(swiper counsel-rg counsel-grep counsel-git-grep))
(setf (alist-get fn ivy-posframe-display-functions-alist)
#'ivy-display-function-fallback))
(add-hook 'doom-after-reload-hook #'posframe-delete-all))
Allows you to jump in and out of latex fragments without using `C-c C-x C-l` all the time, beautiful.
(use-package! org-fragtog
:after org
:hook (org-mode . org-fragtog-mode)
)
Org-appear for everything else.
(use-package! org-appear
:after org
:hook (org-mode . org-appear-mode)
:config (setq
org-appear-autolinks t
org-appear-autoentities t
org-appear-autosubmarkers t ))
Buggy yet beautiful transclusion of org-content from another file in the current buffer. Very cool that this is possible, but I don’t use it consistently as the “code” is kind of a bitch to write and gets rid of org-roam links.
(use-package! org-transclusion
:after org-roam
)
Having zero-width spaces can be very useful /sometimes/!
(map! :map org-mode-map
:nie "C-M-SPC" (cmd! (insert "\u200B")))
Fantastic package which allows you to backlink etc.
(setq org-roam-v2-ack t)
(use-package! org-roam
:after org
:config
(setq org-roam-v2-ack t)
(setq org-roam-mode-sections
(list #'org-roam-backlinks-insert-section
#'org-roam-reflinks-insert-section
#'org-roam-unlinked-references-insert-section))
(org-roam-setup))
(defun org-roam-buffer-setup ()
"Function to make org-roam-buffer more pretty."
(progn
(setq-local olivetti-body-width 44)
(variable-pitch-mode 1)
(olivetti-mode 1)
(centaur-tabs-local-mode -1)
(set-face-background 'magit-section-highlight (face-background 'default))))
(after! org-roam
(add-hook! 'org-roam-mode-hook #'org-roam-buffer-setup))
My baby
(use-package! org-roam-ui
:after org-roam
:config
(setq org-roam-ui-open-on-start nil)
(setq org-roam-ui-browser-function #'xwidget-webkit-browse-url))
(after! org-roam
(setq org-roam-capture-templates
`(("s" "standard" plain "%?"
:if-new
(file+head "%<%Y%m%d%H%M%S>-${slug}.org"
"#+title: ${title}\n#+filetags: \n\n ")
:unnarrowed t)
("d" "definition" plain
"%?"
:if-new
(file+head "${slug}.org" "#+title: ${title}\n#+filetags: definition \n\n* Definition\n\n\n* Examples\n")
:unnarrowed t)
("r" "ref" plain "%?"
:if-new
(file+head "${citekey}.org"
"#+title: ${slug}: ${title}\n
\n#+filetags: reference ${keywords} \n
\n* ${title}\n\n
\n* Summary
\n\n\n* Rough note space\n")
:unnarrowed t)
("p" "person" plain "%?"
:if-new
(file+head "${slug}.org" "%^{relation|some guy|family|friend|colleague}p %^{birthday}p %^{address}p
#+title:${slug}\n#+filetags: :person: \n"
:unnarrowed t)))))
;; Since the org module lazy loads org-protocol (waits until an org URL is
;; detected), we can safely chain `org-roam-protocol' to it.
(use-package! org-roam-protocol
:after org-protocol)
(use-package! org-roam-server
:after org-roam
:config
(setq org-roam-server-host "127.0.0.1"
org-roam-server-port 8081
org-roam-server-authenticate nil
org-roam-server-export-inline-images t
org-roam-server-serve-files nil
org-roam-server-served-file-extensions '("pdf" "mp4" "ogv")
org-roam-server-network-poll t
org-roam-server-network-arrows nil
org-roam-server-network-label-truncate t
org-roam-server-network-label-truncate-length 60
org-roam-server-network-label-wrap-length 20
org-roam-server-network-vis-options "{\"physics\": {\"stabilization\": {\"iterations\": 100}}}"
;i;"{\"physics\": {\"enabled\": true, \"barnesHut\":{\"gravitationalConstant\" : -6000, \"avoidOverlap\" : 0.5, \"springLength\" : 200}, \"stabilization\": {\"enabled\": true, \"iterations\": 30}},
;;\"edges\": {\"physics\": true, \"hidden\": false, \"smooth\": {\"enabled\": false, \"type\": \"continuous\"}}}"
org-roam-server-cite-edge-dashes nil
org-roam-server-extra-cite-edge-options (list (cons 'width 3))
))
Org-roam server does not really work well with with `smart-parens` for some reason, this fixes that.
(defun org-roam-server-open ()
"Ensure the server is active, then open the roam graph."
(interactive)
(smartparens-global-mode -1)
(org-roam-server-mode 1)
(browse-url-xdg-open (format "http://localhost:%d" org-roam-server-port))
(smartparens-global-mode 1))
;; automatically enable server-mode
(after! org-roam
(smartparens-global-mode -1)
(org-roam-server-mode)
(smartparens-global-mode 1))
(use-package! org-ref
;:after org-roam
:config
(setq
org-ref-completion-library 'org-ref-ivy-cite
org-ref-get-pdf-filename-function 'org-ref-get-pdf-filename-helm-bibtex
org-ref-default-bibliography (list "/Users/thomas/OneDrive/org-roam/bib/Library.bib")
org-ref-bibliography-notes "/Users/thomas/OneDrive/org-roam/bibnotes.org"
org-ref-note-title-format "* %y - %t\n :PROPERTIES:\n :Custom_ID: %k\n :NOTER_DOCUMENT: %F\n :ROAM_KEY: cite:%k\n :AUTHOR: %9a\n :JOURNAL: %j\n :YEAR: %y\n :VOLUME: %v\n :PAGES: %p\n :DOI: %D\n :URL: %U\n :END:\n\n"
org-ref-notes-directory "/Users/thomas/OneDrive/org-roam/"
org-ref-notes-function 'orb-edit-notes
))
(after! org-ref
(setq
bibtex-completion-notes-path "/Users/thomas/OneDrive/org-roam/"
bibtex-completion-bibliography "/Users/thomas/OneDrive/org-roam/bib/Library.bib"
bibtex-completion-pdf-field "file"
bibtex-completion-notes-template-multiple-files
(concat
"#+TITLE: ${title}\n"
"#+ROAM_KEY: cite:${=key=}\n"
"* TODO Notes\n"
":PROPERTIES:\n"
":Custom_ID: ${=key=}\n"
":NOTER_DOCUMENT: %(orb-process-file-field \"${=key=}\")\n"
":AUTHOR: ${author-abbrev}\n"
":JOURNAL: ${journaltitle}\n"
":DATE: ${date}\n"
":YEAR: ${year}\n"
":DOI: ${doi}\n"
":URL: ${url}\n"
":END:\n\n"
)
)
)
Company-org-roam seemed like a good idea, but I never use it.
(use-package! company-org-roam
:after org-roam
:config
(set-company-backend! 'org-mode '(company-org-roam company-yasnippet company-dabbrev)))
ORB
(use-package! org-roam-bibtex
:after org-roam
:hook (org-mode . org-roam-bibtex-mode)
:config
(require 'org-ref)
(setq orb-preformat-keywords
'("citekey" "title" "url" "file" "author-or-editor" "keywords" "pdf" "doi" "author" "tags" "year" "author-bbrev")))
;)
Don’t really use this anymore since zotero got a pdf reader
(use-package! org-noter
:after (:any org pdf-view)
:config
(setq
;; The WM can handle splits
;;org-noter-notes-window-location 'other-frame
;; Please stop opening frames
;;org-noter-always-create-frame nil
;; I want to see the whole file
org-noter-hide-other nil
;; Everything is relative to the rclone mega
org-noter-notes-search-path "/Users/thomas/OneDrive/org-roam"
)
)
(use-package! org-pdftools
:hook (org-load . org-pdftools-setup-link))
(use-package! org-noter-pdftools
:after org-noter
:config
(with-eval-after-load 'pdf-annot
(add-hook 'pdf-annot-activate-handler-functions #'org-noter-pdftools-jump-to-note)))
nroam puts the org-roam buffer on the bottom, much more natural and less obstrustive, but not does cause some problems.
(use-package! nroam
:after org-roam
:config
(add-hook 'org-roam-mode-hook #'nroam-setup-maybe)
)
Outliners on the side, neat.
(use-package! org-ol-tree
:after org
:commands org-ol-tree
:hook (org-ol-tree-mode . visual-line-mode)
:config
(setq org-ol-tree-ui-window-auto-resize nil
org-ol-tree-ui-window-max-width 0.3
org-ol-tree-ui-window-position 'left))
(map! :map org-mode-map
:after org
:localleader
:desc "Outline" "O" #'org-ol-tree)
You know what I hate? Organized lists. No but when I’m writing I don’t want org’s usual indentation and stars and all that bullshit, I want it to look like a wordprocessor, so no stars!
(defun org-mode-remove-stars ()
(font-lock-add-keywords
nil
'(("^\\*+ "
(0
(prog1 nil
(put-text-property (match-beginning 0) (match-end 0)
'invisible t)))))))
(add-hook! 'org-mode-hook #'org-mode-remove-stars)
;; hide title / author ... keywords
;;; Ugly org hooks
(defun nicer-org ()
(progn
(+org-pretty-mode 1)
(mixed-pitch-mode 1)
(hl-line-mode -1)
(display-line-numbers-mode -1)
(olivetti-mode 1)
;(org-num-mode 1)
(org-superstar-mode -1)
(org-indent-mode -1)
))
(add-hook! 'org-mode-hook #'nicer-org)
fuckin latex For some reason it can’t find the dang latex executable, so we’re just adding the path to it by hand like some sort of caveman
(setq org-preview-latex-process-alist
'((dvipng
:programs ("/Library/TeX/texbin/latex" "/Library/TeX/texbin/dvipng")
:description "dvi > png"
:message "you need to install the programs: latex and dvipng."
:image-input-type "dvi"
:image-output-type "png"
:image-size-adjust (1.0 . 1.0)
:latex-compiler ("/Library/TeX/texbin/latex -interaction nonstopmode -output-directory %o %f")
:image-converter ("/Library/TeX/texbin/dvipng -D %D -T tight -bg Transparent -o %O %f"))
(dvisvgm
:programs ("/Library/TeX/texbin/latex" "/Library/TeX/texbin/dvisvgm")
:description "dvi > svg"
:message "you need to install the programs: latex and dvisvgm."
:image-input-type "dvi"
:image-output-type "svg"
:image-size-adjust (1.7 . 1.5)
:latex-compiler ("/Library/TeX/texbin/latex -interaction nonstopmode -output-directory %o %f")
:image-converter ("/Library/TeX/texbin/dvisvgm %f -n -b min -c %S -o %O"))
(imagemagick
:programs ("latex" "convert")
:description "pdf > png"
:message "you need to install the programs: latex and imagemagick."
:image-input-type "pdf"
:image-output-type "png"
:image-size-adjust (1.0 . 1.0)
:latex-compiler ("pdflatex -interaction nonstopmode -output-directory %o %f")
:image-converter
("convert -density %D -trim -antialias %f -quality 100 %O"))))
(after! org
(setq org-startup-with-latex-preview 1 ;always preview latex
org-latex-create-formula-image-program 'dvipng
LaTeX-command "/Library/TeX/texbin/latex"
latex-run-command "/Library/TeX/texbin/latex"
org-startup-with-inline-images 1 ;always preview images
;org-hide-leading-stars 1
org-startup-indented nil ; don't indent
; org-startup-folded nil
org-hidden-keywords '(filetags title author date startup roam_tags)
org-pretty-entities 1 ; show unicode characters
org-num-max-level 3 ; no 1.1.1.2
org-indirect-buffer-display 'other-window
line-spacing 3 ; let me B R E A T H E
)
(setenv "PATH" (concat (getenv "PATH") ":/Library/TeX/texbin")))
Sometimes I want to move a tree to an indirect buffer, but sometimes I want to put it in another window, sometimes the same one, and sometimes to another frame. By default there are no functions for this but are controlled by org-indirect-buffer-display
. This is a hacky way of achieving this
(defun +org-tree-to-indirect-buffer-options (option)
(let* ((old-value org-indirect-buffer-display))
(progn
(setq org-indirect-buffer-display option)
(org-tree-to-indirect-buffer)
(setq org-indirect-buffer-display old-value))))
(defun +org-tree-to-indirect-other-window ()
(interactive)
(+org-tree-to-indirect-buffer-options 'other-window))
(defun +org-tree-to-indirect-current-window ()
(interactive)
(+org-tree-to-indirect-buffer-options 'current-window))
(defun +org-tree-to-indirect-dedicated-frame ()
(interactive)
(+org-tree-to-indirect-buffer-options 'dedicated-frame))
A lil bigger. No a lil smaller. Peeerrrfect.
(after! org
(custom-set-faces!
'((org-block) :background nil)
)
(defface redd
'((((class color) (min-colors 88) (background light))
:foreground "red"))
"Red."
:group 'basic-faces)
(custom-set-faces!
;'(org-document-title :height 1.6 :weight bold)
'(org-level-1 :height 1.3 :weight extrabold :slant normal)
'(org-level-2 :height 1.2 :weight bold :slant normal)
'(org-level-3 :height 1.1 :weight regular :slant normal)
;'(org-document-info :inherit 'nano-face-faded)
'(org-document-title ;:foreground ,(doom-color 'black)
:family "Roboto"
:height 250
:weight medium)))
I want to be able to do some kind of custom highlighting, so = becomes red
.
(after! org
(setq org-emphasis-alist
'(("*" (bold))
("/" italic)
("_" underline)
("=" redd)
("~" code)
("+" (:strike-through t)))))
Ideally I would be able to add my own custom bullshit in here, but I don’t know how to do that.
Yns make them pretty
(after! org
(setq org-ellipsis " ▾ ")
(appendq! +ligatures-extra-symbols
`(:checkbox "☐"
:pending "◼"
:checkedbox "☑"
:list_property "∷"
:em_dash "—"
:ellipses "…"
:arrow_right "→"
:arrow_left "←"
:title nil
:subtitle "𝙩"
:author "𝘼"
:date "𝘿"
:property ""
:options "⌥"
:startup "⏻"
:macro "𝓜"
:html_head "🅷"
:html "🅗"
:latex_class "🄻"
:latex_header "🅻"
:beamer_header "🅑"
:latex "🅛"
:attr_latex "🄛"
:attr_html "🄗"
:attr_org "⒪"
:begin_quote "❝"
:end_quote "❞"
:caption "☰"
:header "›"
:results "🠶"
:begin_export "⏩"
:end_export "⏪"
:properties ""
:end "∎"
:priority_a ,(propertize "⚑" 'face 'all-the-icons-red)
:priority_b ,(propertize "⬆" 'face 'all-the-icons-orange)
:priority_c ,(propertize "■" 'face 'all-the-icons-yellow)
:priority_d ,(propertize "⬇" 'face 'all-the-icons-green)
:priority_e ,(propertize "❓" 'face 'all-the-icons-blue)
:roam_tags nil
:filetags nil))
(set-ligatures! 'org-mode
:merge t
:checkbox "[ ]"
:pending "[-]"
:checkedbox "[X]"
:list_property "::"
:em_dash "---"
:ellipsis "..."
:arrow_right "->"
:arrow_left "<-"
:title "#+title:"
:subtitle "#+subtitle:"
:author "#+author:"
:date "#+date:"
:property "#+property:"
:options "#+options:"
:startup "#+startup:"
:macro "#+macro:"
:html_head "#+html_head:"
:html "#+html:"
:latex_class "#+latex_class:"
:latex_header "#+latex_header:"
:beamer_header "#+beamer_header:"
:latex "#+latex:"
:attr_latex "#+attr_latex:"
:attr_html "#+attr_html:"
:attr_org "#+attr_org:"
:begin_quote "#+begin_quote"
:end_quote "#+end_quote"
:caption "#+caption:"
:header "#+header:"
:begin_export "#+begin_export"
:end_export "#+end_export"
:results "#+RESULTS:"
:property ":PROPERTIES:"
:end ":END:"
:priority_a "[#A]"
:priority_b "[#B]"
:priority_c "[#C]"
:priority_d "[#D]"
:priority_e "[#E]"
:roam_tags "#+roam_tags:"
:filetags "#+filetags:")
(plist-put +ligatures-extra-symbols :name "⁍")
)
(with-eval-after-load 'org
(plist-put org-format-latex-options :background 'default))
Oh yeah this is definitely working for me I’ve definitely changed as a person.
It’s pretty good, but it doesn’t do my organizing for me sadly.
(use-package! org-gtd
:after org
:config
;; where org-gtd will put its files. This value is also the default one.
(setq org-gtd-directory "~/OneDrive/org-roam/")
;; package: https://github.com/Malabarba/org-agenda-property
;; this is so you can see who an item was delegated to in the agenda
(setq org-agenda-property-list '("DELEGATED_TO"))
;; I think this makes the agenda easier to read
(setq org-agenda-property-position 'next-line)
;; package: https://www.nongnu.org/org-edna-el/
;; org-edna is used to make sure that when a project task gets DONE,
;; the next TODO is automatically changed to NEXT.
(setq org-edna-use-inheritance t)
(org-edna-load)
:bind
(("C-c d c" . org-gtd-capture) ;; add item to inbox
("C-c d a" . org-agenda-list) ;; see what's on your plate today
("C-c d p" . org-gtd-process-inbox) ;; process entire inbox
("C-c d n" . org-gtd-show-all-next) ;; see all NEXT items
("C-c d s" . org-gtd-show-stuck-projects)) ;; see projects that don't have a NEXT item
:init
(bind-key "C-c c" 'org-gtd-clarify-finalize)) ;; the keybinding to hit when you're done editing an item in the processing phase
Because you can’t trust custom.el
(setq org-agenda-files '("~/OneDrive/org-roam/inbox" "~/OneDrive/org-roam/actionable.org"
"~/OneDrive/org-roam/agenda.org" "~/OneDrive/org-roam/incubate.org"
"~/OneDrive/org-roam/openquestions.org"))
Set some capture templates, which I rarely use tbrqhwy
(after! org
(setq org-capture-templates `(("i" "Inbox"
entry (file "~/OneDrive/org-roam/inbox.org")
"* %?\n%U\n\n %i"
:kill-buffer t)
("l" "Todo with link"
entry (file "~/OneDrive/org-rom/inbox.org")
"* %?\n%U\n\n %i\n %a"
:kill-buffer t)
("m" "Meeting"
entry (file+headline "/Users/thomas/OneDrive/org-roam/agenda.org" "Future")
,(concat "* TODO %? :meeting:\n" "<%<%Y-%m-%d %a %H:00>>"))
("o" "Open Question Thesis"
entry (file+headline "~/OneDrive/org-roam/openquestions.org" "Questions")
"* OPEN %? \n %U\n")))
(set-face-attribute 'org-headline-done nil :strike-through t)
)
Why yes, I also copied this one example from the org-super-agenda
github, how could you tell?
This does not work nearly as well as I would like it to, like, utility wise. Way too long, way too much information, bubububuh. I want more of a calendar than an agenda I think.
(use-package! org-super-agenda
:hook (org-agenda-mode . org-super-agenda-mode)
)
(setq org-agenda-skip-scheduled-if-done t
org-agenda-skip-deadline-if-done t
org-agenda-include-deadlines t
org-agenda-include-diary t
org-agenda-block-separator nil
org-agenda-compact-blocks t
org-agenda-start-with-log-mode t
org-agenda-start-day nil)
(setq org-agenda-custom-commands
'(("d" "Get Things DONE"
((agenda "" ((org-agenda-span 1)
(org-super-agenda-groups
'((:name "Today"
:time-grid t
:date nil
:todo "TODAY"
:scheduled nil
:order 1)))))
(alltodo "" ((org-agenda-overriding-header "")
(org-super-agenda-groups
'((:discard (:todo "TODO"))
(:name "Important"
:tag "Important"
:priority "A"
:order 1)
(:name "Due Today"
:deadline today
:order 2)
(:name "Due Soon"
:deadline future
:order 8)
(:name "Overdue"
:deadline past
:order 7)
(:name "Thesis"
:tag "thesis"
:order 10)
(:name "ESN"
:tag "esn"
:order 12)
(:name "JOTE"
:tag "jote"
:order 13)
(:name "Emacs"
:tag "emacs"
:order 14)
(:name "Home"
:tag "home"
:order 30)
(:name "Waiting"
:todo "WAITING"
:order 20)
(:name "Notes"
:tag "notes"
:order 20)
;(:name "Open Questions"
; :todo "OPEN"
; :order 3)
(:name "trivial"
:priority<= "C"
:tag ("Trivial" "Unimportant")
:todo ("SOMEDAY" )
:order 90)
(:discard (:tag ("Chore" "Routine" "Daily")))))))))))
I want notifications to work so bad but it just isn’t working :(
Seems like alert
is not working, should fix that at some point.
(use-package! org-notifications
:init (org-notifications-start) )
Nice big border with the color of the fringe
(setq default-frame-alist
(append (list
;; '(font . "Roboto Mono Emacs Regular:size=14")
'(min-height . 1) '(height . 45)
'(min-width . 1) '(width . 81)
'(vertical-scroll-bars . nil)
'(internal-border-width . 30)
'(left-fringe . 0)
'(right-fringe . 0)
'(tool-bar-lines . 0)
'(menu-bar-lines . 0))))
(add-hook! 'solaire-mode-hook (set-face-background 'internal-border (face-background 'fringe)))
(set-frame-parameter nil 'internal-border-width 60)
Lil’ minor mode which gives you a nice distraction free header and footer. At the moment its automatically enabled in org-mode, but I would like it to only be enabled in “writing” buffers, not sure how to implement that yet though.
(defvar writing-header--default-format header-line-format
"Storage for the default `mode-line-format'.
So it can be restored when 'writer-header-line-mode' is disabled.")
(defvar writing-modeline--default-format mode-line-format)
(define-minor-mode writing-header-line-mode
"Adds a bar with the same color as the fringe as the header-line.
Imitates the look of wordprocessors a bit."
:init-value nil
:global nil
(if writing-header-line-mode
(progn
(setq header-line-format
(concat
(propertize " " 'display (list 'space :width 'left-fringe) 'face 'fringe)
(propertize " " 'display (list 'space :width 'left-margin) 'face (list (list :height 400) 'default))
(propertize " " 'display (list 'space :width 'text) 'face (list (list :height 400) 'default))
;(propertize (format " %dW" (count-words (point-min) (point-max))) 'face 'default)
(propertize " " 'display (list 'space :width 'left-margin) 'face (list (list :height 400) 'default))
;;(propertize (format " %dW" (count-words (point-min) (point-max))) 'face 'fringe)
;; '("" mode-line-misc-info)
(propertize " " 'display (list 'space :width 'left-fringe) 'face 'fringe))) ;
(setq mode-line-format header-line-format))
(setq header-line-format writing-header--default-format
mode-line-format writing-modeline--default-format)))
;; -------------------------------------------------------------------
;; A proof of concept for a multi header or mode line
;;
;; Multi line header or mode line is made possible by generating an
;; SVG image made of two small lines of text. It is certainly memory
;; hungry but it seems to be fast enough to display line/column while
;; typing text. It can probably be extended in a number of ways.
;;
;; Feel free to modify it for your own needs.
;; -------------------------------------------------------------------
(require 'svg)
(defun tag (line-1 font-size-1 font-family-1 foreground-1
line-2 font-size-2 font-family-2 foreground-2
left)
(let* ((font-size-1 (or font-size-1 14))
(char-width-1 (* font-size-1 0.6))
(char-height-1 (+ font-size-1 0.0))
(width-1 (* char-width-1 20))
(height-1 (+ (* char-height-1 2) 1))
(font-size-2 (or font-size-2 14))
(char-width-2 (* font-size-2 0.6))
(char-height-2 (+ font-size-2 0.0))
(width-2 (* char-width-2 20))
(height-2 (+ (* char-height-2 2) 1))
(width (max width-1 width-2))
(height (max height-1 height-2))
(x1 (if left 0 (- width (* char-width-1 (+ (length line-1) .0)))))
(x2 (if left 0 (- width (* char-width-2 (+ (length line-2) .0)))))
(y1 char-height-1)
(y2 (+ (* char-height-2 2) 1))
(svg (svg-create width height)))
(svg-text svg line-1
:font-family font-family-1
:font-size font-size-1 :fill foreground-1
:x x1 :y y1)
(svg-text svg line-2
:font-family font-family-2
:font-size font-size-2 :fill foreground-2
:x x2 :y y2)
svg))
(define-key mode-line-major-mode-keymap [header-line]
(lookup-key mode-line-major-mode-keymap [mode-line]))
(defun mode-line-render (left right)
(let* ((available-width (- (window-width) (length left))))
(format (format "%%s %%%ds" available-width) left right)))
(setq header-line-format
'((:eval
(mode-line-render
(format-mode-line
(propertize (make-string 20 ?\ )
'display (svg-image
(tag (format-mode-line "%m") 12 "Roboto Mono Light" "#00008b"
(format-mode-line "%b") 14 "Roboto Mono" "black"
t) :ascent 100)))
(format-mode-line
(propertize (make-string 18 ?\ )
'display (svg-image
(tag (format-mode-line "GNU Emacs 26.3 ") 12 "Roboto Mono Light" "#00008b"
(format-mode-line "%4l:%2c") 12 "Roboto Mono Light" "#999999"
nil) :ascent 100)))))))
(defcustom double-modeline-margin-inner-height 60
"inner"
:type 'integer)
(defcustom double-modeline-margin-outer-height 10
"outer"
:type 'integer)
(after! org
(require 'svg))
(defun make-svg-rectangle (width height-1 bg-1 height-2 bg-2)
(let* ((svg (svg-create width (+ height-1 height-2))))
(svg-rectangle svg 0 0 width height-1 :fill-color bg-1)
(svg-rectangle svg 0 height-1 width height-2 :fill-color bg-2)
svg))
(defun make-svg-rectangles (width height-1 bg-1 &rest other)
(let* ((temptt 0)
(height-temp height-1)
(svg (svg-create width
(+ height-1
(dotimes
(i (/ (length other) 2) temptt)
(setq temptt
(+
(nth (* i 2) other)
temptt)))))))
(svg-rectangle svg 0 0 width height-1 :fill-color bg-1)
(when other
(dotimes (i (/ (length other) 2))
(svg-rectangle svg 0
(if (eq i 0) height-1
(setq-local height-temp
(+ height-temp
(nth (* (- i 2) 2) other))))
width
(nth (* i 2) other)
:fill-color (nth (+ (* i 2) 1) other))))
svg))
(defun mode-line-compose (height-1 bg-1 height-2 bg-2
header)
(let* ((fringe-width (car (window-fringes nil)))
(body-width (window-body-width nil t))
(margin-width (* (frame-char-width)
(+ (car (window-margins))
(cdr (window-margins))))))
(concat
(format-mode-line
(propertize " " 'display (svg-image
(make-svg-rectangle fringe-width height-1
bg-1 height-2 bg-1))))
(format-mode-line
(propertize " " 'display (svg-image
(if header
(make-svg-rectangle
(+ margin-width body-width)
height-1 bg-1 height-2 bg-2)
(make-svg-rectangle
(+ margin-width body-width)
height-2 bg-2 height-1 bg-1)))))
(format-mode-line
(propertize " " 'display (svg-image
(make-svg-rectangle fringe-width height-1
bg-1 height-2 bg-1)))))))
(defvar double-modeline--default-header-format header-line-format
"Storage for the default `mode-line-format'.
So it can be restored when 'writer-header-line-mode' is disabled.")
(defvar double-modeline--default-modeline-format mode-line-format)
(define-minor-mode double-header-line-mode
"Adds a bar with the same color as the fringe as the header-line.
Imitates the look of wordprocessors a bit."
:init-value nil
:global nil
(if double-header-line-mode
(progn
(set-face-attribute 'mode-line nil :box nil)
(set-face-attribute 'header-line nil :box nil)
(set-face-attribute 'mode-line-inactive nil :box nil)
(setq header-line-format '((:eval (mode-line-compose
double-modeline-margin-outer-height
(face-background 'fringe)
double-modeline-margin-inner-height
(face-background 'default)
t
))))
(setq mode-line-format '((:eval (mode-line-compose
double-modeline-margin-outer-height
(face-background 'fringe)
double-modeline-margin-inner-height
(face-background 'default)
nil
)))))
(setq header-line-format 'double-modeline--default-header-format
mode-line-format 'double-modeline--default-modeline-format)))
(after! olivetti-mode (setq double-modeline-margin-inner-height (round (* 0.6 (* (frame-char-width) (car (window-margins)))))))
(use-package! page-break-mode)
(defun change-page-break ()
(interactive)
(font-lock-add-keywords 'org-mode
`((,page-delimiter
;; variable with the regexp (usually "^\f" or "^^L")
0
(prog1 nil
;(compose-region (match-beginning 0) (match-end 0) "")
;(testtest)
(put-text-property (match-beginning 0) (match-end 0)
'display (svg-image (make-svg-rectangles
;; just to be sure
(* 3 (window-body-width nil t))
30 "red" 40 "yellow" 30 "red"))
;(put-text-property (match-beginning 0) (match-end 0) 'display (make-svg-rectangle (window-body-width nil t) 40 (face-background 'fringe) 30 (face-background 'default)))
)) t))))
(defun change-page-break ()
(interactive)
(font-lock-add-keywords 'org-mode
`((,page-delimiter
;; variable with the regexp (usually "^\f" or "^^L")
0
(prog1 nil
;(compose-region (match-beginning 0) (match-end 0) "")
;(testtest)
;(put-text-property (match-beginning 0) (match-end 0) 'display (make-svg-rectangle (window-body-width nil t) 40 (face-background 'fringe) 30 (face-background 'default)))
;; don't display ^L
(make-line-break (* (frame-char-width) (car (window-margins)))
(face-background 'default) 40 (face-background 'fringe))) t))))
(defun make-line-break (h1 bg1 h2 bg2)
(compose-region (match-beginning 0) (match-end 0) "")
;; make an overlay (like in hl-line)
(let ((pdl (make-overlay (line-beginning-position) (line-beginning-position 2))))
(overlay-put pdl 'put-image t)
;(overlay-put pdl 'after-string
; (propertize "x"
; 'display (list (list 'margin 'left-margin)
; (svg-image (make-svg-rectangles (* (frame-char-width) (car (window-margins))) h1 bg1 h2 bg2 h1 bg1 )))))
(overlay-put pdl 'before-string
(concat
(propertize "x"
'display (list (list 'margin 'right-margin)
(svg-image (make-svg-rectangles (* (frame-char-width) (car (window-margins))) h1 bg1 h2 bg2 h1 bg1))))
(propertize "x"
'display (list (list 'margin 'left-margin)
(svg-image (make-svg-rectangles (* (frame-char-width) (car (window-margins))) h1 bg1 h2 bg2 h1 bg1 ))))))
(overlay-put pdl 'map image-map)
(overlay-put pdl 'display (svg-image (make-svg-rectangles (- (window-body-width nil t) 0 ) h1 bg1 h2 bg2 h1 bg1)))
(overlay-put pdl 'modification-hooks
;; these arguments are received from modification-hooks
'((lambda (overlay after-p begin end &optional length)
(delete-overlay overlay))))
(overlay-put pdl 'insert-in-front-hooks '((lambda (overlay after-p begin end &optional length)
(delete-overlay overlay))))))
This should go somewhere else
(after! org (change-page-break))
(defun testtest ()
(interactive)
(aayyy 30 (face-background 'default) 40 (face-background 'fringe)))
(defun aayyy (h1 bg1 h2 bg2)
(progn
;(concat
;(propertize " "
;'display '((margin left-margin) "a"))
;(propertize " "
; 'display '((margin right-margin) "b"))
(insert-image (svg-image (make-svg-rectangles (* (frame-char-width) (car (window-margins))) h1 bg1 h2 bg2 h1 bg1)) nil 'left-margin)
(insert-image (svg-image (make-svg-rectangles (* (frame-char-width) (cdr (window-margins))) h1 bg1 h2 bg2 h1 bg1)) nil 'right-margin)
(insert (propertize " "
'display (svg-image (make-svg-rectangles (window-body-width nil t) h1 bg1 h2 bg2 h1 bg1))))
))
This basically sets up the structure for how I want the minor-mode to work. It’s not very complicated and there are probably a lot of edge cases, but its rather close to what I want ti
(defun change-lines-hook ()
(unless (check-if-we-need-to-change-anything)
(disable-all-my-overlays)
(put-overlays)))
;;either
(add-hook! 'after-save-hook 'change-lines-hook)
;;or, much too expensive probably.
(add-hook! 'after-change-functions 'change-lines-hook)
;mwah maybe okay, org-num-verify also does this and it's somewhat complicated. Really depends on how hard it is to change things.
(defun check-if-no-annoying-env ()
;; some regex which determines where we are in basically anything that's not a paragraph, such as a heading, a latex environment, a link , a table, or a src block
;; There's probably a function that already does this
;; This is not super important for environtments since the overlay won't be part of the text, but it do be kind of annoying
;(org-at-table-p)
;(org-at-property-p)
;(org-at-property-drawer-p)
;(org-at-property-block-p)
;(org-at-block-p)
;(org-at-heading-p)
;(org-at-heading-or-item-p)
;(org-at-planning-p)
;check whether we are in a paragraph and not a latex section
(and (eq (car (org--paragraph-at-point) 'headline))
(not (latex))))
(define-minor-mode auto-page-break-overlay-mode nil
"Adds out page breaks, neat."
:global nil
:group wysiwyg
(if auto-page-break-overlay-mode
(setq some-defaults-i-need-to-rememeber)
(progn
(run-once)
(add-hooks)
;change-lines
)
(progn ;else
(remove-my-overlays)
(remove-hooks)
;change-lines
(setq-default some-defaults-i-need-to-remember)
))
)
Big problem with visual line approach is that you cannot scale past a certain point, only until the margins run out, when it suddenly scaling becomes bigger font size. I need to make this work with olivetti mode better, or if necessary implement it myself. Don’t really want to do that though, would rather rely on olivetti mode.
;; custom pagebreakinterval
(defcustom pagebreakinterval 40)
;; getting visual line number pos
(defun get-visual-line-number-pos (number)
...
)
;; putting the overlay there
(defun put-overlays ()
(dotimes (i (/ (count-screen-lines) pagebreakinterval))
(make-overlay (visual-line-number (* pagebreakinterval i)) ;start
(same) ;end
'display (svg-image (rectangle)) ;
)))
;;
(defun check-if-we-need-to-change-anything ()
"Check if we need to change anything."
(dolist (list-of-overlays overlay)
(if (eq (position overlay) (* pagebreakinterval i)) t
(add-to-list 'overlays-to-change (overlay . new-pos)))))
;; some way of making sure that stays like it should
Another way of keeping track of position would be keeping track of the number of charachters and setting, somewhat intelligently, a “characters of a certain size per page”.
- Pros
- Don’t care about changing lines
- Finding nth carachter is easier
- Cons
- Can happen in the middle of a visual line (would be on me to compute that). This makes inserting the page-break even trickier
- Possibly more computation heavy, but probably not, the other thing is already very heavy
;;similar as above, only the (check-if-we-need-to-change-anything)
;; and (put-overlays) need to change
(defcustom number-of-charchters-per-page 2500
"Page is like 500 words, word has 5 characters by default, badabing badoom.")
(defun put-overlays-chars ()
(dotimes (i (round (/ (char-count) number-of-characters-per-page)))
(if (check-if-no-annoying-env)
(make-overlay (* number-of-charachters-per-page i)
(same)
'display etc)
(progn ;else
(make-overlay (+ (* number-of-charachters-per-page i) (check-closest-distance-to-safety)) ;;maybe do it anyway if it's too far
etc
)
)
)))
ANSWER: I should use both! Count characters, but also lines: if there are too many lines, pagebreak, if there are too many characters, page break as well! Maybe just use the lines then anyway.
One of the big problems i need to solve (or opitons i need to provide) is whether zooming=zooming or zooming=scaling, i.e. does it just change the visual appearance of everything or does it increase the font size? I think the best would be if that were two options, and by default it would do it badly like you would expect, and then I provide a new command which keeps everything nice.
The main problem now is that the margins do not scale at all when zooming. This is probably something mr olivetti can fix, but I should take it into account nonetheless.
I should just create a list with pages. Either with line or character positions. I can update this instead of the page immediately, should save some trouble.
(setq page-list (0))
I would like to not only have pages, but give them a page number, you know, for that extra pizzaz.
The way to do this is probably to
a) keep track of page numbers, see above
b) give make-svg-rectangles
the possibility of having a page number displayed
c) give the big assigning function/minor mode the tools to assign it to it
;; for the svg
(defun make-svg-rectangles h1 bg1 &opt page &rest other
"yayayya"
;;let part
..
...
...
;; actual svg part
(when page
(svg-text svg
page ; maybe have options for roman numerals at some point
:font-size 60 ;idk
:x (round (/ (margin-width-pixel) 2))
:y (/ h1 2)
:text-anchor "middle"
:fill-color (foreground-color 'comment)
))
)
I want thing to be in the middle, and with olivetti mode the fringes become larger so it looks like a word processor, fantastic!
(use-package! olivetti
:after org
;:hook (olivetti-mode . double-header-line-mode)
:config
(setq olivetti-min-body-width 50
olivetti-body-width 80
olivetti-style 'fancy ; fantastic new layout
olivetti-margin-width 12)
(add-hook! 'olivetti-mode-hook (window-divider-mode -1))
(add-hook! 'olivetti-mode-hook (set-face-attribute 'window-divider nil :foreground (face-background 'fringe) :background (face-background 'fringe)))
(add-hook! 'olivetti-mode-hook (set-face-attribute 'vertical-border nil :foreground (face-background 'fringe) :background (face-background 'fringe)))
)
(require 'org-inlinetask)
;(use-package! org-sidebar
; :after org
; :config
;(setq org-sidebar-default-fns '(org-sidebar--todo-items))
;(add-hook! 'org-sidebar-window-after-display-hook (solaire-mode 1))
; )
(after! org
(remove-hook 'org-agenda-finalize-hook '+org-exclude-agenda-buffers-from-workspace-h)
(remove-hook 'org-agenda-finalize-hook
'+org-defer-mode-in-agenda-buffers-h))
(defun thomas/org-get-overview ()
"Open outline and sidebar."
(progn
(org-ol-tree)
(org-sidebar)))
Pretty cool: focus only the paragraph you’re looking at. Don’t really use it though.
(use-package! focus
:after org-roam
:config
(add-to-list 'focus-mode-to-thing '(org-mode . paragraph))
)
;(require 'nano-writer)
Increase the font-size a bit in org-mode
FIXME: This is not how you do that dipshit This increas the font size every singe time you open an org file, not ideal.
(add-hook! 'org-mode-hook (doom/increase-font-size 1))
I would like org-mode to look and behave differently depending on what kind of note I’m visiting. Sometimes I want to write in an undistracted environment, sometimes I want to take notes and see a lot of things, sometimes I am configuring this thing and other times I’m going through my tasks: there’s no real reason for org to look the same for all of these, and in fact that will probably end up more distracting than anything.
I’m not sure what the best way of going about this is, but I’m thinking a minor mode will do.
(define-minor-mode org-profile-mode
"Sets a profile of hooks and minor-modes depending on the file-name."
:init-value nil
:global t
(when org-profile-mode
(when (eq major-mode 'org-mode)
(cond
((string-match-p "[0-9]\\{14\\}" buffer-file-name)
(message "Note buffer"))
((string-match-p "config.org" buffer-file-name)
(message "Config buffer"))
((string-match-p "chapter" buffer-file-name)
(message "chapter buffer"))
((org-agenda-file-p buffer-file-name)
(message "org-agenda buffer")
))
)))
Something like: if file name contains YYYYMMDD-whatever.org, notes profile. If file name is in org-agedenda, GTD profile. Else, writing? No, would be better to have writing be a separate tag/file name thing.
You should be able to indefinitely add profiles. This could be a big list, but that would get kind of hard and I don’t know how those work.
For now I can just hard code it, it’s fine.
Guaranteed not stolen. Thank you Prot
;;;;;
;;
;; Custom Minor Modes
;;
;;;;;
(define-minor-mode prot/scroll-center-cursor-mode
"Toggle centred cursor scrolling behavior"
:init-value nil
:lighter " S="
:global nil
(if prot/scroll-center-cursor-mode
(setq-local scroll-margin (* (frame-height) 2)
scroll-conservatively 0
maximum-scroll-margin 0.5)
(dolist (local '(scroll-preserve-screen-position
scroll-conservatively
maximum-scroll-margin
scroll-margin))
(kill-local-variable `,local)))
)
Make everything variable pitch, who the hell likes reading fixed-pitch?
(define-minor-mode prot/variable-pitch-mode
"Toggle 'mixed-pitch-modei, except for programming modes"
:init-value nil
:global nil
(if prot/variable-pitch-mode
(unless (derived-mode-p 'prog-mode)
(variable-pitch-mode 1))
(variable-pitch-mode -1)))
NO line numbers.
(define-minor-mode prot/display-line-number-mode
"Disable line numbers, except for programming modes."
:init-value nil
:global nil
(if prot/display-line-number-mode
(unless (derived-mode-p 'prog-mode)
(display-line-numbers-mode -1))
(display-line-numbers-mode 1)))
Throw everything together, but in a bad way. I don’t use this anymore, but it did work, except for nano’s writing mode, which was very hacky.
(define-minor-mode thomas/writing-mode
"Toggle mixed-pitch-mode, center-text, scroll-center and disable line numbers, in writing modes."
:init-value nil
:global nil
(if thomas/writing-mode
(unless (derived-mode-p 'prog-mode)
(nano/writer-mode 1)
(prot/display-line-number-mode 1)
(prot/variable-pitch-mode 1)
(prot/scroll-center-cursor-mode 1)
(olivetti-mode 1)
(focus-mode 1)
(org-fragtog-mode 1)
(org-roam-buffer-deactivate)
(hl-line-mode -1)
(org-indent-mode -1)
(minimap-mode)
;(centaur-tabs-mode -1)
;(org-mode-restart)
)
(prot/display-line-number-mode -1)
(prot/variable-pitch-mode -1)
(prot/scroll-center-cursor-mode -1)
(nano/writer-mode -1)
(olivetti-mode -1)
(focus-mode -1)
(org-fragtog-mode -1)
;(centaur-tabs-mode 1 )
(org-indent-mode 1)
(minimap-mode -1)
;;(org-mode-restart)
))
(defun thomas/writing-mode-fun ()
"Toggle mixed-pitch-mode, center-text, scroll-center and disable line numbers, in writing modes."
;;(interactive)
(org-superstar-mode -1)
(require 'nano-writer)
(writer-mode)
(prot/display-line-number-mode 1)
(prot/mixed-pitch-mode 1)
(prot/scroll-center-cursor-mode 1)
(olivetti-mode 1)
)
(defun writer-mode--num-format (numbering)
"Alternative numbering format for org-num.
First level: 1 | xxx
Second level: 1.1 — xxx
Third level: 1.1.1 - xxx
etc."
(if (= (length numbering) 1)
(propertize (concat (mapconcat
#'number-to-string
numbering ".") " | " )
'face `(:family "Roboto Condensed"
:height 250
:foreground ,nano-color-faded))
(propertize (concat (mapconcat
#'number-to-string
numbering ".") " — " )
'face `(:family "Roboto Condensed"
:foreground ,nano-color-faded))))
;; Specific face for headline stars
;(font-lock-add-keywords 'writer-mode
; '(("^*+ " 0 `(:family "Roboto Mono"
; :height 140
; :foreground ,nano-color-faded) prepend)
; ) 'append)
(defun writer-mode--compute-prefixes ()
"Compute prefix strings for regular text and headlines."
(setq org-indent--heading-line-prefixes
(make-vector org-indent--deepest-level nil))
(setq org-indent--inlinetask-line-prefixes
(make-vector org-indent--deepest-level nil))
(setq org-indent--text-line-prefixes
(make-vector org-indent--deepest-level nil))
(let* ((min-indent 5)
(indent (+ 1 (seq-max
(org-element-map
(org-element-parse-buffer) 'headline
#'(lambda (item)
(org-element-property :level item))))))
(indent (max indent min-indent)))
(dotimes (n org-indent--deepest-level)
(aset org-indent--heading-line-prefixes n
(make-string
(min indent (max 0 (- indent 1 n))) ?\s))
(aset org-indent--inlinetask-line-prefixes n
(make-string indent ?\s))
(aset org-indent--text-line-prefixes n
(make-string indent ?\s)))))
(define-minor-mode nano/writer-mode
"Minor mode which makes writing a lot nicer by moving all the headllines to the left."
:init-value nil
:global nil
;; Faces
(face-remap-add-relative 'org-level-1
:height 180)
(face-remap-add-relative 'org-level-2
:height 160)
(face-remap-add-relative 'org-level-3
:height 150)
(face-remap-add-relative 'org-document-info
:inherit 'nano-face-faded)
(face-remap-add-relative 'org-document-title
:foreground (face-foreground 'default)
:family "Roboto Slab"
:height 200
:weight 'medium)
;; hide title / author ... keywords
(setq-local org-hidden-keywords '(title author date startup))
;; Header line
(setq header-line-format nil)
;; Layout
(setq fill-column 72)
(setq-default line-spacing 1)
;; Indentation
(setq org-startup-folded nil)
(org-indent-mode)
(setq org-level-color-stars-only nil)
(setq org-hide-leading-stars nil)
(advice-add 'org-indent--compute-prefixes :override
#'writer-mode--compute-prefixes)
;; Numbering
(setq org-num-skip-unnumbered t)
(setq org-num-skip-footnotes t)
(setq org-num-max-level 3)
(setq org-num-face nil)
(org-num-mode)
(setq org-num-format-function 'writer-mode--num-format))
;; Fringe shit
;;
(setq solaire-mode-remap-fringe nil)
;(set-face-background 'solaire-fringe-face (face-background 'solaire-hl-line-face))
(setq thomas-fringe-size 500)
(setq thomas-margin-size 10)
; "Variable which sets the size of the fringes."
; :type 'integer
; :group 'thomas-aesthetics)
(after! solaire-mode
(define-minor-mode thomas-fringe-mode
"Minor mode to hide the mode-line in the current buffer."
:init-value nil
:group 'thomas-aesthetics
(if (not thomas-fringe-mode)
(progn
(set-face-background 'solaire-fringe-face (face-background 'solaire-default-face))
(setq left-fringe-width nil
right-fringe-width nil))
(progn (set-face-background 'solaire-fringe-face (face-background 'solaire-hl-line-face))
(setq left-fringe-width thomas-fringe-size
right-fringe-width thomas-fringe-size
left-margin-width thomas-margin-size
right-margin-width thomas-margin-size)))))
;(add-hook! 'org-mode-hook #'thomas-fringe-mode)
(add-hook! thomas-fringe-mode-hook (custom-set-faces! '(solaire-fringe-face :background (face-background))))
;(setq solaire-mode-remap-fringe nil)
Why does it not simply do what I intend?
;;;;;;;;
;;
;; org-latex-export
;;
;;;;;;;;
(after! org
(add-to-list 'org-latex-classes
'("tufte"
"\\documentclass{tufte-book}"
("\\part{%s}" . "\\part*{%s}")
("\\chapter{%s}" . "\\chapter*{%s}")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
(add-to-list 'org-latex-classes
'("memoir"
"\\documentclass{memoir}"
("\\part{%s}" . "\\part*{%s}")
("\\chapter{%s}" . "\\chapter*{%s}")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}"))
)
(setq org-latex-text-markup-alist '((bold . "\\textbf{%s}")
(code . protectedtexttt)
(italic . "\\emph{%s}")
(strike-through . "\\sout{%s}")
(underline . "\\uline{%s}")
(verbatim . "{\\color{red}%s}")))
(setq org-latex-default-packages-alist
'(
;("AUTO" "inputenc" t
; ("pdflatex"))
;("T1" "fontenc" t
; ("pdflatex"))
("utf8" "inputenc" nil)
("" "graphicx" t)
("" "grffile" t)
("" "longtable" nil)
("" "wrapfig" nil)
("" "rotating" nil)
("normalem" "ulem" t)
("" "amsmath" t)
("" "textcomp" t)
("" "amssymb" t)
("" "capt-of" nil)
("style=apa, backend=biber" "biblatex" nil)
("" "braket" nil)
("" "xcolor" nil)
("" "hyperref" nil))
)
(setq org-latex-pdf-process
'("latexmk -shell-escape -bibtex -pdf %f -f")
org-latex-compiler "xelatex"
org-latex-bib-compiler "biber")
)
;(add-to-list 'org-latex-default-packages-alist
; '("" "xcolor" nil))
;(add-to-list 'org-latex-default-packages-alist
; '("" "braket" nil))
;(add-to-list 'org-latex-default-packages-alist '("style=apa, backend=biber" "biblatex" nil)))
;(setq org-format-latex-header (concat org-format-latex-header "\n\\")))
My eternal enemy
I almost always want to fuck around with the fonts, so XeTeX is pretty much necessary. Although I would really like to learn LuaTex, I just haven’t really seen any cool usecases of it.
(add-hook! 'latex-mode-hook (setq TeX-engine 'xetex) 99)
; (call-process TeX-shell nil (TeX-process-buffer-name file) nil
; TeX-shell-command-option (concat command file))))
(after! latex
(defun latex-dwim ()
"Compile the current file if it's a .tex file using LaTeXMK.
Otherwise compile the TeX file with the same name as the current TeXey file,
such as a .cls or .bib.
Otherwise compile all the .tex files you find using LaTexMK."
(interactive)
(save-buffer)
(if-let ((files (thomas/find-tex-file))
(command
"latexmk -pdf -pdflatex=lualatex --synctex=1 -interaction=nonstopmode -file-line-error ")
(hook (nth 2 (assoc "LatexMk" TeX-command-list))))
(if (stringp files)
(TeX-run-format "LatexMk" (concat command files) files)
(dolist (file files)
(TeX-run-format "LatexMk" (concat command file) file)))
(message "No file found, whoops.")))
(defun thomas/find-tex-file ()
"Find the correct TeX file(s)."
(let* ((fname (buffer-file-name))
(ext (file-name-extension fname))
(potential-main (f-join (f-slash (f-parent fname)) (concat (f-base fname) ".tex")))
(alltex (f-entries (f-parent fname) (lambda (f) (f-ext-p f "tex"))))
(correct-file
(cond ((string= ext "tex")
fname)
((seq-contains-p '("bib" "cls" "sty") ext)
(if (f-exists-p potential-main)
potential
alltex))
(t nil))))
correct-file)))
(map! :map 'doom-leader-regular-map
:desc "LatexMk dwim" "l" #'latex-dwim)
Pretty useful, and looks cool. I almost always want it on, so let’s just add a hook for that.
(add-hook! 'after-init-hook #'treemacs)
Get rid of that fugly divider
(after! treemacs
(add-hook! 'treemacs-mode-hook (setq window-divider-mode -1
variable-pitch-mode 1
treemacs-follow-mode 1))
)
Emacs regex sucks. Luckily, there are packages which make this much better, including making changes visual.
(use-package! visual-regexp
:config
(map! :map 'doom-leader-regular-map
(:prefix ("v" . "visual regex")
:desc "Replace regexp" "r"#'vr/replace)))
(use-package! visual-regexp-steroids
:after 'visual-regexp)
(use-package! devdocs
:after lsp
:config
(add-hook! 'devdocs-mode-hook
(face-remap-add-relative 'variable-pitch '(:family "Noto Sans"))))
LSP auto format is nice, but not as configurable as prettier, better let prettier handle it.
(add-hook! 'after-init-hook
(progn
(setq-hook! 'typescript-mode-hook +format-with :nil)
(add-hook! 'typescript-mode-hook 'prettier-mode)
(setq-hook! 'rjsx-mode-hook +format-with :nil)
(add-hook! 'rjsx-mode-hook 'prettier-mode)
(setq-hook! 'js2-mode-hook +format-with :nil)
(add-hook! 'js2-mode-hook 'prettier-mode)
(setq-hook! 'typescript-tsx-mode-hook +format-with :nil)
(add-hook! 'typescript-tsx-mode-hook 'prettier-mode)
))
The future is here.
(use-package! eva
:init
(setq ess-history-file "~/OneDrive/self/data/.Rhistory")
(setq ess-ask-for-ess-directory nil)
(setq eva-ai-name "Ea"
eva-user-name "Thomas"
eva-user-birthday "2021-07-16"
eva-user-short-title "Bruh"
eva-fallback-to-emacs-idle t)
(setq eva--idle-secs-fn #'eva--idle-secs-gnome)
(setq eva-idle-log-path "~/OneDrive/self/data/idle.tsv")
(setq eva-buffer-focus-log-path "~/OneDrive/self/data/buffer-focus.tsv")
(setq eva-buffer-info-path "~/OneDrive/self/data/buffer-info.tsv")
(setq eva-main-ledger-path "~/OneDrive/self/journal/finances/l.ledger")
(setq eva-main-datetree-path "~/OneDrive/org-roam/diary.org")
:config
(setq org-journal-dir "~/OneDrive/org-roam/journal")
(setq org-journal-file-format "%F.org")
(require 'eva-builtin)
(require 'eva-activity)
(add-hook 'eva-after-load-vars-hook #'eva-check-dangling-clock)
(add-hook 'eva-after-load-vars-hook #'eva-check-org-variables)
(setq eva-items
(list
(eva-item-create :fn #'eva-greet
:min-hours-wait 1)
(eva-item-create :fn #'eva-query-mood
:dataset "~/OneDrive/self/data/mood.tsv"
:min-hours-wait 1)
(eva-item-create :fn #'eva-query-activity
:dataset "~/OneDrive/self/data/activities.tsv"
:min-hours-wait 1)
(eva-item-create :fn #'eva-present-diary
:max-successes-per-day 1)
(eva-item-create :fn #'eva-query-weight
:dataset "~/OneDrive/self/data/weight.tsv"
:max-entries-per-day 1)
(eva-item-create :fn #'eva-plot-weight
:max-entries-per-day 1)
(eva-item-create :fn #'eva-query-sleep
:dataset "~/OneDrive/self/data/sleep.tsv"
:min-hours-wait 5
:lookup-posted-time t)
(eva-item-create :fn #'eva-present-ledger-report)
(eva-item-create :fn #'eva-present-org-agenda)
(eva-item-create :fn #'eva-query-ingredients
:dataset "~/OneDrive/self/data/ingredients.tsv"
:min-hours-wait 5)
(eva-item-create :fn #'eva-query-cold-shower
:dataset "~/OneDrive/self/data/cold.tsv"
:max-entries-per-day 1)
;; you can inline define the functions too
(eva-item-create
:fn (eva-defun my-bye ()
(message (eva-emit "All done for now."))
(bury-buffer (eva-buffer-chat)))
:min-hours-wait 0)))
(transient-replace-suffix 'eva-dispatch '(0)
'["General actions"
("q" "Quit" bury-buffer)
("l" "View Ledger report" eva-present-ledger-report)
("f" "View Ledger file" eva-present-ledger-file)
("a" "View Org agenda" org-agenda-list)])
(define-key eva-chat-mode-map (kbd "l") #'eva-present-ledger-report)
(define-key eva-chat-mode-map (kbd "a") #'org-agenda-list)
;; Activities
(setq eva-activity-list
(list (eva-activity-create :name "sleep"
:cost-false-pos 3
:cost-false-neg 3)
(eva-activity-create :name "studying"
:cost-false-pos 8
:cost-false-neg 8)
(eva-activity-create :name "coding"
:cost-false-pos 5
:cost-false-neg 5)
(eva-activity-create :name "working"
:cost-false-pos 5
:cost-false-neg 5)
(eva-activity-create :name "unknown"
:cost-false-pos 0
:cost-false-neg 0)))
(eva-mode))
(require 'nano-mu4e)
(require 'nano-agenda)
Misc
;;;;;;;;;;;;;
;;;
;;; Other
;;;
;;;;;;;;;;;;
(setq vterm-shell "/usr/bin/fish")
(setq evil-escape-key-sequence "qd")
I would like to use tree-sitter instead of font-lock, but it does not really work well with .tsx and org-mode, so for now it will remain here.
;(use-package! tree-sitter
; :config
; (require 'tree-sitter-langs)
; (global-tree-sitter-mode)
; (add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode))
;(use-package tree-sitter-langs
; :ensure t
; :after tree-sitter
; :config
; (tree-sitter-require 'tsx)
;(add-to-list 'tree-sitter-major-mode-language-alist '(typescript-tsx-mode . tsx)))
Colors in the info box, jeej.
(use-package! info-colors
:commands (info-colors-fontify-node))
(add-hook 'Info-selection-hook 'info-colors-fontify-node)
I just map everything to SPC-r because doom is not using it and r stands for roam.
(map! :leader
(:prefix-map ("r" . "regular")
:desc "find file" "f" #'org-roam-node-find
:desc "find ref" "F" #'org-roam-ref-find
:desc "center scroll" "s" #'prot/scroll-center-cursor-mode
:desc "start taking notes" "S" #'org-noter
:desc "toggle buffer" "b" #'org-roam-buffer-toggle
:desc "insert note" "i" #'org-roam-node-insert
:desc "server" "g" #'org-roam-server
:desc "quit notes" "q" #'org-noter-kill-session
:desc "tag (roam)" "t" #'org-roam-tag-add
:desc "tag (org)" "T" #'org-set-tags-command
:desc "pomodoro" "p" #'org-pomodoro
:desc "change nano-theme" "n" #'nano-toggle-theme
:desc "rebuid db" "d" #'org-roam-db-build-cache
:desc "cite" "c" #'helm-bibtex
:desc "thesaurus this word" "w" #'powerthesaurus-lookup-word-at-point
:desc "thesaurus lookup word" "W" #'powerthesaurus-lookup-word
:desc "outline" "o" #'org-ol-tree
(:prefix ("r" . "orui")
:desc "orui-mode" "r" #'org-roam-ui-mode
:desc "zoom" "z" #'orui-node-zoom
:desc "open" "o" #'orui-open
:desc "local" "l" #'orui-node-local
:desc "sync theme" "t" #'orui-sync-theme
:desc "follow" "f" #'orui-follow-mode)
(:prefix ("m" . "transclusion")
:desc "make link" "m" #'org-transclusion-make-from-link
:desc "transclusion mode" "t" #'org-transclusion-mode
:desc "add at point" "a" #'org-transclusion-add-at-point
:desc "add all in buffer" "A" #'org-transclusion-add-all-in-buffer
:desc "remove at point" "r" #'org-transclusion-remove-at-point
:desc "remove all in buffer" "R" #'org-transclusion-remove-all-in-buffer
:desc "start live edit" "s" #'org-transclusion-live-sync-start-at-point
:desc "stop live edit" "S" #'org-transclusion-live-sync-exit-at-point)
)
(:prefix ("d" . "GTD")
:desc "process inbox" "p"#'org-gtd-process-inbox
:desc "agenda list" "a"#'org-agenda-list
:desc "capture" "c"#'org-gtd-capture
:desc "show next" "n" #'org-gtd-show-all-next
:desc "show stuck project" "s" #'org-gtd-show-stuck-projects)
)
The default window movement keys are super cumbersome, here are some better defaults.
(map! "C-w" nil)
(global-set-key (kbd "C-<tab>") #'evil-window-next)
(global-set-key (kbd "C-<iso-lefttab>") #'evil-window-prev)
(global-set-key (kbd "C-w") #'ace-window)
(map!
:nvig "C-<iso-lefttab>" #'evil-window-prev
:nvig "C-w" #'ace-window)
(map! :nvig "C-<tab>" #'evil-window-next)
Wow, I wish I knew this was a thing before
(map! :nvig "C-'" #'er/expand-region)
I use the Workman keyboard layout, this package sets most of the evil shortcuts to more sensible positions. I still need to add some more specific shortcuts, for instance for moving windows.
(evil-workman-global-mode t)
(evil-define-key '(normal)
"n" 'evil-next-visual-line
"e" 'evil-previous-visual-line
)
This does not fix the window bindings, so we have to do that manually
(map!
:map evil-window-map
"y" #'evil-window-left
"Y" #'+evil/window-move-left
"n" #'evil-window-down
"N" #'+evil/window-move-down
"e" #'evil-window-up
"E" #'+evil/window-move-up
"o" #'evil-window-right
"O" #'+evil/window-move-right)
This does not apply them to org-mode, which uses evil-org.el, but those are easily customized
(defun set-evil-keybindings ()
(progn
;(iscroll-mode 1)
(setq evil-org-movement-bindings
'((up . "e")
(down . "n")
(left . "y")
(right . "o")))
(evil-define-key 'normal evil-org-mode-map
"o" 'evil-forward-char
"l" 'evil-org-open-below
"L" 'evil-org-open-above
"gy" 'org-backward-element
"gn" 'org-down-element
"ge" 'org-up-element
"go" 'org-forward-element
"n" 'evil-next-visual-line
"e" 'evil-previous-visual-line
; "n" 'iscroll-forward-line
; "e" 'iscroll-previous-line
"N" 'evil-next-line
"E" 'evil-previous-line
(kbd "C-n") 'follow-scroll-up
(kbd "C-e") 'follow-scroll-down
"zn" '+org-tree-to-indirect-other-window
"zs" '+org-tree-to-indirect-current-window
"zv" '+org-tree-to-indirect-other-frame)
))
(after! org (set-evil-keybindings))
;; JUST TO BE REALLY FUCKING SURE
(add-hook 'org-mode-hook #'set-evil-keybindings 99)
(defun iscroll-mode-keybinds ()
(when (eq iscroll-mode t)
(evil-define-key 'normal evil-org-mode-map
"n" 'iscroll-forward-line
"e" 'iscroll-previous-line)))
(add-hook! 'org-mode-hook #'iscroll-mode)
(add-hook! 'iscroll-mode-hook #'iscroll-mode-keybinds)
(use-package! all-the-icons-ivy-rich
:init (all-the-icons-ivy-rich-mode))
Add .mdx support
(add-to-list 'auto-mode-alist '("\\.mdx\\'" . markdown-mode))
(defun margin-width-pixel (&optional right)
"Return the width of the left or optionally right margin in pixels."
(if (window-margins)
(if right
(* (frame-char-width) (cdr (window-margins))) ;;right margin
(* (frame-char-width) (car (window-margins))))
0))
(defun org-latex-refresh ()
(interactive)
(progn
(org-clear-latex-preview)
(org--latex-preview-region (buffer-end -1) (buffer-end 1))))
(defun org-latex-clear-preview ()
(interactive)
(org-clear-latex-preview))
Binder Org-marginalia …
Make olivetti mode margins scale with the text size better
Smaller headings, they are a bit ridiculous. Zoom in a bit by default.
I want some way to have emacs recognize settings based on either the title of the org file or its tags. The way I set things up is not conducive for every situation.
Not sure yet.
Colorful theme so you can see the parentheses well. No flyspell etc.
Less extreme distraction freeness, possibility to open multiple notes Sans serif Nroam/org-roam-buffer Little EAF window with the map Treemacs?
Distraction free layout with olivetti Org num Marginalia Serif
Works, but “forward-line” is very slow compared to “evil-next-visual-line”, should make that compatible with both.
Emacs daemon gives me nothing but headaches. This is not ideal, but it at least works.
(server-start)