From 2ece7032558cd0be673d65237a01c5e6ffe625f1 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Sat, 19 Nov 2022 15:21:44 +0000 Subject: Move to a GNU Stow config --- doom/.config/doom/abbrev-defs | 9 + doom/.config/doom/config.org | 1409 +++++++++++++++++++++++++++++++++++++++++ doom/.config/doom/init.el | 188 ++++++ doom/.config/doom/packages.el | 75 +++ doom/abbrev-defs | 9 - doom/config.org | 1409 ----------------------------------------- doom/init.el | 188 ------ doom/packages.el | 75 --- 8 files changed, 1681 insertions(+), 1681 deletions(-) create mode 100644 doom/.config/doom/abbrev-defs create mode 100644 doom/.config/doom/config.org create mode 100644 doom/.config/doom/init.el create mode 100644 doom/.config/doom/packages.el delete mode 100644 doom/abbrev-defs delete mode 100644 doom/config.org delete mode 100644 doom/init.el delete mode 100644 doom/packages.el (limited to 'doom') diff --git a/doom/.config/doom/abbrev-defs b/doom/.config/doom/abbrev-defs new file mode 100644 index 0000000..b9b6d7e --- /dev/null +++ b/doom/.config/doom/abbrev-defs @@ -0,0 +1,9 @@ +;;-*-coding: utf-8;-*- +(define-abbrev-table 'global-abbrev-table + '( + ("alth" "although" nil :count 1) + ("bc" "because" nil :count 0) + ("th" "though" nil :count 0) + ("vc" "Vericert" nil :count 0) + )) + diff --git a/doom/.config/doom/config.org b/doom/.config/doom/config.org new file mode 100644 index 0000000..6b9534b --- /dev/null +++ b/doom/.config/doom/config.org @@ -0,0 +1,1409 @@ +#+title: Org configuration +#+property: header-args:emacs-lisp :tangle config.el + +* Top-Level Configuration + +#+begin_src emacs-lisp +(setq doom-font (font-spec :family "Iosevka YMHG Medium" :size 16)) +(when (eq system-type 'darwin) + (setq doom-variable-pitch-font (font-spec :family "Alegreya" :size 20)) + (setq doom-serif-font (font-spec :family "Alegreya" :size 20))) +#+end_src + +#+begin_src emacs-lisp +(setq org-directory "~/Dropbox/org/") + +(setq display-line-numbers-type nil) +;; Remove the ring for emacs +(setq ring-bell-function 'ignore) +;; Automatically refresh files +(global-auto-revert-mode 1) +(setq auto-revert-verbose nil) + +;; Set sentence to end with double space +(setq sentence-end-double-space t) +;; Remove automatic `auto-fill-mode', and replace it by `visual-line-mode', which is a personal +;; preference. +(setq-default fill-column 100) +;;(remove-hook 'text-mode-hook #'auto-fill-mode) +(add-hook 'text-mode-hook #'auto-fill-mode) +;;(add-hook 'text-mode-hook #'+word-wrap-mode) +;;(add-hook 'text-mode-hook #'visual-fill-column-mode) +;;;; Removes performance problems with opening coq files. +(add-to-list 'doom-detect-indentation-excluded-modes 'coq-mode) + +;; Projectile compilation buffer not there anymore for some reason +(setq compilation-buffer-name-function #'compilation--default-buffer-name) + +;; optimisations from https://200ok.ch/posts/2020-09-29_comprehensive_guide_on_handling_long_lines_in_emacs.html +(setq-default bidi-paragraph-direction 'left-to-right) +(if (version<= "27.1" emacs-version) + (setq bidi-inhibit-bpa t)) + +(setq abbrev-file-name + "~/.config/doom/abbrev-defs") +(add-hook 'text-mode-hook #'abbrev-mode) +#+end_src + +#+begin_src emacs-lisp +(use-package ef-themes + :defer nil + :bind ("" . ef-themes-select) + :config + (custom-theme-set-faces! ef-themes-collection + '(proof-locked-face :inherit hl-line) + '(proof-queue-face :inherit region)) + (setq ef-themes-height-0 2.0736 + ef-themes-height-1 1.728 + ef-themes-height-2 1.44 + ef-themes-height-3 1.2 + ef-themes-height-4 1.0 + ef-themes-height-5 1.0 + ef-themes-height-6 1.0 + ef-themes-height-7 1.0 + ef-themes-height-8 1.0) + (setq doom-theme 'ef-autumn)) + +(use-package modus-themes + :defer nil + :init + ;; Add all your customizations prior to loading the themes + (setq modus-themes-region '(bg-only no-extend)) + + ;; Load the theme files before enabling a theme + (modus-themes-load-themes) + (custom-theme-set-faces! '(modus-vivendi modus-operandi) + '(proof-locked-face :inherit modus-themes-nuanced-cyan) + '(proof-queue-face :inherit modus-themes-nuanced-magenta)) + :config + ;; Load the theme of your choice: + ;;(modus-themes-load-operandi) ;; OR (modus-themes-load-vivendi) + ;;:bind ("" . modus-themes-toggle)) + ) +#+end_src + +#+begin_src emacs-lisp +;; Disable stuff +(global-prettify-symbols-mode -1) +(electric-indent-mode -1) +(menu-bar-mode -1) + +(add-hook 'text-mode-hook (lambda () (company-mode -1))) +#+end_src + +#+begin_src emacs-lisp +(use-package! projectile + :config + (add-to-list 'projectile-globally-ignored-directories ".direnv")) +#+end_src + +** Key Binding Customisations + +#+begin_src emacs-lisp +;; Stop emacs from freezing when trying to minimize it on a tiling WM. +(global-unset-key (kbd "C-z")) +(global-set-key (kbd "M-u") #'upcase-dwim) +(global-set-key (kbd "M-l") #'downcase-dwim) +(global-set-key (kbd "M-c") #'capitalize-dwim) +(global-set-key (kbd "C-c z") #'quick-calc) +(global-set-key (kbd "") #'revert-buffer) +(global-set-key (kbd "C-.") (lambda () (interactive) (other-window -1))) +(global-set-key (kbd "C-,") #'other-window) +(global-set-key (kbd "C-c l") #'org-store-link) +(global-set-key (kbd "C-c a") #'org-agenda) +(global-set-key (kbd "C-c /") #'avy-goto-word-1) +(global-set-key (kbd "M-=") #'count-words) +(global-set-key (kbd "C-x m") #'+notmuch/compose) +(global-set-key (kbd "C-M-x") #'scroll-other-window-down) + +;; Set undo-only correctly +(global-set-key (kbd "C-\\") 'undo-only) + +;; Revert C-a and C-e to go to the beginning and end of line, not a fan of the +;; default smart functions. +(global-set-key (kbd "C-a") #'beginning-of-line) +(global-set-key (kbd "C-e") #'end-of-line) + +;; Define functions to push and pop from mark. +(defun push-mark-no-activate () + "Pushes `point' to `mark-ring' and does not activate the region + Equivalent to \\[set-mark-command] when \\[transient-mark-mode] is disabled" + (interactive) + (push-mark (point) t nil) + (message "Pushed mark to ring")) + +(defun jump-to-mark () + "Jumps to the local mark, respecting the `mark-ring' order. + This is the same as using \\[set-mark-command] with the prefix argument." + (interactive) + (set-mark-command 1)) + +(global-set-key (kbd "C-`") #'push-mark-no-activate) +(global-set-key (kbd "M-`") #'jump-to-mark) + +;; Swap two window positions. +(defun y/swap-windows () + "Swaps two windows and leaves the cursor in the original one" + (interactive) + (ace-swap-window) + (aw-flip-window)) + +(defun ymhg/pass (query) + "Return the password as a string from QUERY." + (s-trim (shell-command-to-string (concat "pass show " query)))) + +;; Define a custom key map for other useful commands. +(define-prefix-command 'y-map) +(global-set-key (kbd "C-c y") 'y-map) + +(define-key y-map (kbd "p") #'password-store-copy) +(define-key y-map (kbd "q") #'password-store-otp-token-copy) +(define-key y-map (kbd "i") #'password-store-insert) +(define-key y-map (kbd "g") #'password-store-generate) +;(define-key y-map (kbd "r") #'toggle-rot13-mode) +(define-key y-map (kbd "c") #'calendar) +(define-key y-map (kbd "C-r") #'ymhg/reload-keywords) +(define-key y-map (kbd "d") #'y/insert-date) +(define-key y-map (kbd "C-g") #'org-zettelkasten-goto-id) +(define-key y-map (kbd "C-t") #'org-babel-detangle) +(define-key y-map (kbd "C-l") #'org-agenda-open-link) +(define-key y-map (kbd "C-p") #'org-previous-link) +(define-key y-map (kbd "C-n") #'org-next-link) +(define-key y-map (kbd "s") + (lambda () (interactive) + (let ((org-agenda-files + '("~/Dropbox/zk/hls.org" + "~/Dropbox/zk/computing.org" + "~/Dropbox/zk/verification.org" + "~/Dropbox/zk/mathematics.org" + "~/Dropbox/zk/hardware.org"))) (org-search-view)))) + +(setq browse-url-handlers + '(("wikipedia\\.org" . eww-browse-url) + ("yannherklotz\\.com" . eww-browse-url) + ("ymhg\\.org" . eww-browse-url) + ("archlinux\\.org" . eww-browse-url) + ("sachachua\\.com" . eww-browse-url) + ("comonad\\.com" . eww-browse-url) + ("drewdevault\\.com" . eww-browse-url) + ("wordpress\\.com" . eww-browse-url) + ("mathbabe\\.org" . eww-browse-url) + ("ethz\\.ch" . eww-browse-url) + ("pragmaticemacs\\.com" . eww-browse-url))) + +(defun y/insert-date () + "Insert a timestamp according to locale's date and time format." + (interactive) + (insert (format-time-string "%c" (current-time)))) +#+end_src + +** Mac Specific Customisations + +#+begin_src emacs-lisp +;; Mac configuration +(when (eq system-type 'darwin) + (progn (setq mac-right-option-modifier 'none + mac-command-modifier 'meta + mac-option-modifier nil) + + (defun ymhg/apply-theme (appearance) + "Load theme, taking current system APPEARANCE into consideration." + (mapc #'disable-theme custom-enabled-themes) + (pcase appearance + ('light (load-theme 'ef-day t)) + ('dark (load-theme 'ef-autumn t)))) + + (add-hook 'ns-system-appearance-change-functions #'ymhg/apply-theme))) +#+end_src + +** Backup Settings + +#+begin_src emacs-lisp +;; Set backup directories into the tmp folder +(defvar --backup-directory (concat user-emacs-directory "backups")) +(if (not (file-exists-p --backup-directory)) + (make-directory --backup-directory t)) +(setq backup-directory-alist `(("." . ,--backup-directory))) +(setq make-backup-files t ; backup of a file the first time it is saved. + backup-by-copying t ; don't clobber symlinks + version-control t ; version numbers for backup files + delete-old-versions t ; delete excess backup files silently + delete-by-moving-to-trash t + kept-old-versions 6 ; oldest versions to keep when a new numbered backup is made (default: 2) + kept-new-versions 9 ; newest versions to keep when a new numbered backup is made (default: 2) + auto-save-default t ; auto-save every buffer that visits a file + auto-save-timeout 20 ; number of seconds idle time before auto-save (default: 30) + auto-save-interval 200 ; number of keystrokes between auto-saves (default: 300) + ) +#+end_src + +** Whitespace Settings + +#+begin_src emacs-lisp +;; Configure activation for whitespace mode +(use-package! whitespace + :bind (("C-x w" . whitespace-mode)) + :init + (setq whitespace-style '(newline newline-mark)) + (setq whitespace-display-mappings '((newline-mark 10 [?¬ 10])))) + +;; Configure expand-region mode. +(use-package! expand-region + :bind ("M-o" . er/expand-region)) + +;; Delete all whitespace until the first non-whitespace character. +(use-package! hungry-delete + :config + (global-hungry-delete-mode) + ;; disable hungry delete in minibuffer-mode: https://github.com/abo-abo/swiper/issues/2761 + (add-to-list 'hungry-delete-except-modes 'minibuffer-mode)) +#+end_src + +* Tramp + +#+begin_src emacs-lisp +(setq tramp-auto-save-directory "/tmp") +(defvar disable-tramp-backups '(all)) +(eval-after-load "tramp" + '(progn + ;; Modified from https://www.gnu.org/software/emacs/manual/html_node/tramp/Auto_002dsave-and-Backup.html + (setq backup-enable-predicate + (lambda (name) + (and (normal-backup-enable-predicate name) + ;; Disable all tramp backups + (and disable-tramp-backups + (member 'all disable-tramp-backups) + (not (file-remote-p name 'method))) + (not ;; disable backup for tramp with the listed methods + (let ((method (file-remote-p name 'method))) + (when (stringp method) + (member method disable-tramp-backups))))))) + + (defun tramp-set-auto-save--check (original) + (if (funcall backup-enable-predicate (buffer-file-name)) + (funcall original) + (auto-save-mode -1))) + + (advice-add #'tramp-set-auto-save :around #'tramp-set-auto-save--check) + + ;; Use my ~/.ssh/config control master settings according to https://puppet.com/blog/speed-up-ssh-by-reusing-connections + (setq tramp-ssh-controlmaster-options ""))) +#+end_src + +* Language Settings +** Flycheck + +#+begin_src emacs-lisp +(use-package! flycheck + :config + (setq flycheck-idle-change-delay 1) + (setq flycheck-display-errors-delay 1.0) + (setq-default flycheck-disabled-checkers '(haskell-stack-ghc)) + (remove-hook 'flycheck-mode-hook #'+syntax-init-popups-h)) +#+end_src + +** Magit + +#+begin_src emacs-lisp +;; Set up magit when C-c g is called +(use-package! magit + :bind (("C-x g" . magit-status)) + :config + (add-hook 'magit-status-sections-hook #'magit-insert-modules 90)) +#+end_src + +** Org mode + +#+begin_src emacs-lisp +;; Org configuration +(use-package! org + :mode ("\\.org\\'" . org-mode) + :init + (map! :map org-mode-map + "M-n" #'outline-next-visible-heading + "M-p" #'outline-previous-visible-heading + "C-c ]" #'ebib-insert-citation + "C-," nil + "C-c C-." #'org-time-stamp-inactive) + (setq org-src-window-setup 'current-window + org-return-follows-link t + org-confirm-babel-evaluate nil + org-use-speed-commands t + org-hide-emphasis-markers nil + org-adapt-indentation nil + org-cycle-separator-lines 2 + org-startup-folded 'content + org-structure-template-alist '(("a" . "export ascii") + ("c" . "center") + ("C" . "comment") + ("e" . "example") + ("E" . "export") + ("h" . "export html") + ("l" . "export latex") + ("q" . "quote") + ("s" . "src") + ("v" . "verse") + ("el" . "src emacs-lisp") + ("d" . "definition") + ("t" . "theorem"))) + ;;(customize-set-variable 'org-blank-before-new-entry + ;; '((heading . nil) + ;; (plain-list-item . nil))) + (require 'oc) + (require 'oc-biblatex) + (require 'oc-csl) + (setq org-cite-export-processors '((latex biblatex) + (t csl)) + org-cite-csl-styles-dir "~/projects/csl-styles" + org-cite-global-bibliography '("~/Dropbox/bibliography/references.bib"))) + +(use-package! citeproc) + +(use-package! org-attach + :config + (setq org-attach-auto-tag "attach")) + +(use-package! org-crypt + :after org + :config + (org-crypt-use-before-save-magic) + (setq org-tags-exclude-from-inheritance '("crypt")) + (setq org-crypt-key "8CEF4104683551E8")) + +;;(use-package! org-contacts +;; :after org +;; :init +;; (setq org-contacts-files '("~/Dropbox/org/contacts.org"))) + +(use-package org-auto-tangle + :hook (org-mode . org-auto-tangle-mode)) + +;; Disable org indent mode and remove C-, from the org-mode-map. +(after! org + (setq org-element-use-cache nil) + ;; Set agenda files, refile targets and todo keywords. + (setq org-startup-indented nil) + (setq org-log-done 'time + org-log-into-drawer t) + (setq org-agenda-files (mapcar 'expand-file-name + (list "~/Dropbox/org/inbox.org" + "~/Dropbox/org/main.org" + "~/Dropbox/org/tickler.org" + "~/Dropbox/org/projects.org" + (format-time-string "~/Dropbox/org/%Y-%m.org") + "~/Dropbox/bibliography/reading_list.org"))) + (setq org-agenda-tag-filter '("-backed")) + (setq org-refile-targets `(("~/Dropbox/org/main.org" :level . 1) + ("~/Dropbox/org/someday.org" :level . 1) + ("~/Dropbox/org/projects.org" :maxlevel . 2) + (,(format-time-string "~/Dropbox/org/%Y-%m.org") :level . 1))) + ;; Set custom agenda commands which can be activated in the agenda viewer. + (setq org-agenda-custom-commands + '(("w" "At work" tags-todo "@work" + ((org-agenda-overriding-header "Work"))) + ("h" "At home" tags-todo "@home" + ((org-agenda-overriding-header "Home"))) + ("u" "At uni" tags-todo "@uni" + ((org-agenda-overriding-header "University"))))) + + (setq org-agenda-span 7 + org-agenda-start-day "." + org-agenda-start-on-week 1) + (setq org-agenda-include-diary t) + + (setq org-icalendar-include-todo t) + (setq org-icalendar-include-bbdb-anniversaries t) + + (setq org-capture-templates + `(("t" "Todo" entry (file "inbox.org") + "* TODO %? +:PROPERTIES: +:ID: %(org-id-uuid) +:END: +:LOGBOOK: +- State \"TODO\" from \"\" %U +:END:" :empty-lines 1) + ("l" "Link Todo" entry (file "inbox.org") + "* TODO %? +:PROPERTIES: +:ID: %(org-id-uuid) +:END: +:LOGBOOK: +- State \"TODO\" from \"\" %U +:END: + +%a" :empty-lines 1) + ("c" "Contacts" entry (file "~/Dropbox/org/contacts.org") + "* %(org-contacts-template-name) + :PROPERTIES: + :EMAIL: %(org-contacts-template-email) + :END:" :empty-lines 1)) + + org-todo-keywords + '((sequence + "TODO(t)" ; A task that needs doing & is ready to do + "PROJ(p)" ; A project, which usually contains other tasks + "STRT(s)" ; A task that is in progress + "WAIT(w)" ; Something external is holding up this task + "HOLD(h)" ; This task is paused/on hold because of me + "DELG(l)" ; This task is delegated + "SMDY(m)" ; todo some day + "|" + "DONE(d!)" ; Task successfully completed + "KILL(k)") ; Task was cancelled, aborted or is no longer applicable + (sequence + "[ ](T)" ; A task that needs doing + "[-](S)" ; Task is in progress + "[?](W)" ; Task is being held up or paused + "|" + "[X](D)")) + org-todo-keyword-faces '(("[-]" . +org-todo-active) + ("STRT" . +org-todo-active) + ("[?]" . +org-todo-onhold) + ("WAIT" . +org-todo-onhold) + ("HOLD" . +org-todo-onhold) + ("DELG" . +org-todo-onhold) + ("SMDY" . +org-todo-onhold) + ("PROJ" . +org-todo-project) + ("NO" . +org-todo-cancel) + ("KILL" . +org-todo-cancel))); Task was completed +;; (setq org-html-head-extra +;; " +;; +;;" + (setq org-html-head-include-default-style nil + org-html-head-include-scripts nil + org-html-doctype "html5" + org-html-html5-fancy t + org-html-container-element "section" + org-html-postamble-format + '(("en" "")) + org-html-postamble t + org-html-divs '((preamble "header" "header") + (content "article" "content") + (postamble "footer" "postamble"))) + + (setq org-export-with-broken-links t) + (require 'org-habit) + + (require 'calendar) + (setq calendar-mark-diary-entries-flag t) + (setq calendar-mark-holidays-flag t) + (setq calendar-mode-line-format nil) + (setq calendar-time-display-form + '(24-hours ":" minutes + (when time-zone + (format "(%s)" time-zone)))) + (setq calendar-week-start-day 1) ; Monday + (setq calendar-date-style 'iso) + (setq calendar-date-display-form calendar-iso-date-display-form) + (setq calendar-time-zone-style 'numeric) ; Emacs 28.1 + + (require 'cal-dst) + (setq calendar-standard-time-zone-name "+0000") + (setq calendar-daylight-time-zone-name "+0100") + + (require 'diary-lib) + (setq diary-file "~/Dropbox/org/diary") + (setq diary-date-forms diary-iso-date-forms) + (setq diary-comment-start ";;") + (setq diary-comment-end "") + (setq diary-nonmarking-symbol "!") + (setq diary-show-holidays-flag t) + (setq diary-display-function #'diary-fancy-display) ; better than its alternative + (setq diary-header-line-format nil) + (setq diary-list-include-blanks nil) + (setq diary-number-of-entries 2) + (setq diary-mail-days 2) + (setq diary-abbreviated-year-flag nil) + + (add-hook 'calendar-today-visible-hook #'calendar-mark-today) + (add-hook 'diary-list-entries-hook #'diary-fix-timezone t) + (add-hook 'diary-list-entries-hook #'diary-sort-entries t) + + + (add-hook 'diary-list-entries-hook 'diary-include-other-diary-files) + (add-hook 'diary-mark-entries-hook 'diary-mark-included-diary-files) + ;; Prevent Org from interfering with my key bindings. + (remove-hook 'calendar-mode-hook #'org--setup-calendar-bindings) + + (let ((map calendar-mode-map)) + (define-key map (kbd "s") #'calendar-sunrise-sunset) + (define-key map (kbd "l") #'lunar-phases) + (define-key map (kbd "i") nil) ; Org sets this, much to my chagrin (see `remove-hook' above) + (define-key map (kbd "i a") #'diary-insert-anniversary-entry) + (define-key map (kbd "i c") #'diary-insert-cyclic-entry) + (define-key map (kbd "i d") #'diary-insert-entry) ; for current "day" + (define-key map (kbd "i m") #'diary-insert-monthly-entry) + (define-key map (kbd "i w") #'diary-insert-weekly-entry) + (define-key map (kbd "i y") #'diary-insert-yearly-entry) + (define-key map (kbd "M-n") #'calendar-forward-month) + (define-key map (kbd "M-p") #'calendar-backward-month)) + + (defun diary-schedule (y1 m1 d1 y2 m2 d2 dayname) + "Entry applies if date is between dates on DAYNAME. + Order of the parameters is M1, D1, Y1, M2, D2, Y2 if + `european-calendar-style' is nil, and D1, M1, Y1, D2, M2, Y2 if + `european-calendar-style' is t. Entry does not apply on a history." + (let ((date1 (calendar-absolute-from-gregorian (list m1 d1 y1))) + (date2 (calendar-absolute-from-gregorian (list m2 d2 y2))) + (d (calendar-absolute-from-gregorian date))) + (if (and + (<= date1 d) + (<= d date2) + (= (calendar-day-of-week date) dayname) + (not (calendar-check-holidays date))) + entry))) + + (defun diary-fix-timezone () + (let ((eqtimezone (string= + (replace-regexp-in-string + "\n" "" + (shell-command-to-string "date +%z")) + (replace-regexp-in-string + "\n" "" + (shell-command-to-string "TZ=\"Europe/London\" date +%z"))))) + (setq diary-entries-list + (mapcar (lambda (entry) + (pcase entry + (`(,date ,time ,sdate . ,rest) + (let ((dt (diary-entry-time time)) + (string-date (apply (lambda (a b c) (format "%d-%d-%d" c a b)) date))) + (if (or eqtimezone (= dt diary-unknown-time)) + entry + (let* ((tr (org-tz-conv (concat string-date " " (number-to-string dt)) "Europe/London" "from")) + (split (split-string tr "[- ]")) + (year (car split)) + (month (cadr split)) + (day (caddr split)) + (hour (cadddr split))) + (cons (mapcar #'string-to-number (list month day year)) + (cons (concat hour (replace-regexp-in-string "^[^ ]+" "" time)) + (cons (format "%s-%s-%s" year month day) rest))))))))) + diary-entries-list)))) + + (defun org-tz-conv (stamp tz way) + "Convert a STAMP to or from TZ depending on WAY. + +This function uses the date command line tool to do it." + (let* ((current-tz-offset (replace-regexp-in-string + "\n" "" + (shell-command-to-string "date +%z"))) + (stamp1 (concat (replace-regexp-in-string "[<>]" "" stamp))) + (date-cmd-p0 "TZ=%s gdate -d \"%s\"") + (date-cmd-p1 "gdate --date=\"TZ=\\\"%s\\\" %s\"") + (date-cmd-p2 " +\"%F %H:%M\"") + (date-cmd-from (concat (format date-cmd-p1 tz stamp1) date-cmd-p2)) + (date-cmd-to (concat (format date-cmd-p0 tz + (concat stamp1 " " current-tz-offset)) + date-cmd-p2)) + + (shell-result-from (shell-command-to-string date-cmd-from)) + (shell-result-to (shell-command-to-string date-cmd-to)) + + (result-from (replace-regexp-in-string "\n" "" shell-result-from)) + (result-to (replace-regexp-in-string "\n" "" shell-result-to))) + (cond ((string-equal way "from") result-from) + ((string-equal way "to") result-to)))) + + (require 'ox-extra) + (ox-extras-activate '(ignore-headlines)) + + (require 'ox-beamer) + (require 'ox-latex) + (add-to-list 'org-latex-classes + '("beamer" + "\\documentclass\[presentation\]\{beamer\}" + ("\\section\{%s\}" . "\\section*\{%s\}") + ("\\subsection\{%s\}" . "\\subsection*\{%s\}") + ("\\subsubsection\{%s\}" . "\\subsubsection*\{%s\}"))) + (add-to-list 'org-latex-classes + '("scrartcl" + "\\documentclass\{scrartcl\}" + ("\\section\{%s\}" . "\\section*\{%s\}") + ("\\subsection\{%s\}" . "\\subsection*\{%s\}") + ("\\subsubsection\{%s\}" . "\\subsubsection*\{%s\}") + ("\\paragraph{%s}" . "\\paragraph*{%s}"))) + (add-to-list 'org-latex-packages-alist '("" "minted")) + (setq org-latex-listings 'minted) + (setq org-latex-pdf-process '("latexmk -f -pdf -%latex -shell-escape -interaction=nonstopmode -output-directory=%o %f")) + (setq org-beamer-environments-extra '(("onlyenv" "o" "\\begin{onlyenv}%a{%h}" "\\end{onlyenv}") + ("onlyenvNH" "o" "\\begin{onlyenv}%a" "\\end{onlyenv}") + ("blockNH" "o" "\\begin{block}%a{}" "\\end{block}") + ("oeblock" "o" "\\only%a{\\begin{block}%a{%h}" "\\end{block}}") + ("oeblockNH" "o" "\\only%a{\\begin{block}%a{}" "\\end{block}}") + ("minipage" "o" "\\begin{minipage}[t]%o[t]{1.0\\textwidth}" "\\end{minipage}"))) + + (add-to-list 'org-latex-packages-alist '("" "tikz" t)) + (eval-after-load "preview" + '(add-to-list 'preview-default-preamble + "\\PreviewEnvironment{tikzpicture}" t))) + +(use-package appt + :config + (setq appt-display-diary nil) + (setq appt-disp-window-function #'appt-disp-window) + (setq appt-display-mode-line t) + (setq appt-display-interval 3) + (setq appt-audible nil) + (setq appt-warning-time-regexp "appt \\([0-9]+\\)") + (setq appt-message-warning-time 15) + (run-at-time 10 nil #'appt-activate 1)) + +(use-package! org-transclusion + :after org + :config + (setq org-transclusion-exclude-elements nil) + (advice-remove 'org-link-search '+org--recenter-after-follow-link-a)) + +(use-package! org-superstar + :hook (org-mode . org-superstar-mode) + :config + (setq org-superstar-headline-bullets-list '("♚" "♛" "♜" "♝" "♞" "♔" "♕" "♖" "♗" "♘" "♙") + org-superstar-special-todo-items t)) + +(use-package! org-id + :after org + :config + (setq org-id-link-to-org-use-id 'use-existing) + (setq org-id-track-globally t)) + +;; Set up org registers to quickly jump to files that I use often. +(set-register ?l (cons 'file "~/.emacs.d/loader.org")) +(set-register ?m (cons 'file "~/Dropbox/org/meetings.org")) +(set-register ?i (cons 'file "~/Dropbox/org/inbox.org")) +(set-register ?p (cons 'file "~/Dropbox/org/projects.org")) +(set-register ?c (cons 'file (format-time-string "~/Dropbox/org/%Y-%m.org"))) +#+end_src + +#+begin_src emacs-lisp +(use-package! ox-context + :after org + :config + (add-to-list + 'org-context-presets-alist + '("ymhg-article" . + (:literal "\\setupwhitespace[none]" + :template "article" + :snippets + ("description-article" "quote-article" "verse-article" + "table-article" "title-ymhg" "sectioning-article" "page-numbering-article")))) + (add-to-list 'org-context-snippets-alist + '("title-ymhg" . "\\setuphead[title][align=middle] +\\definestartstop[OrgTitlePage] +\\define\\OrgMakeTitle{% + \\startalignment[center] + \\blank[force,2*big] + \\title{\\documentvariable{metadata:title}} + \\doifnot{\\documentvariable{metadata:subtitle}}{}{ + \\blank[force,1*big] + \\tfa \\documentvariable{metadata:subtitle}} + \\doifelse{\\documentvariable{metadata:author}}{}{ + \\blank[2*medium] + {\\tfa \\documentvariable{metadata:email}} + }{ + \\blank[force,2*medium] + {\\it by \\documentvariable{metadata:author}}, on \\documentvariable{metadata:date} + } + \\blank[3*medium] + \\stopalignment} +\\setupsectionblock[frontpart][page=no] +\\setupsectionblock[bodypart][page=no] +\\setuppagenumbering[location={footer,middle}]")) + (setq org-context-headline-command + '("OrgHeadline" . "\\def\\OrgHeadline#1[#2]{% + \\getparameters + [OrgHeadline] + [Todo=, + TodoType=, + Priority=, + Text=, + Tags=, + #2]% + \\doifnot{\\OrgHeadlineTodo}{}{{\\sansbold{\\smallcaps{\\OrgHeadlineTodo}}\\space}}% + \\doifnot{\\OrgHeadlinePriority}{}{{\\inframed{\\OrgHeadlinePriority}\\space}}% + \\OrgHeadlineText% + \\doifnot{\\OrgHeadlineTags}{}{{\\hfill\\tt\\OrgHeadlineTags}}% +}"))) +#+end_src + +** Latex/Context + +#+begin_src emacs-lisp +(after! pdf-tools + (pdf-tools-install)) + +(after! latex + (setq TeX-view-program-selection '((output-pdf "PDF Tools")) + TeX-source-correlate-start-server t) + (setq-default TeX-command-extra-options "-shell-escape") + (add-hook 'TeX-after-compilation-finished-functions + #'TeX-revert-document-buffer)) + +(after! context + (setq TeX-command-list + (append + '(("context" + "context --purgeall %s" + TeX-run-command nil t :help "Run ConTeXt")) TeX-command-list)) + (map! :map ConTeXt-mode-map + "C-c ]" #'ebib-insert-citation) + (add-hook 'ConTeXt-mode-hook #'reftex-mode)) + +(use-package! ox-gfm :after ox) +(use-package! ox-hugo :after ox) + +(use-package! elfeed-org + :config + (elfeed-org) + (setq rmh-elfeed-org-files (list "~/Dropbox/org/elfeed.org")) + (run-at-time nil (* 8 60 60) #'elfeed-update)) + +(use-package! mmm-mode + :config + (mmm-add-group + 'fancy-context + '((embedded-lua + :submode lua-mode + :front "\\\\startluacode" + :back "\\\\stopluacode") + (embedded-C + :submode c-mode + :front "\\\\starthlC" + :back "\\\\stophlC") + (embedded-metapost + :submode metapost-mode + :front "\\\\startuseMPgraphic" + :back "\\\\stopuseMPgraphic") + )) + + (mmm-add-mode-ext-class 'ConTeXt-en/PS nil 'fancy-context) + (setq mmm-global-mode 'maybe) + ;;(setq mmm-never-modes + ;; (append '(ediff-mode) '(text-mode) mmm-never-modes)) + ) + +(require 'mmm-auto) + +#+end_src + +*** Zettelkasten + +#+begin_src emacs-lisp +(use-package! org-zettelkasten + :config + (add-hook 'org-mode-hook #'org-zettelkasten-mode) + + (defun org-zettelkasten-search-current-id () + "Use `consult-ripgrep' to search for the current ID in all files." + (interactive) + (let ((current-id (org-entry-get nil "CUSTOM_ID"))) + (consult-ripgrep org-zettelkasten-directory (concat "[\\[:]." current-id "\\]#")))) + + (define-key org-zettelkasten-mode-map (kbd "r") #'org-zettelkasten-search-current-id) + (setq org-zettelkasten-directory "~/Dropbox/zk") + + (defun org-zettelkasten-goto-id (id) + "Go to an ID." + (interactive "sID: #") + (cond ((string-prefix-p "1" id) + (org-link-open-from-string + (concat "[[file:" org-zettelkasten-directory + "/hls.org::#" id "]]"))) + ((string-prefix-p "2" id) + (org-link-open-from-string + (concat "[[file:" org-zettelkasten-directory + "/computing.org::#" id "]]"))) + ((string-prefix-p "3" id) + (org-link-open-from-string + (concat "[[file:" org-zettelkasten-directory + "/verification.org::#" id "]]"))) + ((string-prefix-p "4" id) + (org-link-open-from-string + (concat "[[file:" org-zettelkasten-directory + "/mathematics.org::#" id "]]"))) + ((string-prefix-p "5" id) + (org-link-open-from-string + (concat "[[file:" org-zettelkasten-directory + "/hardware.org::#" id "]]")))))) +#+end_src + +#+begin_src emacs-lisp +;; Set up zettelkasten mode +(use-package! zettelkasten + :bind-keymap + ("C-c k" . zettelkasten-mode-map)) +#+end_src + +** Verilog + +#+begin_src emacs-lisp +;; Set sensitive data mode +(setq auto-mode-alist + (append + (list ;;'("\\.\\(vcf\\|gpg\\)\\'" . sensitive-minor-mode) + '("\\.sv\\'" . verilog-mode) + '("\\.mkiv\\'" . context-mode) + '("\\.mkii\\'" . context-mode) + '("\\.mkxl\\'" . context-mode)) + auto-mode-alist)) + +(after! verilog-mode + (setq verilog-simulator "iverilog")) +#+end_src + +** Ebib + +#+begin_src emacs-lisp +;; Bibtex stuff +(use-package! ebib + :bind (("C-c y b" . ebib)) + :init + (defun ymhg/ebib-create-identifier (key _) key) + (setq ebib-preload-bib-files '("~/Dropbox/bibliography/references.bib") + ebib-notes-default-file "~/Dropbox/bibliography/notes.org" + ebib-notes-template "* %T\n:PROPERTIES:\n%K\n:NOTER_DOCUMENT: papers/%k.pdf\n:END:\n%%?\n" + ebib-keywords (expand-file-name "~/Dropbox/bibliography/keywords.txt") + ebib-reading-list-file "~/Dropbox/bibliography/reading_list.org" + ebib-notes-storage 'multiple-notes-per-file) + :config + (add-to-list 'ebib-notes-template-specifiers '(?k . ymhg/ebib-create-identifier)) + (add-to-list 'ebib-file-search-dirs "~/Dropbox/bibliography/papers") + (if (eq system-type 'darwin) + (add-to-list 'ebib-file-associations '("pdf" . "open")) + (add-to-list 'ebib-file-associations '("pdf" . nil))) + (add-to-list 'ebib-citation-commands '(org-mode (("ref" "[cite:@%(%K%,)]")))) + (add-to-list 'ebib-citation-commands '(context-mode (("cite" "\\cite[%(%K%,)]") + ("authoryear" "\\cite[authoryear][%(%K%,)]") + ("authoryears" "\\cite[authoryears][%(%K%,)]") + ("entry" "\\cite[entry][%(%K%,)]") + ("author" "\\cite[author][%(%K%,)]")))) + + (advice-add 'bibtex-generate-autokey :around + (lambda (orig-func &rest args) + (replace-regexp-in-string ":" "" (apply orig-func args)))) + (remove-hook 'ebib-notes-new-note-hook #'org-narrow-to-subtree) + + (map! :map ebib-index-mode-map + "D" #'ebib-download-pdf-from-doi)) + +(defun sci-hub-pdf-url (doi) + "Get url to the pdf from SCI-HUB using DOI." + (setq *doi-utils-pdf-url* (concat "https://sci-hub.hkvisa.net/" doi) ;captcha + ,*doi-utils-waiting* t + ) + ;; try to find PDF url (if it exists) + (url-retrieve (concat "https://sci-hub.hkvisa.net/" doi) + (lambda (_) + (goto-char (point-min)) + (while (search-forward-regexp + "\\(https:\\|sci-hub.hkvisa.net/downloads\\).+download=true'" nil t) + (let ((foundurl (match-string 0))) + (message foundurl) + (if (string-match "https:" foundurl) + (setq *doi-utils-pdf-url* foundurl) + (setq *doi-utils-pdf-url* (concat "https:" foundurl)))) + (setq *doi-utils-waiting* nil)))) + (while *doi-utils-waiting* (sleep-for 0.1)) + (replace-regexp-in-string "\\\\" "" *doi-utils-pdf-url*)) + +(defun acm-pdf-url (doi) + "Retrieve a DOI pdf from the ACM." + (concat "https://dl.acm.org/doi/pdf/" doi)) + +(defun ieee-pdf-url (doi) + "Retrieve a DOI pdf from the IEEE." + (when (string-match "\\.\\([0-9]*\\)$" doi) + (let ((doi-bit (match-string 1 doi))) + (concat "https://ieeexplore.ieee.org/stampPDF/getPDF.jsp?tp=&arnumber=" doi-bit "&ref=")))) + +(defun springer-pdf-url (doi) + "Retrieve a DOI pdf from the Springer." + (concat "https://link.springer.com/content/pdf/" doi ".pdf")) + +(defun arxiv-pdf-url (epr) + (concat "https://arxiv.org/pdf/" epr ".pdf")) + +(defun download-pdf-from-doi (key &optional doi publisher eprint journal organization url) + "Download pdf from doi with KEY name." + (let ((pub (or publisher "")) + (epr (or eprint "")) + (jour (or journal "")) + (org (or organization "")) + (link (or url ""))) + (url-copy-file (cond + ((not doi) link) + ((or (string-match "ACM" (s-upcase pub)) + (string-match "association for computing machinery" (s-downcase pub))) + (acm-pdf-url doi)) + ((string-match "arxiv" (s-downcase pub)) + (arxiv-pdf-url epr)) + ((or (string-match "IEEE" (s-upcase pub)) + (string-match "IEEE" (s-upcase jour)) + (string-match "IEEE" (s-upcase org))) + (ieee-pdf-url doi)) + ((string-match "springer" (s-downcase pub)) + (springer-pdf-url doi)) + (t (sci-hub-pdf-url doi))) + (concat (car ebib-file-search-dirs) "/" key ".pdf")))) + +(defun download-pdf-from-link (link key) + (url-copy-file link + (concat (car ebib-file-search-dirs) "/" key ".pdf"))) + +(defun download-pdf-from-downloads (key) + (copy-file (concat "~/Downloads/" key ".pdf") + (concat (car ebib-file-search-dirs) "/" key ".pdf") t)) + +(defun get-bib-from-doi (doi) + "Get the bibtex from DOI." + (shell-command (concat "curl -L -H \"Accept: application/x-bibtex; charset=utf-8\" " + "https://doi.org/" doi))) + +(defun ebib-download-pdf-from-doi () + "Download a PDF for the current entry." + (interactive) + (let* ((key (ebib--get-key-at-point)) + (doi (ebib-get-field-value "doi" key ebib--cur-db 'noerror 'unbraced 'xref)) + (publisher (ebib-get-field-value "publisher" key ebib--cur-db 'noerror 'unbraced 'xref)) + (eprinttype (ebib-get-field-value "eprinttype" key ebib--cur-db 'noerror 'unbraced 'xref)) + (eprint (ebib-get-field-value "eprint" key ebib--cur-db 'noerror 'unbraced 'xref)) + (journal (ebib-get-field-value "journal" key ebib--cur-db 'noerror 'unbraced 'xref)) + (journaltitle (ebib-get-field-value "journaltitle" key ebib--cur-db 'noerror 'unbraced 'xref)) + (organization (ebib-get-field-value "organization" key ebib--cur-db 'noerror 'unbraced 'xref)) + (url (ebib-get-field-value "url" key ebib--cur-db 'noerror 'unbraced 'xref))) + (unless key + (error "[Ebib] No key assigned to entry")) + (download-pdf-from-doi key doi (or publisher eprinttype) eprint (or journal journaltitle) organization url))) + +(defun ebib-check-file () + "Download a PDF for the current entry." + (interactive) + (let ((key (ebib--get-key-at-point))) + (unless (file-exists-p (concat (car ebib-file-search-dirs) "/" key ".pdf")) + (error "[Ebib] No PDF found.")) + t)) +#+end_src + +** Ocaml + +#+begin_src emacs-lisp +(after! tuareg-mode + (add-hook 'tuareg-mode-hook + (lambda () + (define-key tuareg-mode-map (kbd "C-M-") #'ocamlformat) + (add-hook 'before-save-hook #'ocamlformat-before-save)))) +#+end_src + +** Spell check + +#+begin_src emacs-lisp +;; Set up dictionaries +(setq ispell-dictionary "british") + +(use-package! spell-fu + :config + (add-hook 'spell-fu-mode-hook + (lambda () + (spell-fu-dictionary-add (spell-fu-get-ispell-dictionary "en_GB")) + (spell-fu-dictionary-add (spell-fu-get-ispell-dictionary "de_DE")) + (spell-fu-dictionary-add (spell-fu-get-ispell-dictionary "fr_FR")) + (spell-fu-dictionary-add + (spell-fu-get-personal-dictionary "fr-personal" "~/.aspell.en_GB.pws")) + (spell-fu-dictionary-add + (spell-fu-get-personal-dictionary "de-personal" "~/.aspell.de_DE.pws")) + (spell-fu-dictionary-add + (spell-fu-get-personal-dictionary "fr-personal" "~/.aspell.fr_FR.pws"))))) + +(after! flyspell + (define-key flyspell-mode-map (kbd "C-.") nil) + (define-key flyspell-mode-map (kbd "C-,") nil) + (setq flyspell-mouse-map (make-sparse-keymap))) +#+end_src + +** Coq configuration + +#+begin_src emacs-lisp +(use-package! proof-general + :config + (setq proof-splash-enable nil + proof-auto-action-when-deactivating-scripting 'retract + proof-delete-empty-windows nil + proof-multiple-frames-enable nil + proof-three-window-enable nil + proof-auto-raise-buffers nil + coq-compile-before-require nil + coq-compile-vos t + coq-compile-parallel-in-background t + coq-max-background-compilation-jobs 4 + coq-compile-keep-going nil + coq-compile-quick 'no-quick)) + +(use-package! company-coq + :after coq + :config + (setq company-idle-delay 1 + company-coq-disabled-features '(prettify-symbols hello company-defaults spinner smart-subscripts snippets compile-command))) +#+end_src + +** Mail + +#+begin_src emacs-lisp +(setq message-send-mail-function 'message-send-mail-with-sendmail) +(setq message-fill-column 80) + +(use-package! sendmail + :config + (if (eq system-type 'darwin) + (setq sendmail-program "/usr/local/bin/msmtp") + (setq sendmail-program "/usr/bin/msmtp"))) + +(setq message-signature "Yann Herklotz +Imperial College London +https://yannherklotz.com") + +(setq auth-sources '("~/.authinfo" "~/.authinfo.gpg" "~/.netrc")) + +(setq mail-specify-envelope-from t + message-sendmail-envelope-from 'header + mail-envelope-from 'header) + +(use-package! notmuch + :config + (defun ymhg/notmuch-search-delete-mail (&optional beg end) + "Delete a message." + (interactive (notmuch-interactive-region)) + (if (member "deleted" (notmuch-search-get-tags)) + (notmuch-search-tag (list "-deleted")) + (notmuch-search-tag (list "+deleted" "-unread") beg end))) + + (defun ymhg/notmuch-show-delete-mail (&optional beg end) + "Delete a message." + (interactive (notmuch-interactive-region)) + (if (member "deleted" (notmuch-show-get-tags)) + (notmuch-show-tag (list "-deleted")) + (notmuch-show-tag (list "+deleted" "-unread") beg end))) + + (setq notmuch-archive-tags '("-inbox" "-unread" "+archive")) + + (map! + :map notmuch-show-mode-map + "d" #'ymhg/notmuch-show-delete-mail) + (map! + :map notmuch-search-mode-map + "d" #'ymhg/notmuch-search-delete-mail) + + (setq notmuch-saved-searches + '((:name "inbox" :query "date:last_month..this_month and tag:inbox not tag:deleted" :key "n") + (:name "flagged" :query "tag:flagged" :key "f") + (:name "sent" :query "tag:sent" :key "s") + (:name "drafts" :query "tag:draft" :key "d") + (:name "mailbox" :query "date:last_month..this_month and (tag:mailbox and tag:inbox) and not tag:deleted and not tag:sent" :key "m") + (:name "imperial" :query "date:last_month..this_month and (tag:imperial and tag:inbox) and not tag:deleted and not tag:sent" :key "i") + (:name "all recent" :query "date:last_month..this_month" :key "r"))) + + (setq notmuch-fcc-dirs + '(("yann@yannherklotz.com" . "mailbox/Sent -inbox +sent -unread +mailbox -new") + ("git@ymhg.org" . "mailbox/Sent -inbox +sent -unread +mailbox -new") + ("yann.herklotz15@imperial.ac.uk" . "\"imperial/Sent Items\" -inbox +sent -unread +imperial -new"))) + + (setq +notmuch-home-function (lambda () (notmuch-search "tag:inbox")))) + +(after! shr (setq shr-use-fonts nil + shr-max-image-proportion 0.5)) +#+end_src + +** Smartparens + +#+begin_src emacs-lisp +(use-package! smartparens + :config + (map! :map smartparens-mode-map + "M-[" #'sp-backward-unwrap-sexp + "M-]" #'sp-unwrap-sexp + "C-M-f" #'sp-forward-sexp + "C-M-b" #'sp-backward-sexp + "C-M-d" #'sp-down-sexp + "C-M-a" #'sp-backward-down-sexp + "C-M-e" #'sp-up-sexp + "C-M-u" #'sp-backward-up-sexp + "C-M-t" #'sp-transpose-sexp + "C-M-n" #'sp-next-sexp + "C-M-p" #'sp-previous-sexp + "C-M-k" #'sp-kill-sexp + "C-M-w" #'sp-copy-sexp + "C-)" #'sp-forward-slurp-sexp + "C-}" #'sp-forward-barf-sexp + "C-(" #'sp-backward-slurp-sexp + "C-{" #'sp-backward-barf-sexp + "M-D" #'sp-splice-sexp + "C-]" #'sp-select-next-thing-exchange + "C-" #'sp-select-previous-thing + "C-M-]" #'sp-select-next-thing + "M-F" #'sp-forward-symbol + "M-B" #'sp-backward-symbol + "M-r" #'sp-split-sexp) + (require 'smartparens-config) + (show-smartparens-global-mode +1) + (smartparens-global-mode 1) +;;(sp-pair "'" nil :actions :rem) + (sp-local-pair 'coq-mode "'" nil :actions nil)) +#+end_src + +#+begin_src emacs-lisp +(after! writeroom-mode (setq +zen-text-scale 1)) + +(use-package! direnv :config (direnv-mode)) + +(use-package alert + :custom + (alert-default-style 'osx-notifier)) + +(use-package ledger-mode) + +(defun diary-last-day-of-month (date) + "Return `t` if DATE is the last day of the month." + (let* ((day (calendar-extract-day date)) + (month (calendar-extract-month date)) + (year (calendar-extract-year date)) + (last-day-of-month + (calendar-last-day-of-month month year))) + (= day last-day-of-month))) + +(use-package! calc-forms + :config + (add-to-list 'math-tzone-names '("AOE" 12 0)) + (add-to-list 'math-tzone-names '("IST" (float -55 -1) 0))) + +(use-package! orderless + :custom (completion-styles '(substring orderless))) + +(use-package! vertico + :init + (vertico-mode)) + +(use-package! savehist + :init + (savehist-mode)) + +(use-package! marginalia + :bind (("M-A" . marginalia-cycle) + :map minibuffer-local-map + ("M-A" . marginalia-cycle)) + :init + ;; Must be in the :init section of use-package such that the mode gets + ;; enabled right away. Note that this forces loading the package. + (marginalia-mode)) +#+end_src + +** Embark + +#+begin_src emacs-lisp +(use-package! embark + :bind + (("C-;" . embark-act)) + :init + ;; Optionally replace the key help with a completing-read interface + (setq prefix-help-command #'embark-prefix-help-command) + :config + (add-to-list 'display-buffer-alist + '("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*" + nil + (window-parameters (mode-line-format . none))))) + +(use-package! embark-consult + :after (embark consult) + :demand t ; only necessary if you have the hook below + ;; if you want to have consult previews as you move around an + ;; auto-updating embark collect buffer + :hook + (embark-collect-mode . consult-preview-at-point-mode)) +#+end_src + +** Consult + +#+begin_src emacs-lisp +;; Example configuration for Consult +(use-package! consult + ;; Replace bindings. Lazily loaded due by `use-package'. + :bind (;; C-c bindings (mode-specific-map) + ("C-c h" . consult-history) + ("C-c m" . consult-mode-command) + ("C-c b" . consult-bookmark) + ("C-c k" . consult-kmacro) + ;; C-x bindings (ctl-x-map) + ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command + ("C-x b" . consult-buffer) ;; orig. switch-to-buffer + ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window + ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame + ;; Custom M-# bindings for fast register access + ("M-#" . consult-register-load) + ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) + ("C-M-#" . consult-register) + ;; Other custom bindings + ("M-y" . consult-yank-pop) ;; orig. yank-pop + (" a" . consult-apropos) ;; orig. apropos-command + ;; M-g bindings (goto-map) + ("M-g e" . consult-compile-error) + ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck + ("M-g g" . consult-goto-line) ;; orig. goto-line + ("M-g M-g" . consult-goto-line) ;; orig. goto-line + ("M-g o" . consult-outline) ;; Alternative: consult-org-heading + ("M-g m" . consult-mark) + ("M-g k" . consult-global-mark) + ("M-g i" . consult-imenu) + ("M-g I" . consult-imenu-multi) + ;; M-s bindings (search-map) + ("M-s f" . consult-find) + ("M-s F" . consult-locate) + ("M-s g" . consult-grep) + ("M-s G" . consult-git-grep) + ("M-s r" . consult-ripgrep) + ("M-s l" . consult-line) + ("M-s L" . consult-line-multi) + ("M-s m" . consult-multi-occur) + ("M-s k" . consult-keep-lines) + ("M-s u" . consult-focus-lines) + ;; Isearch integration + ("M-s e" . consult-isearch) + :map isearch-mode-map + ("M-e" . consult-isearch) ;; orig. isearch-edit-string + ("M-s e" . consult-isearch) ;; orig. isearch-edit-string + ("M-s l" . consult-line) ;; needed by consult-line to detect isearch + ("M-s L" . consult-line-multi)) ;; needed by consult-line to detect isearch + + ;; Enable automatic preview at point in the *Completions* buffer. + ;; This is relevant when you use the default completion UI, + ;; and not necessary for Vertico, Selectrum, etc. + :hook (completion-list-mode . consult-preview-at-point-mode) + + ;; The :init configuration is always executed (Not lazy) + :init + + (setq register-preview-delay 0 + register-preview-function #'consult-register-format) + + (advice-add #'register-preview :override #'consult-register-window) + + ;; Use Consult to select xref locations with preview + (setq xref-show-xrefs-function #'consult-xref + xref-show-definitions-function #'consult-xref) + :config + ;; Optionally configure the narrowing key. + ;; Both < and C-+ work reasonably well. + (setq consult-narrow-key "<") ;; (kbd "C-+") + + (setq consult-project-root-function + (lambda () + (when-let (project (project-current)) + (car (project-roots project)))))) +#+end_src + +** Scheme + +#+begin_src emacs-lisp +(use-package! geiser-chicken + :config + (setq geiser-chicken-binary "chicken-csi")) + +(use-package! geiser + :init + (map! :map geiser-mode-map "C-." nil) + (map! :map geiser-repl-mode-map "C-." nil)) +#+end_src + +** Emacs + +#+begin_src emacs-lisp +(use-package! emacs + :init + ;; Do not allow the cursor in the minibuffer prompt + (setq minibuffer-prompt-properties + '(read-only t cursor-intangible t face minibuffer-prompt)) + (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode) + + ;; Emacs 28: Hide commands in M-x which do not work in the current mode. + ;; Vertico commands are hidden in normal buffers. + (setq read-extended-command-predicate + #'command-completion-default-include-p) + + ;; Enable recursive minibuffers + (setq enable-recursive-minibuffers t)) + +(use-package! boogie-friends) + +(use-package! ol-notmuch :after org) + +(use-package! circe + :config + (setq circe-network-options + `(("soju" :host "chat.sr.ht" :port 6697 :tls t + :sasl-username "ymherklotz/irc.libera.chat" + :sasl-password ,(ymhg/pass "sr.ht/chat.sr.ht") + :nick "ymherklotz")))) + +(defun ymhg/reset-coq-windows () + "Resets the Goald and Response windows." + (interactive) + (other-frame 1) + (delete-other-windows) + (split-window-below) + (switch-to-buffer "*goals*") + (other-window 1) + (switch-to-buffer "*response*") + (other-frame 1)) + +(define-key y-map (kbd "o") #'ymhg/reset-coq-windows) + +(defun ymhg--reset-coq-indentation () + "Reset slow indentation." + (setq-local indent-line-function #'indent-relative)) + +(after! coq-mode + (add-hook 'coq-mode-hook #'ymhg--reset-coq-indentation t) + (define-key coq-mode-map (kbd "C-c TAB") #'smie-indent-line) + (setq coq-indent-modulestart 0)) + +(use-package! alectryon + :hook (coq-mode . alectryon-mode) + :config + (when (eq system-type 'darwin) + (setq alectryon-executable "/nix/store/bvlk3hyrjdgl0sg93rrdr2z71hgza0m9-python3.9-alectryon-1.4.0/bin/alectryon")) + (map! :map alectryon-mode-map + "C-c u t" #'alectryon-toggle + "C-c u p" #'ymhg/alectryon-preview) + (defun ymhg/alectryon-preview () + "Display an HTML preview of the current buffer." + (interactive) + (let* ((html-fname (make-temp-file "alectryon" nil ".html")) + (args `("-r" "5" "-" ,html-fname))) + (apply #'call-process-region nil nil "rst2html5" nil nil nil args) + (message "Compilation complete") + (browse-url html-fname)))) + +(use-package! rst + :config + (add-hook 'rst-mode-hook (lambda () (setq fill-column 80)))) + +(use-package! ox-tufte + :after org + :config) + +(use-package! scroll-other-window + :hook (ConTeXt-mode . sow-mode)) + +(use-package! cdlatex + :hook (ConTeXt-mode . turn-on-cdlatex) + :init + (setq cdlatex-command-alist nil) + (setq cdlatex-math-modify-alist nil)) + +(use-package! boogie-friends + :config + (setq flycheck-dafny-executable (executable-find "dafny")) + (setq dafny-verification-backend 'cli)) + +;;(add-to-list 'load-path "/usr/local/Cellar/agda/2.6.2.2/cabal/store/ghc-8.10.7/Agd-2.6.2.2-3bca6588/share/emacs-mode") +;; +;;(use-package! agda2-mode) +#+end_src diff --git a/doom/.config/doom/init.el b/doom/.config/doom/init.el new file mode 100644 index 0000000..e6e4aef --- /dev/null +++ b/doom/.config/doom/init.el @@ -0,0 +1,188 @@ +;;; 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 information about all of Doom's modules +;; and what flags they support. + +;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or +;; 'C-c g 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 g d') on a module to browse its +;; directory (for easy access to its source code). + +(setq native-comp-deferred-compilation nil) +(after! (doom-packages straight) + (setq straight--native-comp-available t)) + +(doom! :input + ;;chinese + ;;japanese + + :completion + company ; the ultimate code completion backend + ;;helm ; the *other* search engine for love and life + ;;ido ; the other *other* search engine... + ;;ivy ; a search engine for love and life + vertico + + :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 + ;;fill-column ; a `fill-column' indicator + ;;hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW + hydra + ;;indent-guides ; highlighted in dent columns + (modeline +light) ; snazzy, Atom-inspired modeline, plus API + ;;nav-flash ; blink the current line after jumping + ;;neotree ; a project drawer, like NERDTree for vim + ;;ophints ; highlight the region an operation acts on + (popup +defaults) ; tame sudden yet inevitable temporary windows + ;;pretty-code ; replace bits of code with pretty symbols + ;;tabs ; an tab bar for Emacs + ;;treemacs ; a project drawer, like neotree but cooler + ;;unicode ; extended unicode support for various languages + ;;vc-gutter ; 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 +manual) ; 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 + vc ; version-control and Emacs, sitting in a tree + + :term + ;;eshell ; a consistent, cross-platform shell (WIP) + ;;shell ; a terminal REPL for Emacs + ;;term ; terminals in Emacs + ;;vterm ; another terminals in Emacs + + :checkers + syntax ; tasing you for every semicolon you forget + (spell +aspell) ; tasing you for misspelling mispelling + ;;grammar ; tasing grammar mistake every you make + + :tools + ;;ansible + ;;debugger ; FIXME stepping through code, to help you add bugs + direnv + ;;docker + ;;editorconfig ; let someone else argue about tabs vs spaces + ;;ein ; tame Jupyter notebooks with emacs + eval ; run code, run (also, repls) + ;;gist ; interacting with github gists + lookup ; navigate your code and its documentation + (lsp +eglot) + magit ; a git porcelain for Emacs + ;;make ; run make tasks from Emacs + (pass +auth) ; password manager for nerds + pdf ; pdf enhancements + ;;prodigy ; FIXME managing external services & code builders + ;;rgb ; creating color strings + ;;terraform ; infrastructure as code + ;;tmux ; an API for interacting with tmux + ;;upload ; map local to remote projects via ssh/ftp + + :lang + ;;agda ; types of types of types of types... + ;;assembly ; assembly for fun or debugging + cc ; C/C++/Obj-C madness + ;;clojure ; java with a lisp + 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 + ;;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 + ;;faust ; dsp, but you get to keep your soul + ;;fsharp ; ML stands for Microsoft's Language + ;;fstar ; (dependent) types and (monadic) effects and Z3 + ;;go ; the hipster dialect + (haskell +lsp) ; a language that's lazier than I am + ;;hy ; readability of scheme w/ speed of python + ;;idris ; + ;;(java +meghanada) ; the poster child for carpal tunnel syndrome + ;;javascript ; all(hope(abandon(ye(who(enter(here)))))) + ;;julia ; a better, faster MATLAB + ;;kotlin ; a better, slicker Java(Script) + latex ; writing papers in Emacs has never been so fun + ;;lean + ;;factor + ledger ; an accounting system in Emacs + 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 + (org ; organize your plain life in plain text + +gnuplot + ;;+dragndrop ; drag & drop files/images into org buffers + +hugo ; use Emacs for hugo blogging + ;;+jupyter ; ipython/jupyter support for babel + +pandoc ; export-with-pandoc support + ;;+pomodoro ; be fruitful with the tomato technique + +present ; using org-mode for presentations + ) + ;;perl ; write code no one else can comprehend + ;;php ; perl's insecure younger brother + ;;plantuml ; diagrams for confusing people more + ;;purescript ; javascript, but functional + python ; beautiful is better than ugly + ;;qt ; the 'cutest' gui framework ever + ;;racket ; a DSL for DSLs + ;;rest ; Emacs as a REST client + rst ; ReST in peace + ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} + rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() + ;;scala ; java, but good + (scheme +guile +chicken +racket) ; a fully conniving family of lisps + sh ; she sells {ba,z,fi}sh shells on the C xor + ;;solidity ; do you need a blockchain? No. + ;;swift ; who asked for emoji variables? + ;;terra ; Earth and Moon in alignment for performance. + ;;web ; the tubes + + :email + ;;(mu4e +gmail) + notmuch + ;;(wanderlust +gmail) + + :app + ;;calendar + irc ; how neckbeards socialize + (rss +org) ; emacs as an RSS reader + ;;twitter ; twitter client https://twitter.com/vnought + + :config + literate + (default +bindings +smartparens) + + :os + (:if IS-MAC macos) + tty) diff --git a/doom/.config/doom/packages.el b/doom/.config/doom/packages.el new file mode 100644 index 0000000..3d4e82a --- /dev/null +++ b/doom/.config/doom/packages.el @@ -0,0 +1,75 @@ +;; Disabling packages +(disable-packages! undo-tree org-bullets helm pretty-code) + +;; `org-mode' dependencies +(package! ol-notmuch) +(package! org-contrib + :recipe (:host nil :repo "https://git.sr.ht/~bzg/org-contrib") + :pin "c6aef31ccfc7c4418c3b51e98f7c3bd8e255f5e6") +;;(package! org-contacts) +;; `org-bullets' replacement +(package! org-superstar) +(package! ox-gfm) +(package! ox-tufte + :recipe (:host nil :repo "https://git.sr.ht/~ymherklotz/ox-tufte")) +(package! scroll-other-window + :recipe (:host nil :repo "https://git.sr.ht/~ymherklotz/scroll-other-window")) +(package! cdlatex) +(package! citeproc) +(package! ox-context + :recipe (:host github :repo "Jason-S-Ross/ox-context")) +(package! org-transclusion + :recipe (:host github :repo "nobiot/org-transclusion")) +(package! org-zettelkasten + :recipe (:host github :repo "ymherklotz/emacs-zettelkasten") + :pin "7278052cb451178a2f1ffc61569156ca0adcc34a") +(package! org-auto-tangle + :recipe (:host github :repo "yilkalargaw/org-auto-tangle") + :pin "bce665c79fc29f1e80f1eae7db7e91c56b0788fc") +(package! elfeed-score) + +(package! ef-themes + :recipe (:host nil :repo "https://git.sr.ht/~protesilaos/ef-themes")) + +(package! alectryon) + +;; Bibtex stuff +(package! ebib) + +;; Haskell stuff +(package! ormolu) + +;; Completion +(package! orderless) +(package! marginalia) +(package! embark) +(package! embark-consult) +(package! ripgrep) + +;; Extra language mobdes +(package! yaml-mode) +(package! pollen-mode) + +;; Nix +(package! direnv) + +;; Misc dependencies +(package! hungry-delete) + +;; Teaching +(package! boogie-friends) + +;; Privacy +(package! pinentry) + +;; Emacs lisp +(package! package-lint) + +;; Themes +(package! color-theme-sanityinc-tomorrow) +(package! modus-themes) + +(package! ef-themes + :recipe (:host nil :repo "https://git.sr.ht/~protesilaos/ef-themes")) + +(package! mmm-mode) diff --git a/doom/abbrev-defs b/doom/abbrev-defs deleted file mode 100644 index b9b6d7e..0000000 --- a/doom/abbrev-defs +++ /dev/null @@ -1,9 +0,0 @@ -;;-*-coding: utf-8;-*- -(define-abbrev-table 'global-abbrev-table - '( - ("alth" "although" nil :count 1) - ("bc" "because" nil :count 0) - ("th" "though" nil :count 0) - ("vc" "Vericert" nil :count 0) - )) - diff --git a/doom/config.org b/doom/config.org deleted file mode 100644 index 6b9534b..0000000 --- a/doom/config.org +++ /dev/null @@ -1,1409 +0,0 @@ -#+title: Org configuration -#+property: header-args:emacs-lisp :tangle config.el - -* Top-Level Configuration - -#+begin_src emacs-lisp -(setq doom-font (font-spec :family "Iosevka YMHG Medium" :size 16)) -(when (eq system-type 'darwin) - (setq doom-variable-pitch-font (font-spec :family "Alegreya" :size 20)) - (setq doom-serif-font (font-spec :family "Alegreya" :size 20))) -#+end_src - -#+begin_src emacs-lisp -(setq org-directory "~/Dropbox/org/") - -(setq display-line-numbers-type nil) -;; Remove the ring for emacs -(setq ring-bell-function 'ignore) -;; Automatically refresh files -(global-auto-revert-mode 1) -(setq auto-revert-verbose nil) - -;; Set sentence to end with double space -(setq sentence-end-double-space t) -;; Remove automatic `auto-fill-mode', and replace it by `visual-line-mode', which is a personal -;; preference. -(setq-default fill-column 100) -;;(remove-hook 'text-mode-hook #'auto-fill-mode) -(add-hook 'text-mode-hook #'auto-fill-mode) -;;(add-hook 'text-mode-hook #'+word-wrap-mode) -;;(add-hook 'text-mode-hook #'visual-fill-column-mode) -;;;; Removes performance problems with opening coq files. -(add-to-list 'doom-detect-indentation-excluded-modes 'coq-mode) - -;; Projectile compilation buffer not there anymore for some reason -(setq compilation-buffer-name-function #'compilation--default-buffer-name) - -;; optimisations from https://200ok.ch/posts/2020-09-29_comprehensive_guide_on_handling_long_lines_in_emacs.html -(setq-default bidi-paragraph-direction 'left-to-right) -(if (version<= "27.1" emacs-version) - (setq bidi-inhibit-bpa t)) - -(setq abbrev-file-name - "~/.config/doom/abbrev-defs") -(add-hook 'text-mode-hook #'abbrev-mode) -#+end_src - -#+begin_src emacs-lisp -(use-package ef-themes - :defer nil - :bind ("" . ef-themes-select) - :config - (custom-theme-set-faces! ef-themes-collection - '(proof-locked-face :inherit hl-line) - '(proof-queue-face :inherit region)) - (setq ef-themes-height-0 2.0736 - ef-themes-height-1 1.728 - ef-themes-height-2 1.44 - ef-themes-height-3 1.2 - ef-themes-height-4 1.0 - ef-themes-height-5 1.0 - ef-themes-height-6 1.0 - ef-themes-height-7 1.0 - ef-themes-height-8 1.0) - (setq doom-theme 'ef-autumn)) - -(use-package modus-themes - :defer nil - :init - ;; Add all your customizations prior to loading the themes - (setq modus-themes-region '(bg-only no-extend)) - - ;; Load the theme files before enabling a theme - (modus-themes-load-themes) - (custom-theme-set-faces! '(modus-vivendi modus-operandi) - '(proof-locked-face :inherit modus-themes-nuanced-cyan) - '(proof-queue-face :inherit modus-themes-nuanced-magenta)) - :config - ;; Load the theme of your choice: - ;;(modus-themes-load-operandi) ;; OR (modus-themes-load-vivendi) - ;;:bind ("" . modus-themes-toggle)) - ) -#+end_src - -#+begin_src emacs-lisp -;; Disable stuff -(global-prettify-symbols-mode -1) -(electric-indent-mode -1) -(menu-bar-mode -1) - -(add-hook 'text-mode-hook (lambda () (company-mode -1))) -#+end_src - -#+begin_src emacs-lisp -(use-package! projectile - :config - (add-to-list 'projectile-globally-ignored-directories ".direnv")) -#+end_src - -** Key Binding Customisations - -#+begin_src emacs-lisp -;; Stop emacs from freezing when trying to minimize it on a tiling WM. -(global-unset-key (kbd "C-z")) -(global-set-key (kbd "M-u") #'upcase-dwim) -(global-set-key (kbd "M-l") #'downcase-dwim) -(global-set-key (kbd "M-c") #'capitalize-dwim) -(global-set-key (kbd "C-c z") #'quick-calc) -(global-set-key (kbd "") #'revert-buffer) -(global-set-key (kbd "C-.") (lambda () (interactive) (other-window -1))) -(global-set-key (kbd "C-,") #'other-window) -(global-set-key (kbd "C-c l") #'org-store-link) -(global-set-key (kbd "C-c a") #'org-agenda) -(global-set-key (kbd "C-c /") #'avy-goto-word-1) -(global-set-key (kbd "M-=") #'count-words) -(global-set-key (kbd "C-x m") #'+notmuch/compose) -(global-set-key (kbd "C-M-x") #'scroll-other-window-down) - -;; Set undo-only correctly -(global-set-key (kbd "C-\\") 'undo-only) - -;; Revert C-a and C-e to go to the beginning and end of line, not a fan of the -;; default smart functions. -(global-set-key (kbd "C-a") #'beginning-of-line) -(global-set-key (kbd "C-e") #'end-of-line) - -;; Define functions to push and pop from mark. -(defun push-mark-no-activate () - "Pushes `point' to `mark-ring' and does not activate the region - Equivalent to \\[set-mark-command] when \\[transient-mark-mode] is disabled" - (interactive) - (push-mark (point) t nil) - (message "Pushed mark to ring")) - -(defun jump-to-mark () - "Jumps to the local mark, respecting the `mark-ring' order. - This is the same as using \\[set-mark-command] with the prefix argument." - (interactive) - (set-mark-command 1)) - -(global-set-key (kbd "C-`") #'push-mark-no-activate) -(global-set-key (kbd "M-`") #'jump-to-mark) - -;; Swap two window positions. -(defun y/swap-windows () - "Swaps two windows and leaves the cursor in the original one" - (interactive) - (ace-swap-window) - (aw-flip-window)) - -(defun ymhg/pass (query) - "Return the password as a string from QUERY." - (s-trim (shell-command-to-string (concat "pass show " query)))) - -;; Define a custom key map for other useful commands. -(define-prefix-command 'y-map) -(global-set-key (kbd "C-c y") 'y-map) - -(define-key y-map (kbd "p") #'password-store-copy) -(define-key y-map (kbd "q") #'password-store-otp-token-copy) -(define-key y-map (kbd "i") #'password-store-insert) -(define-key y-map (kbd "g") #'password-store-generate) -;(define-key y-map (kbd "r") #'toggle-rot13-mode) -(define-key y-map (kbd "c") #'calendar) -(define-key y-map (kbd "C-r") #'ymhg/reload-keywords) -(define-key y-map (kbd "d") #'y/insert-date) -(define-key y-map (kbd "C-g") #'org-zettelkasten-goto-id) -(define-key y-map (kbd "C-t") #'org-babel-detangle) -(define-key y-map (kbd "C-l") #'org-agenda-open-link) -(define-key y-map (kbd "C-p") #'org-previous-link) -(define-key y-map (kbd "C-n") #'org-next-link) -(define-key y-map (kbd "s") - (lambda () (interactive) - (let ((org-agenda-files - '("~/Dropbox/zk/hls.org" - "~/Dropbox/zk/computing.org" - "~/Dropbox/zk/verification.org" - "~/Dropbox/zk/mathematics.org" - "~/Dropbox/zk/hardware.org"))) (org-search-view)))) - -(setq browse-url-handlers - '(("wikipedia\\.org" . eww-browse-url) - ("yannherklotz\\.com" . eww-browse-url) - ("ymhg\\.org" . eww-browse-url) - ("archlinux\\.org" . eww-browse-url) - ("sachachua\\.com" . eww-browse-url) - ("comonad\\.com" . eww-browse-url) - ("drewdevault\\.com" . eww-browse-url) - ("wordpress\\.com" . eww-browse-url) - ("mathbabe\\.org" . eww-browse-url) - ("ethz\\.ch" . eww-browse-url) - ("pragmaticemacs\\.com" . eww-browse-url))) - -(defun y/insert-date () - "Insert a timestamp according to locale's date and time format." - (interactive) - (insert (format-time-string "%c" (current-time)))) -#+end_src - -** Mac Specific Customisations - -#+begin_src emacs-lisp -;; Mac configuration -(when (eq system-type 'darwin) - (progn (setq mac-right-option-modifier 'none - mac-command-modifier 'meta - mac-option-modifier nil) - - (defun ymhg/apply-theme (appearance) - "Load theme, taking current system APPEARANCE into consideration." - (mapc #'disable-theme custom-enabled-themes) - (pcase appearance - ('light (load-theme 'ef-day t)) - ('dark (load-theme 'ef-autumn t)))) - - (add-hook 'ns-system-appearance-change-functions #'ymhg/apply-theme))) -#+end_src - -** Backup Settings - -#+begin_src emacs-lisp -;; Set backup directories into the tmp folder -(defvar --backup-directory (concat user-emacs-directory "backups")) -(if (not (file-exists-p --backup-directory)) - (make-directory --backup-directory t)) -(setq backup-directory-alist `(("." . ,--backup-directory))) -(setq make-backup-files t ; backup of a file the first time it is saved. - backup-by-copying t ; don't clobber symlinks - version-control t ; version numbers for backup files - delete-old-versions t ; delete excess backup files silently - delete-by-moving-to-trash t - kept-old-versions 6 ; oldest versions to keep when a new numbered backup is made (default: 2) - kept-new-versions 9 ; newest versions to keep when a new numbered backup is made (default: 2) - auto-save-default t ; auto-save every buffer that visits a file - auto-save-timeout 20 ; number of seconds idle time before auto-save (default: 30) - auto-save-interval 200 ; number of keystrokes between auto-saves (default: 300) - ) -#+end_src - -** Whitespace Settings - -#+begin_src emacs-lisp -;; Configure activation for whitespace mode -(use-package! whitespace - :bind (("C-x w" . whitespace-mode)) - :init - (setq whitespace-style '(newline newline-mark)) - (setq whitespace-display-mappings '((newline-mark 10 [?¬ 10])))) - -;; Configure expand-region mode. -(use-package! expand-region - :bind ("M-o" . er/expand-region)) - -;; Delete all whitespace until the first non-whitespace character. -(use-package! hungry-delete - :config - (global-hungry-delete-mode) - ;; disable hungry delete in minibuffer-mode: https://github.com/abo-abo/swiper/issues/2761 - (add-to-list 'hungry-delete-except-modes 'minibuffer-mode)) -#+end_src - -* Tramp - -#+begin_src emacs-lisp -(setq tramp-auto-save-directory "/tmp") -(defvar disable-tramp-backups '(all)) -(eval-after-load "tramp" - '(progn - ;; Modified from https://www.gnu.org/software/emacs/manual/html_node/tramp/Auto_002dsave-and-Backup.html - (setq backup-enable-predicate - (lambda (name) - (and (normal-backup-enable-predicate name) - ;; Disable all tramp backups - (and disable-tramp-backups - (member 'all disable-tramp-backups) - (not (file-remote-p name 'method))) - (not ;; disable backup for tramp with the listed methods - (let ((method (file-remote-p name 'method))) - (when (stringp method) - (member method disable-tramp-backups))))))) - - (defun tramp-set-auto-save--check (original) - (if (funcall backup-enable-predicate (buffer-file-name)) - (funcall original) - (auto-save-mode -1))) - - (advice-add #'tramp-set-auto-save :around #'tramp-set-auto-save--check) - - ;; Use my ~/.ssh/config control master settings according to https://puppet.com/blog/speed-up-ssh-by-reusing-connections - (setq tramp-ssh-controlmaster-options ""))) -#+end_src - -* Language Settings -** Flycheck - -#+begin_src emacs-lisp -(use-package! flycheck - :config - (setq flycheck-idle-change-delay 1) - (setq flycheck-display-errors-delay 1.0) - (setq-default flycheck-disabled-checkers '(haskell-stack-ghc)) - (remove-hook 'flycheck-mode-hook #'+syntax-init-popups-h)) -#+end_src - -** Magit - -#+begin_src emacs-lisp -;; Set up magit when C-c g is called -(use-package! magit - :bind (("C-x g" . magit-status)) - :config - (add-hook 'magit-status-sections-hook #'magit-insert-modules 90)) -#+end_src - -** Org mode - -#+begin_src emacs-lisp -;; Org configuration -(use-package! org - :mode ("\\.org\\'" . org-mode) - :init - (map! :map org-mode-map - "M-n" #'outline-next-visible-heading - "M-p" #'outline-previous-visible-heading - "C-c ]" #'ebib-insert-citation - "C-," nil - "C-c C-." #'org-time-stamp-inactive) - (setq org-src-window-setup 'current-window - org-return-follows-link t - org-confirm-babel-evaluate nil - org-use-speed-commands t - org-hide-emphasis-markers nil - org-adapt-indentation nil - org-cycle-separator-lines 2 - org-startup-folded 'content - org-structure-template-alist '(("a" . "export ascii") - ("c" . "center") - ("C" . "comment") - ("e" . "example") - ("E" . "export") - ("h" . "export html") - ("l" . "export latex") - ("q" . "quote") - ("s" . "src") - ("v" . "verse") - ("el" . "src emacs-lisp") - ("d" . "definition") - ("t" . "theorem"))) - ;;(customize-set-variable 'org-blank-before-new-entry - ;; '((heading . nil) - ;; (plain-list-item . nil))) - (require 'oc) - (require 'oc-biblatex) - (require 'oc-csl) - (setq org-cite-export-processors '((latex biblatex) - (t csl)) - org-cite-csl-styles-dir "~/projects/csl-styles" - org-cite-global-bibliography '("~/Dropbox/bibliography/references.bib"))) - -(use-package! citeproc) - -(use-package! org-attach - :config - (setq org-attach-auto-tag "attach")) - -(use-package! org-crypt - :after org - :config - (org-crypt-use-before-save-magic) - (setq org-tags-exclude-from-inheritance '("crypt")) - (setq org-crypt-key "8CEF4104683551E8")) - -;;(use-package! org-contacts -;; :after org -;; :init -;; (setq org-contacts-files '("~/Dropbox/org/contacts.org"))) - -(use-package org-auto-tangle - :hook (org-mode . org-auto-tangle-mode)) - -;; Disable org indent mode and remove C-, from the org-mode-map. -(after! org - (setq org-element-use-cache nil) - ;; Set agenda files, refile targets and todo keywords. - (setq org-startup-indented nil) - (setq org-log-done 'time - org-log-into-drawer t) - (setq org-agenda-files (mapcar 'expand-file-name - (list "~/Dropbox/org/inbox.org" - "~/Dropbox/org/main.org" - "~/Dropbox/org/tickler.org" - "~/Dropbox/org/projects.org" - (format-time-string "~/Dropbox/org/%Y-%m.org") - "~/Dropbox/bibliography/reading_list.org"))) - (setq org-agenda-tag-filter '("-backed")) - (setq org-refile-targets `(("~/Dropbox/org/main.org" :level . 1) - ("~/Dropbox/org/someday.org" :level . 1) - ("~/Dropbox/org/projects.org" :maxlevel . 2) - (,(format-time-string "~/Dropbox/org/%Y-%m.org") :level . 1))) - ;; Set custom agenda commands which can be activated in the agenda viewer. - (setq org-agenda-custom-commands - '(("w" "At work" tags-todo "@work" - ((org-agenda-overriding-header "Work"))) - ("h" "At home" tags-todo "@home" - ((org-agenda-overriding-header "Home"))) - ("u" "At uni" tags-todo "@uni" - ((org-agenda-overriding-header "University"))))) - - (setq org-agenda-span 7 - org-agenda-start-day "." - org-agenda-start-on-week 1) - (setq org-agenda-include-diary t) - - (setq org-icalendar-include-todo t) - (setq org-icalendar-include-bbdb-anniversaries t) - - (setq org-capture-templates - `(("t" "Todo" entry (file "inbox.org") - "* TODO %? -:PROPERTIES: -:ID: %(org-id-uuid) -:END: -:LOGBOOK: -- State \"TODO\" from \"\" %U -:END:" :empty-lines 1) - ("l" "Link Todo" entry (file "inbox.org") - "* TODO %? -:PROPERTIES: -:ID: %(org-id-uuid) -:END: -:LOGBOOK: -- State \"TODO\" from \"\" %U -:END: - -%a" :empty-lines 1) - ("c" "Contacts" entry (file "~/Dropbox/org/contacts.org") - "* %(org-contacts-template-name) - :PROPERTIES: - :EMAIL: %(org-contacts-template-email) - :END:" :empty-lines 1)) - - org-todo-keywords - '((sequence - "TODO(t)" ; A task that needs doing & is ready to do - "PROJ(p)" ; A project, which usually contains other tasks - "STRT(s)" ; A task that is in progress - "WAIT(w)" ; Something external is holding up this task - "HOLD(h)" ; This task is paused/on hold because of me - "DELG(l)" ; This task is delegated - "SMDY(m)" ; todo some day - "|" - "DONE(d!)" ; Task successfully completed - "KILL(k)") ; Task was cancelled, aborted or is no longer applicable - (sequence - "[ ](T)" ; A task that needs doing - "[-](S)" ; Task is in progress - "[?](W)" ; Task is being held up or paused - "|" - "[X](D)")) - org-todo-keyword-faces '(("[-]" . +org-todo-active) - ("STRT" . +org-todo-active) - ("[?]" . +org-todo-onhold) - ("WAIT" . +org-todo-onhold) - ("HOLD" . +org-todo-onhold) - ("DELG" . +org-todo-onhold) - ("SMDY" . +org-todo-onhold) - ("PROJ" . +org-todo-project) - ("NO" . +org-todo-cancel) - ("KILL" . +org-todo-cancel))); Task was completed -;; (setq org-html-head-extra -;; " -;; -;;" - (setq org-html-head-include-default-style nil - org-html-head-include-scripts nil - org-html-doctype "html5" - org-html-html5-fancy t - org-html-container-element "section" - org-html-postamble-format - '(("en" "")) - org-html-postamble t - org-html-divs '((preamble "header" "header") - (content "article" "content") - (postamble "footer" "postamble"))) - - (setq org-export-with-broken-links t) - (require 'org-habit) - - (require 'calendar) - (setq calendar-mark-diary-entries-flag t) - (setq calendar-mark-holidays-flag t) - (setq calendar-mode-line-format nil) - (setq calendar-time-display-form - '(24-hours ":" minutes - (when time-zone - (format "(%s)" time-zone)))) - (setq calendar-week-start-day 1) ; Monday - (setq calendar-date-style 'iso) - (setq calendar-date-display-form calendar-iso-date-display-form) - (setq calendar-time-zone-style 'numeric) ; Emacs 28.1 - - (require 'cal-dst) - (setq calendar-standard-time-zone-name "+0000") - (setq calendar-daylight-time-zone-name "+0100") - - (require 'diary-lib) - (setq diary-file "~/Dropbox/org/diary") - (setq diary-date-forms diary-iso-date-forms) - (setq diary-comment-start ";;") - (setq diary-comment-end "") - (setq diary-nonmarking-symbol "!") - (setq diary-show-holidays-flag t) - (setq diary-display-function #'diary-fancy-display) ; better than its alternative - (setq diary-header-line-format nil) - (setq diary-list-include-blanks nil) - (setq diary-number-of-entries 2) - (setq diary-mail-days 2) - (setq diary-abbreviated-year-flag nil) - - (add-hook 'calendar-today-visible-hook #'calendar-mark-today) - (add-hook 'diary-list-entries-hook #'diary-fix-timezone t) - (add-hook 'diary-list-entries-hook #'diary-sort-entries t) - - - (add-hook 'diary-list-entries-hook 'diary-include-other-diary-files) - (add-hook 'diary-mark-entries-hook 'diary-mark-included-diary-files) - ;; Prevent Org from interfering with my key bindings. - (remove-hook 'calendar-mode-hook #'org--setup-calendar-bindings) - - (let ((map calendar-mode-map)) - (define-key map (kbd "s") #'calendar-sunrise-sunset) - (define-key map (kbd "l") #'lunar-phases) - (define-key map (kbd "i") nil) ; Org sets this, much to my chagrin (see `remove-hook' above) - (define-key map (kbd "i a") #'diary-insert-anniversary-entry) - (define-key map (kbd "i c") #'diary-insert-cyclic-entry) - (define-key map (kbd "i d") #'diary-insert-entry) ; for current "day" - (define-key map (kbd "i m") #'diary-insert-monthly-entry) - (define-key map (kbd "i w") #'diary-insert-weekly-entry) - (define-key map (kbd "i y") #'diary-insert-yearly-entry) - (define-key map (kbd "M-n") #'calendar-forward-month) - (define-key map (kbd "M-p") #'calendar-backward-month)) - - (defun diary-schedule (y1 m1 d1 y2 m2 d2 dayname) - "Entry applies if date is between dates on DAYNAME. - Order of the parameters is M1, D1, Y1, M2, D2, Y2 if - `european-calendar-style' is nil, and D1, M1, Y1, D2, M2, Y2 if - `european-calendar-style' is t. Entry does not apply on a history." - (let ((date1 (calendar-absolute-from-gregorian (list m1 d1 y1))) - (date2 (calendar-absolute-from-gregorian (list m2 d2 y2))) - (d (calendar-absolute-from-gregorian date))) - (if (and - (<= date1 d) - (<= d date2) - (= (calendar-day-of-week date) dayname) - (not (calendar-check-holidays date))) - entry))) - - (defun diary-fix-timezone () - (let ((eqtimezone (string= - (replace-regexp-in-string - "\n" "" - (shell-command-to-string "date +%z")) - (replace-regexp-in-string - "\n" "" - (shell-command-to-string "TZ=\"Europe/London\" date +%z"))))) - (setq diary-entries-list - (mapcar (lambda (entry) - (pcase entry - (`(,date ,time ,sdate . ,rest) - (let ((dt (diary-entry-time time)) - (string-date (apply (lambda (a b c) (format "%d-%d-%d" c a b)) date))) - (if (or eqtimezone (= dt diary-unknown-time)) - entry - (let* ((tr (org-tz-conv (concat string-date " " (number-to-string dt)) "Europe/London" "from")) - (split (split-string tr "[- ]")) - (year (car split)) - (month (cadr split)) - (day (caddr split)) - (hour (cadddr split))) - (cons (mapcar #'string-to-number (list month day year)) - (cons (concat hour (replace-regexp-in-string "^[^ ]+" "" time)) - (cons (format "%s-%s-%s" year month day) rest))))))))) - diary-entries-list)))) - - (defun org-tz-conv (stamp tz way) - "Convert a STAMP to or from TZ depending on WAY. - -This function uses the date command line tool to do it." - (let* ((current-tz-offset (replace-regexp-in-string - "\n" "" - (shell-command-to-string "date +%z"))) - (stamp1 (concat (replace-regexp-in-string "[<>]" "" stamp))) - (date-cmd-p0 "TZ=%s gdate -d \"%s\"") - (date-cmd-p1 "gdate --date=\"TZ=\\\"%s\\\" %s\"") - (date-cmd-p2 " +\"%F %H:%M\"") - (date-cmd-from (concat (format date-cmd-p1 tz stamp1) date-cmd-p2)) - (date-cmd-to (concat (format date-cmd-p0 tz - (concat stamp1 " " current-tz-offset)) - date-cmd-p2)) - - (shell-result-from (shell-command-to-string date-cmd-from)) - (shell-result-to (shell-command-to-string date-cmd-to)) - - (result-from (replace-regexp-in-string "\n" "" shell-result-from)) - (result-to (replace-regexp-in-string "\n" "" shell-result-to))) - (cond ((string-equal way "from") result-from) - ((string-equal way "to") result-to)))) - - (require 'ox-extra) - (ox-extras-activate '(ignore-headlines)) - - (require 'ox-beamer) - (require 'ox-latex) - (add-to-list 'org-latex-classes - '("beamer" - "\\documentclass\[presentation\]\{beamer\}" - ("\\section\{%s\}" . "\\section*\{%s\}") - ("\\subsection\{%s\}" . "\\subsection*\{%s\}") - ("\\subsubsection\{%s\}" . "\\subsubsection*\{%s\}"))) - (add-to-list 'org-latex-classes - '("scrartcl" - "\\documentclass\{scrartcl\}" - ("\\section\{%s\}" . "\\section*\{%s\}") - ("\\subsection\{%s\}" . "\\subsection*\{%s\}") - ("\\subsubsection\{%s\}" . "\\subsubsection*\{%s\}") - ("\\paragraph{%s}" . "\\paragraph*{%s}"))) - (add-to-list 'org-latex-packages-alist '("" "minted")) - (setq org-latex-listings 'minted) - (setq org-latex-pdf-process '("latexmk -f -pdf -%latex -shell-escape -interaction=nonstopmode -output-directory=%o %f")) - (setq org-beamer-environments-extra '(("onlyenv" "o" "\\begin{onlyenv}%a{%h}" "\\end{onlyenv}") - ("onlyenvNH" "o" "\\begin{onlyenv}%a" "\\end{onlyenv}") - ("blockNH" "o" "\\begin{block}%a{}" "\\end{block}") - ("oeblock" "o" "\\only%a{\\begin{block}%a{%h}" "\\end{block}}") - ("oeblockNH" "o" "\\only%a{\\begin{block}%a{}" "\\end{block}}") - ("minipage" "o" "\\begin{minipage}[t]%o[t]{1.0\\textwidth}" "\\end{minipage}"))) - - (add-to-list 'org-latex-packages-alist '("" "tikz" t)) - (eval-after-load "preview" - '(add-to-list 'preview-default-preamble - "\\PreviewEnvironment{tikzpicture}" t))) - -(use-package appt - :config - (setq appt-display-diary nil) - (setq appt-disp-window-function #'appt-disp-window) - (setq appt-display-mode-line t) - (setq appt-display-interval 3) - (setq appt-audible nil) - (setq appt-warning-time-regexp "appt \\([0-9]+\\)") - (setq appt-message-warning-time 15) - (run-at-time 10 nil #'appt-activate 1)) - -(use-package! org-transclusion - :after org - :config - (setq org-transclusion-exclude-elements nil) - (advice-remove 'org-link-search '+org--recenter-after-follow-link-a)) - -(use-package! org-superstar - :hook (org-mode . org-superstar-mode) - :config - (setq org-superstar-headline-bullets-list '("♚" "♛" "♜" "♝" "♞" "♔" "♕" "♖" "♗" "♘" "♙") - org-superstar-special-todo-items t)) - -(use-package! org-id - :after org - :config - (setq org-id-link-to-org-use-id 'use-existing) - (setq org-id-track-globally t)) - -;; Set up org registers to quickly jump to files that I use often. -(set-register ?l (cons 'file "~/.emacs.d/loader.org")) -(set-register ?m (cons 'file "~/Dropbox/org/meetings.org")) -(set-register ?i (cons 'file "~/Dropbox/org/inbox.org")) -(set-register ?p (cons 'file "~/Dropbox/org/projects.org")) -(set-register ?c (cons 'file (format-time-string "~/Dropbox/org/%Y-%m.org"))) -#+end_src - -#+begin_src emacs-lisp -(use-package! ox-context - :after org - :config - (add-to-list - 'org-context-presets-alist - '("ymhg-article" . - (:literal "\\setupwhitespace[none]" - :template "article" - :snippets - ("description-article" "quote-article" "verse-article" - "table-article" "title-ymhg" "sectioning-article" "page-numbering-article")))) - (add-to-list 'org-context-snippets-alist - '("title-ymhg" . "\\setuphead[title][align=middle] -\\definestartstop[OrgTitlePage] -\\define\\OrgMakeTitle{% - \\startalignment[center] - \\blank[force,2*big] - \\title{\\documentvariable{metadata:title}} - \\doifnot{\\documentvariable{metadata:subtitle}}{}{ - \\blank[force,1*big] - \\tfa \\documentvariable{metadata:subtitle}} - \\doifelse{\\documentvariable{metadata:author}}{}{ - \\blank[2*medium] - {\\tfa \\documentvariable{metadata:email}} - }{ - \\blank[force,2*medium] - {\\it by \\documentvariable{metadata:author}}, on \\documentvariable{metadata:date} - } - \\blank[3*medium] - \\stopalignment} -\\setupsectionblock[frontpart][page=no] -\\setupsectionblock[bodypart][page=no] -\\setuppagenumbering[location={footer,middle}]")) - (setq org-context-headline-command - '("OrgHeadline" . "\\def\\OrgHeadline#1[#2]{% - \\getparameters - [OrgHeadline] - [Todo=, - TodoType=, - Priority=, - Text=, - Tags=, - #2]% - \\doifnot{\\OrgHeadlineTodo}{}{{\\sansbold{\\smallcaps{\\OrgHeadlineTodo}}\\space}}% - \\doifnot{\\OrgHeadlinePriority}{}{{\\inframed{\\OrgHeadlinePriority}\\space}}% - \\OrgHeadlineText% - \\doifnot{\\OrgHeadlineTags}{}{{\\hfill\\tt\\OrgHeadlineTags}}% -}"))) -#+end_src - -** Latex/Context - -#+begin_src emacs-lisp -(after! pdf-tools - (pdf-tools-install)) - -(after! latex - (setq TeX-view-program-selection '((output-pdf "PDF Tools")) - TeX-source-correlate-start-server t) - (setq-default TeX-command-extra-options "-shell-escape") - (add-hook 'TeX-after-compilation-finished-functions - #'TeX-revert-document-buffer)) - -(after! context - (setq TeX-command-list - (append - '(("context" - "context --purgeall %s" - TeX-run-command nil t :help "Run ConTeXt")) TeX-command-list)) - (map! :map ConTeXt-mode-map - "C-c ]" #'ebib-insert-citation) - (add-hook 'ConTeXt-mode-hook #'reftex-mode)) - -(use-package! ox-gfm :after ox) -(use-package! ox-hugo :after ox) - -(use-package! elfeed-org - :config - (elfeed-org) - (setq rmh-elfeed-org-files (list "~/Dropbox/org/elfeed.org")) - (run-at-time nil (* 8 60 60) #'elfeed-update)) - -(use-package! mmm-mode - :config - (mmm-add-group - 'fancy-context - '((embedded-lua - :submode lua-mode - :front "\\\\startluacode" - :back "\\\\stopluacode") - (embedded-C - :submode c-mode - :front "\\\\starthlC" - :back "\\\\stophlC") - (embedded-metapost - :submode metapost-mode - :front "\\\\startuseMPgraphic" - :back "\\\\stopuseMPgraphic") - )) - - (mmm-add-mode-ext-class 'ConTeXt-en/PS nil 'fancy-context) - (setq mmm-global-mode 'maybe) - ;;(setq mmm-never-modes - ;; (append '(ediff-mode) '(text-mode) mmm-never-modes)) - ) - -(require 'mmm-auto) - -#+end_src - -*** Zettelkasten - -#+begin_src emacs-lisp -(use-package! org-zettelkasten - :config - (add-hook 'org-mode-hook #'org-zettelkasten-mode) - - (defun org-zettelkasten-search-current-id () - "Use `consult-ripgrep' to search for the current ID in all files." - (interactive) - (let ((current-id (org-entry-get nil "CUSTOM_ID"))) - (consult-ripgrep org-zettelkasten-directory (concat "[\\[:]." current-id "\\]#")))) - - (define-key org-zettelkasten-mode-map (kbd "r") #'org-zettelkasten-search-current-id) - (setq org-zettelkasten-directory "~/Dropbox/zk") - - (defun org-zettelkasten-goto-id (id) - "Go to an ID." - (interactive "sID: #") - (cond ((string-prefix-p "1" id) - (org-link-open-from-string - (concat "[[file:" org-zettelkasten-directory - "/hls.org::#" id "]]"))) - ((string-prefix-p "2" id) - (org-link-open-from-string - (concat "[[file:" org-zettelkasten-directory - "/computing.org::#" id "]]"))) - ((string-prefix-p "3" id) - (org-link-open-from-string - (concat "[[file:" org-zettelkasten-directory - "/verification.org::#" id "]]"))) - ((string-prefix-p "4" id) - (org-link-open-from-string - (concat "[[file:" org-zettelkasten-directory - "/mathematics.org::#" id "]]"))) - ((string-prefix-p "5" id) - (org-link-open-from-string - (concat "[[file:" org-zettelkasten-directory - "/hardware.org::#" id "]]")))))) -#+end_src - -#+begin_src emacs-lisp -;; Set up zettelkasten mode -(use-package! zettelkasten - :bind-keymap - ("C-c k" . zettelkasten-mode-map)) -#+end_src - -** Verilog - -#+begin_src emacs-lisp -;; Set sensitive data mode -(setq auto-mode-alist - (append - (list ;;'("\\.\\(vcf\\|gpg\\)\\'" . sensitive-minor-mode) - '("\\.sv\\'" . verilog-mode) - '("\\.mkiv\\'" . context-mode) - '("\\.mkii\\'" . context-mode) - '("\\.mkxl\\'" . context-mode)) - auto-mode-alist)) - -(after! verilog-mode - (setq verilog-simulator "iverilog")) -#+end_src - -** Ebib - -#+begin_src emacs-lisp -;; Bibtex stuff -(use-package! ebib - :bind (("C-c y b" . ebib)) - :init - (defun ymhg/ebib-create-identifier (key _) key) - (setq ebib-preload-bib-files '("~/Dropbox/bibliography/references.bib") - ebib-notes-default-file "~/Dropbox/bibliography/notes.org" - ebib-notes-template "* %T\n:PROPERTIES:\n%K\n:NOTER_DOCUMENT: papers/%k.pdf\n:END:\n%%?\n" - ebib-keywords (expand-file-name "~/Dropbox/bibliography/keywords.txt") - ebib-reading-list-file "~/Dropbox/bibliography/reading_list.org" - ebib-notes-storage 'multiple-notes-per-file) - :config - (add-to-list 'ebib-notes-template-specifiers '(?k . ymhg/ebib-create-identifier)) - (add-to-list 'ebib-file-search-dirs "~/Dropbox/bibliography/papers") - (if (eq system-type 'darwin) - (add-to-list 'ebib-file-associations '("pdf" . "open")) - (add-to-list 'ebib-file-associations '("pdf" . nil))) - (add-to-list 'ebib-citation-commands '(org-mode (("ref" "[cite:@%(%K%,)]")))) - (add-to-list 'ebib-citation-commands '(context-mode (("cite" "\\cite[%(%K%,)]") - ("authoryear" "\\cite[authoryear][%(%K%,)]") - ("authoryears" "\\cite[authoryears][%(%K%,)]") - ("entry" "\\cite[entry][%(%K%,)]") - ("author" "\\cite[author][%(%K%,)]")))) - - (advice-add 'bibtex-generate-autokey :around - (lambda (orig-func &rest args) - (replace-regexp-in-string ":" "" (apply orig-func args)))) - (remove-hook 'ebib-notes-new-note-hook #'org-narrow-to-subtree) - - (map! :map ebib-index-mode-map - "D" #'ebib-download-pdf-from-doi)) - -(defun sci-hub-pdf-url (doi) - "Get url to the pdf from SCI-HUB using DOI." - (setq *doi-utils-pdf-url* (concat "https://sci-hub.hkvisa.net/" doi) ;captcha - ,*doi-utils-waiting* t - ) - ;; try to find PDF url (if it exists) - (url-retrieve (concat "https://sci-hub.hkvisa.net/" doi) - (lambda (_) - (goto-char (point-min)) - (while (search-forward-regexp - "\\(https:\\|sci-hub.hkvisa.net/downloads\\).+download=true'" nil t) - (let ((foundurl (match-string 0))) - (message foundurl) - (if (string-match "https:" foundurl) - (setq *doi-utils-pdf-url* foundurl) - (setq *doi-utils-pdf-url* (concat "https:" foundurl)))) - (setq *doi-utils-waiting* nil)))) - (while *doi-utils-waiting* (sleep-for 0.1)) - (replace-regexp-in-string "\\\\" "" *doi-utils-pdf-url*)) - -(defun acm-pdf-url (doi) - "Retrieve a DOI pdf from the ACM." - (concat "https://dl.acm.org/doi/pdf/" doi)) - -(defun ieee-pdf-url (doi) - "Retrieve a DOI pdf from the IEEE." - (when (string-match "\\.\\([0-9]*\\)$" doi) - (let ((doi-bit (match-string 1 doi))) - (concat "https://ieeexplore.ieee.org/stampPDF/getPDF.jsp?tp=&arnumber=" doi-bit "&ref=")))) - -(defun springer-pdf-url (doi) - "Retrieve a DOI pdf from the Springer." - (concat "https://link.springer.com/content/pdf/" doi ".pdf")) - -(defun arxiv-pdf-url (epr) - (concat "https://arxiv.org/pdf/" epr ".pdf")) - -(defun download-pdf-from-doi (key &optional doi publisher eprint journal organization url) - "Download pdf from doi with KEY name." - (let ((pub (or publisher "")) - (epr (or eprint "")) - (jour (or journal "")) - (org (or organization "")) - (link (or url ""))) - (url-copy-file (cond - ((not doi) link) - ((or (string-match "ACM" (s-upcase pub)) - (string-match "association for computing machinery" (s-downcase pub))) - (acm-pdf-url doi)) - ((string-match "arxiv" (s-downcase pub)) - (arxiv-pdf-url epr)) - ((or (string-match "IEEE" (s-upcase pub)) - (string-match "IEEE" (s-upcase jour)) - (string-match "IEEE" (s-upcase org))) - (ieee-pdf-url doi)) - ((string-match "springer" (s-downcase pub)) - (springer-pdf-url doi)) - (t (sci-hub-pdf-url doi))) - (concat (car ebib-file-search-dirs) "/" key ".pdf")))) - -(defun download-pdf-from-link (link key) - (url-copy-file link - (concat (car ebib-file-search-dirs) "/" key ".pdf"))) - -(defun download-pdf-from-downloads (key) - (copy-file (concat "~/Downloads/" key ".pdf") - (concat (car ebib-file-search-dirs) "/" key ".pdf") t)) - -(defun get-bib-from-doi (doi) - "Get the bibtex from DOI." - (shell-command (concat "curl -L -H \"Accept: application/x-bibtex; charset=utf-8\" " - "https://doi.org/" doi))) - -(defun ebib-download-pdf-from-doi () - "Download a PDF for the current entry." - (interactive) - (let* ((key (ebib--get-key-at-point)) - (doi (ebib-get-field-value "doi" key ebib--cur-db 'noerror 'unbraced 'xref)) - (publisher (ebib-get-field-value "publisher" key ebib--cur-db 'noerror 'unbraced 'xref)) - (eprinttype (ebib-get-field-value "eprinttype" key ebib--cur-db 'noerror 'unbraced 'xref)) - (eprint (ebib-get-field-value "eprint" key ebib--cur-db 'noerror 'unbraced 'xref)) - (journal (ebib-get-field-value "journal" key ebib--cur-db 'noerror 'unbraced 'xref)) - (journaltitle (ebib-get-field-value "journaltitle" key ebib--cur-db 'noerror 'unbraced 'xref)) - (organization (ebib-get-field-value "organization" key ebib--cur-db 'noerror 'unbraced 'xref)) - (url (ebib-get-field-value "url" key ebib--cur-db 'noerror 'unbraced 'xref))) - (unless key - (error "[Ebib] No key assigned to entry")) - (download-pdf-from-doi key doi (or publisher eprinttype) eprint (or journal journaltitle) organization url))) - -(defun ebib-check-file () - "Download a PDF for the current entry." - (interactive) - (let ((key (ebib--get-key-at-point))) - (unless (file-exists-p (concat (car ebib-file-search-dirs) "/" key ".pdf")) - (error "[Ebib] No PDF found.")) - t)) -#+end_src - -** Ocaml - -#+begin_src emacs-lisp -(after! tuareg-mode - (add-hook 'tuareg-mode-hook - (lambda () - (define-key tuareg-mode-map (kbd "C-M-") #'ocamlformat) - (add-hook 'before-save-hook #'ocamlformat-before-save)))) -#+end_src - -** Spell check - -#+begin_src emacs-lisp -;; Set up dictionaries -(setq ispell-dictionary "british") - -(use-package! spell-fu - :config - (add-hook 'spell-fu-mode-hook - (lambda () - (spell-fu-dictionary-add (spell-fu-get-ispell-dictionary "en_GB")) - (spell-fu-dictionary-add (spell-fu-get-ispell-dictionary "de_DE")) - (spell-fu-dictionary-add (spell-fu-get-ispell-dictionary "fr_FR")) - (spell-fu-dictionary-add - (spell-fu-get-personal-dictionary "fr-personal" "~/.aspell.en_GB.pws")) - (spell-fu-dictionary-add - (spell-fu-get-personal-dictionary "de-personal" "~/.aspell.de_DE.pws")) - (spell-fu-dictionary-add - (spell-fu-get-personal-dictionary "fr-personal" "~/.aspell.fr_FR.pws"))))) - -(after! flyspell - (define-key flyspell-mode-map (kbd "C-.") nil) - (define-key flyspell-mode-map (kbd "C-,") nil) - (setq flyspell-mouse-map (make-sparse-keymap))) -#+end_src - -** Coq configuration - -#+begin_src emacs-lisp -(use-package! proof-general - :config - (setq proof-splash-enable nil - proof-auto-action-when-deactivating-scripting 'retract - proof-delete-empty-windows nil - proof-multiple-frames-enable nil - proof-three-window-enable nil - proof-auto-raise-buffers nil - coq-compile-before-require nil - coq-compile-vos t - coq-compile-parallel-in-background t - coq-max-background-compilation-jobs 4 - coq-compile-keep-going nil - coq-compile-quick 'no-quick)) - -(use-package! company-coq - :after coq - :config - (setq company-idle-delay 1 - company-coq-disabled-features '(prettify-symbols hello company-defaults spinner smart-subscripts snippets compile-command))) -#+end_src - -** Mail - -#+begin_src emacs-lisp -(setq message-send-mail-function 'message-send-mail-with-sendmail) -(setq message-fill-column 80) - -(use-package! sendmail - :config - (if (eq system-type 'darwin) - (setq sendmail-program "/usr/local/bin/msmtp") - (setq sendmail-program "/usr/bin/msmtp"))) - -(setq message-signature "Yann Herklotz -Imperial College London -https://yannherklotz.com") - -(setq auth-sources '("~/.authinfo" "~/.authinfo.gpg" "~/.netrc")) - -(setq mail-specify-envelope-from t - message-sendmail-envelope-from 'header - mail-envelope-from 'header) - -(use-package! notmuch - :config - (defun ymhg/notmuch-search-delete-mail (&optional beg end) - "Delete a message." - (interactive (notmuch-interactive-region)) - (if (member "deleted" (notmuch-search-get-tags)) - (notmuch-search-tag (list "-deleted")) - (notmuch-search-tag (list "+deleted" "-unread") beg end))) - - (defun ymhg/notmuch-show-delete-mail (&optional beg end) - "Delete a message." - (interactive (notmuch-interactive-region)) - (if (member "deleted" (notmuch-show-get-tags)) - (notmuch-show-tag (list "-deleted")) - (notmuch-show-tag (list "+deleted" "-unread") beg end))) - - (setq notmuch-archive-tags '("-inbox" "-unread" "+archive")) - - (map! - :map notmuch-show-mode-map - "d" #'ymhg/notmuch-show-delete-mail) - (map! - :map notmuch-search-mode-map - "d" #'ymhg/notmuch-search-delete-mail) - - (setq notmuch-saved-searches - '((:name "inbox" :query "date:last_month..this_month and tag:inbox not tag:deleted" :key "n") - (:name "flagged" :query "tag:flagged" :key "f") - (:name "sent" :query "tag:sent" :key "s") - (:name "drafts" :query "tag:draft" :key "d") - (:name "mailbox" :query "date:last_month..this_month and (tag:mailbox and tag:inbox) and not tag:deleted and not tag:sent" :key "m") - (:name "imperial" :query "date:last_month..this_month and (tag:imperial and tag:inbox) and not tag:deleted and not tag:sent" :key "i") - (:name "all recent" :query "date:last_month..this_month" :key "r"))) - - (setq notmuch-fcc-dirs - '(("yann@yannherklotz.com" . "mailbox/Sent -inbox +sent -unread +mailbox -new") - ("git@ymhg.org" . "mailbox/Sent -inbox +sent -unread +mailbox -new") - ("yann.herklotz15@imperial.ac.uk" . "\"imperial/Sent Items\" -inbox +sent -unread +imperial -new"))) - - (setq +notmuch-home-function (lambda () (notmuch-search "tag:inbox")))) - -(after! shr (setq shr-use-fonts nil - shr-max-image-proportion 0.5)) -#+end_src - -** Smartparens - -#+begin_src emacs-lisp -(use-package! smartparens - :config - (map! :map smartparens-mode-map - "M-[" #'sp-backward-unwrap-sexp - "M-]" #'sp-unwrap-sexp - "C-M-f" #'sp-forward-sexp - "C-M-b" #'sp-backward-sexp - "C-M-d" #'sp-down-sexp - "C-M-a" #'sp-backward-down-sexp - "C-M-e" #'sp-up-sexp - "C-M-u" #'sp-backward-up-sexp - "C-M-t" #'sp-transpose-sexp - "C-M-n" #'sp-next-sexp - "C-M-p" #'sp-previous-sexp - "C-M-k" #'sp-kill-sexp - "C-M-w" #'sp-copy-sexp - "C-)" #'sp-forward-slurp-sexp - "C-}" #'sp-forward-barf-sexp - "C-(" #'sp-backward-slurp-sexp - "C-{" #'sp-backward-barf-sexp - "M-D" #'sp-splice-sexp - "C-]" #'sp-select-next-thing-exchange - "C-" #'sp-select-previous-thing - "C-M-]" #'sp-select-next-thing - "M-F" #'sp-forward-symbol - "M-B" #'sp-backward-symbol - "M-r" #'sp-split-sexp) - (require 'smartparens-config) - (show-smartparens-global-mode +1) - (smartparens-global-mode 1) -;;(sp-pair "'" nil :actions :rem) - (sp-local-pair 'coq-mode "'" nil :actions nil)) -#+end_src - -#+begin_src emacs-lisp -(after! writeroom-mode (setq +zen-text-scale 1)) - -(use-package! direnv :config (direnv-mode)) - -(use-package alert - :custom - (alert-default-style 'osx-notifier)) - -(use-package ledger-mode) - -(defun diary-last-day-of-month (date) - "Return `t` if DATE is the last day of the month." - (let* ((day (calendar-extract-day date)) - (month (calendar-extract-month date)) - (year (calendar-extract-year date)) - (last-day-of-month - (calendar-last-day-of-month month year))) - (= day last-day-of-month))) - -(use-package! calc-forms - :config - (add-to-list 'math-tzone-names '("AOE" 12 0)) - (add-to-list 'math-tzone-names '("IST" (float -55 -1) 0))) - -(use-package! orderless - :custom (completion-styles '(substring orderless))) - -(use-package! vertico - :init - (vertico-mode)) - -(use-package! savehist - :init - (savehist-mode)) - -(use-package! marginalia - :bind (("M-A" . marginalia-cycle) - :map minibuffer-local-map - ("M-A" . marginalia-cycle)) - :init - ;; Must be in the :init section of use-package such that the mode gets - ;; enabled right away. Note that this forces loading the package. - (marginalia-mode)) -#+end_src - -** Embark - -#+begin_src emacs-lisp -(use-package! embark - :bind - (("C-;" . embark-act)) - :init - ;; Optionally replace the key help with a completing-read interface - (setq prefix-help-command #'embark-prefix-help-command) - :config - (add-to-list 'display-buffer-alist - '("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*" - nil - (window-parameters (mode-line-format . none))))) - -(use-package! embark-consult - :after (embark consult) - :demand t ; only necessary if you have the hook below - ;; if you want to have consult previews as you move around an - ;; auto-updating embark collect buffer - :hook - (embark-collect-mode . consult-preview-at-point-mode)) -#+end_src - -** Consult - -#+begin_src emacs-lisp -;; Example configuration for Consult -(use-package! consult - ;; Replace bindings. Lazily loaded due by `use-package'. - :bind (;; C-c bindings (mode-specific-map) - ("C-c h" . consult-history) - ("C-c m" . consult-mode-command) - ("C-c b" . consult-bookmark) - ("C-c k" . consult-kmacro) - ;; C-x bindings (ctl-x-map) - ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command - ("C-x b" . consult-buffer) ;; orig. switch-to-buffer - ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window - ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame - ;; Custom M-# bindings for fast register access - ("M-#" . consult-register-load) - ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) - ("C-M-#" . consult-register) - ;; Other custom bindings - ("M-y" . consult-yank-pop) ;; orig. yank-pop - (" a" . consult-apropos) ;; orig. apropos-command - ;; M-g bindings (goto-map) - ("M-g e" . consult-compile-error) - ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck - ("M-g g" . consult-goto-line) ;; orig. goto-line - ("M-g M-g" . consult-goto-line) ;; orig. goto-line - ("M-g o" . consult-outline) ;; Alternative: consult-org-heading - ("M-g m" . consult-mark) - ("M-g k" . consult-global-mark) - ("M-g i" . consult-imenu) - ("M-g I" . consult-imenu-multi) - ;; M-s bindings (search-map) - ("M-s f" . consult-find) - ("M-s F" . consult-locate) - ("M-s g" . consult-grep) - ("M-s G" . consult-git-grep) - ("M-s r" . consult-ripgrep) - ("M-s l" . consult-line) - ("M-s L" . consult-line-multi) - ("M-s m" . consult-multi-occur) - ("M-s k" . consult-keep-lines) - ("M-s u" . consult-focus-lines) - ;; Isearch integration - ("M-s e" . consult-isearch) - :map isearch-mode-map - ("M-e" . consult-isearch) ;; orig. isearch-edit-string - ("M-s e" . consult-isearch) ;; orig. isearch-edit-string - ("M-s l" . consult-line) ;; needed by consult-line to detect isearch - ("M-s L" . consult-line-multi)) ;; needed by consult-line to detect isearch - - ;; Enable automatic preview at point in the *Completions* buffer. - ;; This is relevant when you use the default completion UI, - ;; and not necessary for Vertico, Selectrum, etc. - :hook (completion-list-mode . consult-preview-at-point-mode) - - ;; The :init configuration is always executed (Not lazy) - :init - - (setq register-preview-delay 0 - register-preview-function #'consult-register-format) - - (advice-add #'register-preview :override #'consult-register-window) - - ;; Use Consult to select xref locations with preview - (setq xref-show-xrefs-function #'consult-xref - xref-show-definitions-function #'consult-xref) - :config - ;; Optionally configure the narrowing key. - ;; Both < and C-+ work reasonably well. - (setq consult-narrow-key "<") ;; (kbd "C-+") - - (setq consult-project-root-function - (lambda () - (when-let (project (project-current)) - (car (project-roots project)))))) -#+end_src - -** Scheme - -#+begin_src emacs-lisp -(use-package! geiser-chicken - :config - (setq geiser-chicken-binary "chicken-csi")) - -(use-package! geiser - :init - (map! :map geiser-mode-map "C-." nil) - (map! :map geiser-repl-mode-map "C-." nil)) -#+end_src - -** Emacs - -#+begin_src emacs-lisp -(use-package! emacs - :init - ;; Do not allow the cursor in the minibuffer prompt - (setq minibuffer-prompt-properties - '(read-only t cursor-intangible t face minibuffer-prompt)) - (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode) - - ;; Emacs 28: Hide commands in M-x which do not work in the current mode. - ;; Vertico commands are hidden in normal buffers. - (setq read-extended-command-predicate - #'command-completion-default-include-p) - - ;; Enable recursive minibuffers - (setq enable-recursive-minibuffers t)) - -(use-package! boogie-friends) - -(use-package! ol-notmuch :after org) - -(use-package! circe - :config - (setq circe-network-options - `(("soju" :host "chat.sr.ht" :port 6697 :tls t - :sasl-username "ymherklotz/irc.libera.chat" - :sasl-password ,(ymhg/pass "sr.ht/chat.sr.ht") - :nick "ymherklotz")))) - -(defun ymhg/reset-coq-windows () - "Resets the Goald and Response windows." - (interactive) - (other-frame 1) - (delete-other-windows) - (split-window-below) - (switch-to-buffer "*goals*") - (other-window 1) - (switch-to-buffer "*response*") - (other-frame 1)) - -(define-key y-map (kbd "o") #'ymhg/reset-coq-windows) - -(defun ymhg--reset-coq-indentation () - "Reset slow indentation." - (setq-local indent-line-function #'indent-relative)) - -(after! coq-mode - (add-hook 'coq-mode-hook #'ymhg--reset-coq-indentation t) - (define-key coq-mode-map (kbd "C-c TAB") #'smie-indent-line) - (setq coq-indent-modulestart 0)) - -(use-package! alectryon - :hook (coq-mode . alectryon-mode) - :config - (when (eq system-type 'darwin) - (setq alectryon-executable "/nix/store/bvlk3hyrjdgl0sg93rrdr2z71hgza0m9-python3.9-alectryon-1.4.0/bin/alectryon")) - (map! :map alectryon-mode-map - "C-c u t" #'alectryon-toggle - "C-c u p" #'ymhg/alectryon-preview) - (defun ymhg/alectryon-preview () - "Display an HTML preview of the current buffer." - (interactive) - (let* ((html-fname (make-temp-file "alectryon" nil ".html")) - (args `("-r" "5" "-" ,html-fname))) - (apply #'call-process-region nil nil "rst2html5" nil nil nil args) - (message "Compilation complete") - (browse-url html-fname)))) - -(use-package! rst - :config - (add-hook 'rst-mode-hook (lambda () (setq fill-column 80)))) - -(use-package! ox-tufte - :after org - :config) - -(use-package! scroll-other-window - :hook (ConTeXt-mode . sow-mode)) - -(use-package! cdlatex - :hook (ConTeXt-mode . turn-on-cdlatex) - :init - (setq cdlatex-command-alist nil) - (setq cdlatex-math-modify-alist nil)) - -(use-package! boogie-friends - :config - (setq flycheck-dafny-executable (executable-find "dafny")) - (setq dafny-verification-backend 'cli)) - -;;(add-to-list 'load-path "/usr/local/Cellar/agda/2.6.2.2/cabal/store/ghc-8.10.7/Agd-2.6.2.2-3bca6588/share/emacs-mode") -;; -;;(use-package! agda2-mode) -#+end_src diff --git a/doom/init.el b/doom/init.el deleted file mode 100644 index e6e4aef..0000000 --- a/doom/init.el +++ /dev/null @@ -1,188 +0,0 @@ -;;; 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 information about all of Doom's modules -;; and what flags they support. - -;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or -;; 'C-c g 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 g d') on a module to browse its -;; directory (for easy access to its source code). - -(setq native-comp-deferred-compilation nil) -(after! (doom-packages straight) - (setq straight--native-comp-available t)) - -(doom! :input - ;;chinese - ;;japanese - - :completion - company ; the ultimate code completion backend - ;;helm ; the *other* search engine for love and life - ;;ido ; the other *other* search engine... - ;;ivy ; a search engine for love and life - vertico - - :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 - ;;fill-column ; a `fill-column' indicator - ;;hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW - hydra - ;;indent-guides ; highlighted in dent columns - (modeline +light) ; snazzy, Atom-inspired modeline, plus API - ;;nav-flash ; blink the current line after jumping - ;;neotree ; a project drawer, like NERDTree for vim - ;;ophints ; highlight the region an operation acts on - (popup +defaults) ; tame sudden yet inevitable temporary windows - ;;pretty-code ; replace bits of code with pretty symbols - ;;tabs ; an tab bar for Emacs - ;;treemacs ; a project drawer, like neotree but cooler - ;;unicode ; extended unicode support for various languages - ;;vc-gutter ; 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 +manual) ; 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 - vc ; version-control and Emacs, sitting in a tree - - :term - ;;eshell ; a consistent, cross-platform shell (WIP) - ;;shell ; a terminal REPL for Emacs - ;;term ; terminals in Emacs - ;;vterm ; another terminals in Emacs - - :checkers - syntax ; tasing you for every semicolon you forget - (spell +aspell) ; tasing you for misspelling mispelling - ;;grammar ; tasing grammar mistake every you make - - :tools - ;;ansible - ;;debugger ; FIXME stepping through code, to help you add bugs - direnv - ;;docker - ;;editorconfig ; let someone else argue about tabs vs spaces - ;;ein ; tame Jupyter notebooks with emacs - eval ; run code, run (also, repls) - ;;gist ; interacting with github gists - lookup ; navigate your code and its documentation - (lsp +eglot) - magit ; a git porcelain for Emacs - ;;make ; run make tasks from Emacs - (pass +auth) ; password manager for nerds - pdf ; pdf enhancements - ;;prodigy ; FIXME managing external services & code builders - ;;rgb ; creating color strings - ;;terraform ; infrastructure as code - ;;tmux ; an API for interacting with tmux - ;;upload ; map local to remote projects via ssh/ftp - - :lang - ;;agda ; types of types of types of types... - ;;assembly ; assembly for fun or debugging - cc ; C/C++/Obj-C madness - ;;clojure ; java with a lisp - 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 - ;;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 - ;;faust ; dsp, but you get to keep your soul - ;;fsharp ; ML stands for Microsoft's Language - ;;fstar ; (dependent) types and (monadic) effects and Z3 - ;;go ; the hipster dialect - (haskell +lsp) ; a language that's lazier than I am - ;;hy ; readability of scheme w/ speed of python - ;;idris ; - ;;(java +meghanada) ; the poster child for carpal tunnel syndrome - ;;javascript ; all(hope(abandon(ye(who(enter(here)))))) - ;;julia ; a better, faster MATLAB - ;;kotlin ; a better, slicker Java(Script) - latex ; writing papers in Emacs has never been so fun - ;;lean - ;;factor - ledger ; an accounting system in Emacs - 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 - (org ; organize your plain life in plain text - +gnuplot - ;;+dragndrop ; drag & drop files/images into org buffers - +hugo ; use Emacs for hugo blogging - ;;+jupyter ; ipython/jupyter support for babel - +pandoc ; export-with-pandoc support - ;;+pomodoro ; be fruitful with the tomato technique - +present ; using org-mode for presentations - ) - ;;perl ; write code no one else can comprehend - ;;php ; perl's insecure younger brother - ;;plantuml ; diagrams for confusing people more - ;;purescript ; javascript, but functional - python ; beautiful is better than ugly - ;;qt ; the 'cutest' gui framework ever - ;;racket ; a DSL for DSLs - ;;rest ; Emacs as a REST client - rst ; ReST in peace - ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} - rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() - ;;scala ; java, but good - (scheme +guile +chicken +racket) ; a fully conniving family of lisps - sh ; she sells {ba,z,fi}sh shells on the C xor - ;;solidity ; do you need a blockchain? No. - ;;swift ; who asked for emoji variables? - ;;terra ; Earth and Moon in alignment for performance. - ;;web ; the tubes - - :email - ;;(mu4e +gmail) - notmuch - ;;(wanderlust +gmail) - - :app - ;;calendar - irc ; how neckbeards socialize - (rss +org) ; emacs as an RSS reader - ;;twitter ; twitter client https://twitter.com/vnought - - :config - literate - (default +bindings +smartparens) - - :os - (:if IS-MAC macos) - tty) diff --git a/doom/packages.el b/doom/packages.el deleted file mode 100644 index 3d4e82a..0000000 --- a/doom/packages.el +++ /dev/null @@ -1,75 +0,0 @@ -;; Disabling packages -(disable-packages! undo-tree org-bullets helm pretty-code) - -;; `org-mode' dependencies -(package! ol-notmuch) -(package! org-contrib - :recipe (:host nil :repo "https://git.sr.ht/~bzg/org-contrib") - :pin "c6aef31ccfc7c4418c3b51e98f7c3bd8e255f5e6") -;;(package! org-contacts) -;; `org-bullets' replacement -(package! org-superstar) -(package! ox-gfm) -(package! ox-tufte - :recipe (:host nil :repo "https://git.sr.ht/~ymherklotz/ox-tufte")) -(package! scroll-other-window - :recipe (:host nil :repo "https://git.sr.ht/~ymherklotz/scroll-other-window")) -(package! cdlatex) -(package! citeproc) -(package! ox-context - :recipe (:host github :repo "Jason-S-Ross/ox-context")) -(package! org-transclusion - :recipe (:host github :repo "nobiot/org-transclusion")) -(package! org-zettelkasten - :recipe (:host github :repo "ymherklotz/emacs-zettelkasten") - :pin "7278052cb451178a2f1ffc61569156ca0adcc34a") -(package! org-auto-tangle - :recipe (:host github :repo "yilkalargaw/org-auto-tangle") - :pin "bce665c79fc29f1e80f1eae7db7e91c56b0788fc") -(package! elfeed-score) - -(package! ef-themes - :recipe (:host nil :repo "https://git.sr.ht/~protesilaos/ef-themes")) - -(package! alectryon) - -;; Bibtex stuff -(package! ebib) - -;; Haskell stuff -(package! ormolu) - -;; Completion -(package! orderless) -(package! marginalia) -(package! embark) -(package! embark-consult) -(package! ripgrep) - -;; Extra language mobdes -(package! yaml-mode) -(package! pollen-mode) - -;; Nix -(package! direnv) - -;; Misc dependencies -(package! hungry-delete) - -;; Teaching -(package! boogie-friends) - -;; Privacy -(package! pinentry) - -;; Emacs lisp -(package! package-lint) - -;; Themes -(package! color-theme-sanityinc-tomorrow) -(package! modus-themes) - -(package! ef-themes - :recipe (:host nil :repo "https://git.sr.ht/~protesilaos/ef-themes")) - -(package! mmm-mode) -- cgit