Compare commits

..

77 Commits

Author SHA1 Message Date
Nathan Dwarshuis c1db214e70 Merge branch 'master' into dev_org_ml 2024-06-13 17:53:55 -04:00
Nathan Dwarshuis c4d3477183 ENH update packages 2024-06-09 10:31:53 -04:00
Nathan Dwarshuis 7425f53b94 ENH update packages 2024-06-02 20:49:57 -04:00
Nathan Dwarshuis 07b78d9cc7 ENH update packages 2024-05-26 09:45:35 -04:00
Nathan Dwarshuis c0fb175b28 ENH update packages 2024-05-19 09:53:26 -04:00
Nathan Dwarshuis 58c356237a ENH update packages 2024-05-12 11:48:26 -04:00
Nathan Dwarshuis e65b341abe ENH disable pyenv 2024-05-06 21:57:06 -04:00
Nathan Dwarshuis 6067be3d40 ENH update packages 2024-05-05 12:01:44 -04:00
Nathan Dwarshuis fa844f5e16 ENH update packages 2024-04-29 21:24:08 -04:00
Nathan Dwarshuis 1ff53fe043 ENH update packages 2024-04-21 10:41:16 -04:00
Nathan Dwarshuis 0d18d3efb6 ENH update packages 2024-04-14 10:51:47 -04:00
Nathan Dwarshuis 36d2040194 ENH update packages 2024-04-07 07:02:38 -04:00
Nathan Dwarshuis 13ab8b24bf ENH update packages 2024-03-31 08:21:25 -04:00
Nathan Dwarshuis 6624ce05bf FIX another quoting bug 2024-03-30 14:32:15 -04:00
Nathan Dwarshuis b18e7ac237 FIX mime type bugs 2024-03-30 14:28:04 -04:00
Nathan Dwarshuis cec9af4ecb ENH update packages 2024-03-17 10:33:00 -04:00
Nathan Dwarshuis 4aa2389cb0 ADD mbsync override script 2024-03-14 21:33:59 -04:00
Nathan Dwarshuis 0d17555500 FIX typo 2024-03-14 10:19:32 -04:00
Nathan Dwarshuis 6df300b58a ENH make email config modular 2024-03-14 10:19:08 -04:00
Nathan Dwarshuis 810f759d1c FIX mime type matching 2024-03-11 13:00:38 -04:00
Nathan Dwarshuis 8e7f54fea6 ENH update packages 2024-03-10 09:42:34 -04:00
Nathan Dwarshuis 3d4fe298ad FIX remove silly border around logo 2024-03-05 09:21:42 -05:00
Nathan Dwarshuis 4a71191a9d ENH disable systemd 2024-03-04 21:16:29 -05:00
Nathan Dwarshuis ebaf5055ef ADD restart options 2024-03-04 21:15:42 -05:00
Nathan Dwarshuis b04ba759c9 ADD master control file 2024-03-04 20:49:16 -05:00
Nathan Dwarshuis 520477884b ADD toggle for light and dark mode 2024-03-04 15:31:55 -05:00
Nathan Dwarshuis 24c327dfd9 ENH update packages 2024-03-03 10:20:10 -05:00
Nathan Dwarshuis caaa0d4597 ENH remove journal from org 2024-03-03 10:20:03 -05:00
Nathan Dwarshuis e27ecc5547 ENH make junk a bit more symbolically sassay 2024-02-29 09:43:00 -05:00
Nathan Dwarshuis db5b994d9e ADD mu4e spam folder 2024-02-28 22:43:19 -05:00
Nathan Dwarshuis 723955a12d ENH update packages 2024-02-25 10:24:03 -05:00
Nathan Dwarshuis a6ef9a3bba ENH remove done entries from link menu 2024-02-19 18:07:49 -05:00
Nathan Dwarshuis 3c1808b652 ENH update packages 2024-02-18 08:15:07 -05:00
Nathan Dwarshuis df12172de1 ENH update packages 2024-02-11 10:25:22 -05:00
Nathan Dwarshuis 37353d6912 ENH update packages 2024-02-04 11:42:34 -05:00
Nathan Dwarshuis 69afcc47bc ENH update packages 2024-01-28 09:56:11 -05:00
Nathan Dwarshuis 3ff5ee83e7 ENH update packages 2024-01-22 10:09:13 -05:00
Nathan Dwarshuis 994635859a ENH update packages 2024-01-14 15:27:03 -05:00
Nathan Dwarshuis 003ea4b0f9 ADD reference targets I forgot 2024-01-12 09:52:36 -05:00
Nathan Dwarshuis 5234596b4c ENH update packages 2024-01-07 11:57:17 -05:00
Nathan Dwarshuis 5af5d4952e ENH commit git buffers in emacs natively 2024-01-07 11:05:03 -05:00
Nathan Dwarshuis acef51b7d6 ADD mu sync script 2024-01-07 10:03:25 -05:00
Nathan Dwarshuis a1010506d8 ADD startup scripts 2024-01-07 09:25:42 -05:00
Nathan Dwarshuis bc9842709c FIX silly bug 2024-01-01 21:52:17 -05:00
Nathan Dwarshuis 7b409b69c5 ENH update packages 2023-12-31 10:45:56 -05:00
Nathan Dwarshuis fb752313ee ENH update packages 2023-12-26 10:38:31 -05:00
Nathan Dwarshuis fd3c511a5d ENH update packages 2023-12-17 15:34:53 -05:00
Nathan Dwarshuis 58659bec49 ENH update packages 2023-12-10 16:21:17 -05:00
Nathan Dwarshuis c1aa4a63b1 ENH update packages 2023-12-03 10:29:59 -05:00
Nathan Dwarshuis ef69737080 ENH update packages 2023-11-26 22:39:08 -05:00
Nathan Dwarshuis 44dccfc006 ENH update packages 2023-11-20 10:23:34 -05:00
Nathan Dwarshuis a6f137d0db ENH update packages 2023-11-13 10:51:45 -05:00
Nathan Dwarshuis 237cf43c74 ENH update packages 2023-11-08 19:35:26 -05:00
Nathan Dwarshuis 65d4152d27 ENH update pckages 2023-10-29 19:45:25 -04:00
Nathan Dwarshuis 4071cf4f68 ENH update packages 2023-10-23 23:02:42 -04:00
Nathan Dwarshuis a45f0414d7 ENH update packages 2023-10-15 14:50:32 -04:00
Nathan Dwarshuis 307cb2676b ENH update packages 2023-10-08 17:18:57 -04:00
Nathan Dwarshuis 94c67f76eb ENH don't use pyenv hook unless we need it 2023-10-06 16:43:14 -04:00
Nathan Dwarshuis e18db58d0c ENH update packages 2023-10-01 15:44:09 -04:00
Nathan Dwarshuis cb1eda831f ENH update packages 2023-09-24 14:48:06 -04:00
Nathan Dwarshuis 894483c013 ENH update packages 2023-09-17 14:56:21 -04:00
Nathan Dwarshuis 0ae075ba75 ENH update packages 2023-09-12 10:32:52 -04:00
Nathan Dwarshuis 1d524aaff2 ENH update packages 2023-09-03 16:29:51 -04:00
Nathan Dwarshuis ea09d97957 ADD bats 2023-09-03 16:29:47 -04:00
Nathan Dwarshuis 39d0ddc2bd ENH update packages 2023-08-28 13:05:13 -04:00
Nathan Dwarshuis adbac12265 ENH update packages 2023-08-20 17:07:12 -04:00
Nathan Dwarshuis 0b98573f79 ENH upate packages 2023-08-13 14:42:12 -04:00
Nathan Dwarshuis 90b48c11b7 FIX ord folding and arrows 2023-08-13 14:42:04 -04:00
Nathan Dwarshuis ebda9d0079 ENH update packages 2023-08-06 23:26:39 -04:00
Nathan Dwarshuis 359e53f581 ENH update packages 2023-07-30 18:31:53 -04:00
Nathan Dwarshuis 34e031d440 ENH update packages 2023-07-23 14:31:08 -04:00
Nathan Dwarshuis d9f78ffb1f ENH update packages 2023-07-16 22:30:49 -04:00
Nathan Dwarshuis 214257ff55 FIX haskell-flycheck bug 2023-07-16 22:30:36 -04:00
Nathan Dwarshuis 7420de7ca3 FIX ess comint color thing 2023-07-09 16:12:12 -04:00
Nathan Dwarshuis 4a3bfe0231 ENH update packages 2023-07-09 14:34:46 -04:00
Nathan Dwarshuis 438bf90289 ENH update packages 2023-07-02 14:05:31 -04:00
Nathan Dwarshuis 64ab96f3cc ENH update packages 2023-06-25 16:10:54 -04:00
12 changed files with 587 additions and 323 deletions

1
.gitignore vendored
View File

@ -4,6 +4,7 @@
!init.el
!straight-boot.el
!runtime_pkgs
!bin
# track versions of installed packages
!straight

21
bin/autogit Executable file
View File

@ -0,0 +1,21 @@
#!/bin/sh
### Add org file changes to git repo
for REPO in $1
do
echo "repository: $REPO"
eval "cd $REPO"
# check for errors
if ! git fsck --strict > /dev/null 2>&1; then
notify-send "Org git commit failed."
fi
# remove deleted files
git ls-files --deleted -z | xargs -0 git rm >/dev/null 2>&1
# add new files
git add . >/dev/null 2>&1
git commit -m "$(date)"
# push
git push origin master
done
echo Done

5
bin/emacs-start Executable file
View File

@ -0,0 +1,5 @@
#! /bin/bash
# start the emacs daemon
emacs --fg-daemon > /dev/null 2>&1

5
bin/emacs-stop Executable file
View File

@ -0,0 +1,5 @@
#! /bin/bash
# stop the emacs daemon
emacsclient --eval "(kill-emacs)"

76
bin/emacs_ctl Executable file
View File

@ -0,0 +1,76 @@
#!/bin/bash
state=/tmp/emacs-use-dark-mode
start_daemon () {
emacs --fg-daemon > /dev/null 2>&1
}
stop_daemon () {
emacsclient --eval "(kill-emacs)" 2> /dev/null
}
kill_daemon () {
killall emacsclient 2> /dev/null
killall emacs 2> /dev/null
}
restart_daemon () {
stop_daemon
start_daemon
}
hard_restart_daemon () {
kill_daemon
start_daemon
}
set_light () {
echo 0 > "$state"
}
set_dark () {
echo 1 > "$state"
}
if [[ -z "$1" ]]; then
echo "Need a command to perform"
exit 1
elif [[ "$1" == "start" ]]; then
start_daemon &
elif [[ "$1" == "stop" ]]; then
stop_daemon
elif [[ "$1" == "kill" ]]; then
kill_daemon
elif [[ "$1" == "restart" ]]; then
restart_daemon &
elif [[ "$1" == "hard_restart" ]]; then
hard_restart_daemon &
elif [[ "$1" == "theme" ]]; then
if [[ "$2" == "toggle" ]]; then
# if no state file assume light theme
if [[ ! -f "$state" ]]; then
set_light
elif [[ "$(cat $state)" == 0 ]]; then
set_dark
else
set_light
fi
elif [[ "$2" == "light" ]]; then
set_light
elif [[ "$2" == "dark" ]]; then
set_dark
else
echo 'Invlalid theme command'
exit 1
fi
if [ "$3" == "restart" ]; then
restart_daemon &
elif [ "$3" == "hard_restart" ]; then
hard_restart_daemon &
fi
else
echo 'Invalid command'
exit 1
fi

10
bin/mbsync Executable file
View File

@ -0,0 +1,10 @@
#! /bin/sh
rcpath=$XDG_CONFIG_HOME/emacs/local/lib/mu4e/mbsyncrc
if [ ! -f $rcpath ]; then
echo "mbsyncrc does not exist"
exit 1
fi
/usr/bin/mbsync -c "$rcpath" "$@"

12
bin/mu-index-emacs-maybe Executable file
View File

@ -0,0 +1,12 @@
#! /bin/sh
## indexes mu depending on whether emacs mu4e is running
## assume the mu server is only started by mu4e
if pgrep -fx '/usr/bin/mu server' > /dev/null; then
echo indexing mu through emacs
emacsclient -e '(mu4e-update-index)' > /dev/null
else
echo indexing mu natively
mu index
fi

View File

@ -272,7 +272,8 @@ OS is one of those in `system-type'."
"Return all applications that can open a given MIMETYPE.
The list is comprised of alists where pairs are of the form (name . command)."
(let ((case-fold-search nil)
(mime-regex (format "^MimeType=.*%s;?.*$" mimetype)))
(mime-regex (->> (regexp-quote mimetype)
(format "^MimeType=.*%s;?.*$"))))
(->> (list "/usr/share/applications"
"/usr/local/share/applications"
"~/.local/share/applications")
@ -294,16 +295,17 @@ multiple files at once for given MIMETYPE."
(defun nd/execute-desktop-command (cmd file)
"Opens FILE using CMD in separate process where CMD is from a
desktop file exec directive."
(--> (format "'%s'" file)
(--> (shell-quote-argument file)
(replace-regexp-in-string "%[fuFU]" it cmd t t)
(format "%s &" it)
(call-process-shell-command it)))
(defun nd/get-mime-type (file)
"Get the mime type of FILE."
(let* ((cmd (format "file --mime-type -b '%s'" file))
(mt (shell-command-to-string cmd)))
(replace-regexp-in-string "\n\\'" "" mt)))
(->> (shell-quote-argument file)
(format "file --mime-type -b %s")
(shell-command-to-string)
(s-trim)))
(defconst nd/device-mount-dirs
(list
@ -341,6 +343,17 @@ If FRONT is t, do to the front of current values instead of the back."
(--each
(where-is-internal f keymap nil nil)
(define-key keymap it nil)))
(defun nd/run-at-hour-minute (hh mm rep cmd &rest args)
"Run CMD starting at next integral HH and MM repeating every REP seconds.
For example, to run every hour at 45 minutes HH would be 1 and MM would be 45."
(let* ((m (* mm 60))
(h (* hh 3600))
(now (float-time))
(next (- (+ m (* h (ceiling (/ (- now m) h)))) now)))
(apply #'run-at-time next rep cmd args)))
#+END_SRC
** interactive
#+BEGIN_SRC emacs-lisp
@ -444,10 +457,25 @@ This theme has good functionality for many different modes without being over-th
Since I run emacs in [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html][client/server]] mode, the loaded theme can change depending on if the client is a terminal or server (terminals have far fewer colors). This makes the theme reset when terminal is loaded before gui or vice versa.
#+BEGIN_SRC emacs-lisp
(defvar nd/theme 'spacemacs-dark)
(defvar nd/theme nil)
(defvar nd/theme-dark nil)
(defvar nd/theme-window-loaded nil)
(defvar nd/theme-terminal-loaded nil)
(defun nd/read-use-dark-mode-p ()
"Return t if flag file permits us to use dark mode."
(let ((path "/tmp/emacs-use-dark-mode"))
(when (f-exists-p path)
(equal (s-trim (f-read-text path)) "1"))))
(setq nd/theme-dark (nd/read-use-dark-mode-p))
(defmacro nd/choose-theme (light-stuff dark-stuff)
"Do LIGHT-STUFF or DARK-STUFF depending on the selected theme."
`(if nd/theme-dark ,dark-stuff ,light-stuff))
(setq nd/theme (nd/choose-theme 'spacemacs-light 'spacemacs-dark))
(setq default-frame-alist '((font . "Dejavu Sans Mono-11")))
;; required for emacsclient/daemon setup
@ -554,13 +582,19 @@ Some modes like to make popup windows (eg ediff). This prevents that.
*** ace-window
This is an elegant window selector. It displays a number in the corner when activated, and windows may be chosen by pressing the corresponding number. Note that spacemacs fails to make the numbers look nice so the theme code is a workaround to make them smaller and prettier.
#+BEGIN_SRC emacs-lisp
(defvar nd/ace-window-fg nil)
(defvar nd/ace-window-bg nil)
(setq nd/ace-window-fg (nd/choose-theme "#F6E0F9" "#292b2e"))
(setq nd/ace-window-bg (nd/choose-theme "#7A1686" "#292b2e"))
(use-package ace-window
:straight t
:config
(setq aw-background t)
(custom-set-faces '(aw-leading-char-face
((t (:foreground "#292b2e"
:background "#bc6ec5"
(custom-set-faces `(aw-leading-char-face
((t (:foreground ,nd/ace-window-fg
:background ,nd/ace-window-bg
:height 1.0
:box nil))))))
#+END_SRC
@ -573,10 +607,13 @@ This is an elegant window selector. It displays a number in the corner when acti
(format "%-50s %s" b f)
b)))
(defvar nd/ivy-match-bg nil)
(setq nd/ivy-match-bg (nd/choose-theme "#D4C7F3" "#534573"))
(use-package ivy
:straight t
:delight
:custom-face (ivy-current-match ((t (:inherit bold :extend t :background "#534573"))))
:config
(setq ivy-use-virtual-buffers nil
ivy-sort-max-size 30000
@ -598,7 +635,10 @@ This is an elegant window selector. It displays a number in the corner when acti
(ivy--alist-set 'ivy-format-functions-alist t #'ivy-format-function-line)
(ivy-configure 'ivy-switch-buffer
:display-transformer-fn #'nd/ivy-swith-buffer-transformer-fn)
(ivy-mode))
(ivy-mode)
(set-face-attribute 'ivy-current-match nil :inherit 'bold :extend t :background nd/ivy-match-bg)
;;(ivy-current-match ((t (:inherit bold :extend t :background 'nd/ivy-match-bg))))
)
;; ensure counsel and swiper are loaded
(use-package counsel
@ -662,6 +702,14 @@ Some prompts require literal "yes" or "no" to decide action. Life is short and I
minor-mode-alist)))
(delight 'origami-mode "Ω" "origami"))
#+END_SRC
*** dired
:PROPERTIES:
:ID: bf9f4e06-7440-40bd-8c58-5bdf1ce8d920
:CREATED: [2023-08-01 Tue 00:01]
:END:
#+begin_src emacs-lisp
(setq dired-free-space nil)
#+end_src
* low-level config
General configuation for behind-the-scenes behavior
** user information
@ -891,10 +939,14 @@ End rant.
Oh yes, and to get linting to work, also install r-lintr and r-styler in the conda environment. In general it seems better and less risky to install things from =conda= rather than from within an R session.
#+begin_src emacs-lisp
(nd/when-bin "conda"
(use-package xterm-color
:straight t)
(use-package ess
:straight t
:init
(require 'ess-r-mode)
:after xterm-color
:hook
((ess-mode . flycheck-mode)
(ess-mode . company-mode)
@ -913,7 +965,14 @@ Oh yes, and to get linting to work, also install r-lintr and r-styler in the con
;; for RStudio by the people who maintain RStudio
ess-style 'RStudio
;; always start from the current file
ess-startup-directory 'default-directory)))
ess-startup-directory 'default-directory))
;; Workaround for https://github.com/emacs-ess/ESS/issues/1193
(defun my-inferior-ess-init ()
(add-hook 'comint-preoutput-filter-functions #'xterm-color-filter -90 t)
(setq-local ansi-color-for-comint-mode nil))
(add-hook 'inferior-ess-mode-hook #'my-inferior-ess-init))
;; ;; fast compile
;; (defun nd/ess-r-add-env (orig-fun inf-buf proc-name start-args)
@ -992,7 +1051,6 @@ Note that all my checkers/formatters/interactive shells are managed through =con
(python-mode . company-mode)
(python-mode . nd/init-anaconda-company)
(python-mode . blacken-mode)
(python-mode . pyenv-mode)
(inferior-python-mode . company-mode)
(inferior-python-mode . nd/init-anaconda-company))
:config
@ -1024,19 +1082,20 @@ For isolation I use [[https://github.com/pyenv/pyenv][pyenv]] and [[https://gith
Note this also requires all external packages to be installed in each environement (eg ipython, black, flake8, and pylint).
#+BEGIN_SRC emacs-lisp
(nd/require-bin "pyenv")
(nd/when-bin "pyenv"
(use-package pyenv-mode
:straight t
:after python
:init (-some--> (getenv "PYENV_ROOT")
(f-join it "versions")
(add-to-list 'exec-path it)))
;; resolve symlinks when setting the pyenv, otherwise we get some
;; strange errors when activating a symlinked env
(advice-add #'pyenv-mode-full-path :filter-return #'file-truename))
;;(nd/require-bin "pyenv")
;;
;;(nd/when-bin "pyenv"
;; (use-package pyenv-mode
;; :straight t
;; :after python
;; :hook ((python-mode . pyenv-mode))
;; :init (-some--> (getenv "PYENV_ROOT")
;; (f-join it "versions")
;; (add-to-list 'exec-path it)))
;;
;; ;; resolve symlinks when setting the pyenv, otherwise we get some
;; ;; strange errors when activating a symlinked env
;; (advice-add #'pyenv-mode-full-path :filter-return #'file-truename))
#+END_SRC
*** Snakemake
#+begin_src emacs-lisp
@ -1097,7 +1156,20 @@ I have also found this to be much simpler and conflicting with other packages su
;; flycheck setup (needed to get flycheck to pay attention to flags/extensions
;; in cabal files)
(use-package flycheck-haskell
:straight t)
:straight t
:after flycheck
:config
;; fix whatever they did here: https://github.com/flycheck/flycheck-haskell/pull/118
(setq flycheck-haskell-runghc-command
(let ((stack-exe (funcall flycheck-executable-find "stack")))
`(,stack-exe "--verbosity" "silent" "runghc" "--no-ghc-package-path" "--" "-i"
"-packageCabal"
"-packagebase"
"-packagebytestring"
"-packagecontainers"
"-packageprocess"
"-packagedirectory"
"-packagefilepath"))))
(use-package haskell-mode
:straight t
@ -1410,8 +1482,8 @@ This adds support for csv files. Almost makes them editable like a spreadsheet.
(use-package pkgbuild-mode
:straight t)
(use-package systemd
:straight systemd)
;; (use-package systemd
;; :straight systemd)
#+END_SRC
*** Unix Shell
No custom code here, but flycheck needs =shellcheck= (a Haskell program).
@ -1420,6 +1492,10 @@ No custom code here, but flycheck needs =shellcheck= (a Haskell program).
;;(add-to-list 'load-path (nd/expand-local-pkg-directory "essh"))
;;(require 'essh)
(use-package bats-mode
:straight t)
#+END_SRC
*** SQL
No custom code here, but flycheck needs =sqlint= (a ruby gem).
@ -1668,7 +1744,10 @@ Additionally, using specialized file variables makes it much easier and faster t
org-x-action-files (list "general.org" "projects/*.org")
org-x-incubator-files (list "incubator.org")
org-x-capture-file "capture.org"
org-x-reference-files (list "reference/idea.org" "reference/questions.org")
org-x-reference-files (list "reference/idea.org"
"reference/questions.org"
"reference/record.org"
"reference/resources.org")
org-x-endpoint-goal-file "reference/goals/endpoint.org"
org-x-lifetime-goal-file "reference/goals/lifetime.org"
org-x-survival-goal-file "reference/goals/survival.org"
@ -1683,14 +1762,24 @@ Additionally, using specialized file variables makes it much easier and faster t
(org-x-get-reference-files :maxlevel . 9)))
#+END_SRC
*** autosave
Save all org buffers 1 minute before the hour.
Save all org buffers 1 minute before the hour, then commit whatever I saved.
#+BEGIN_SRC emacs-lisp
(defun nd/org-save-all-org-buffers ()
"Save org buffers without confirmation or message (unlike default)."
(save-some-buffers t (lambda () (derived-mode-p 'org-mode)))
(when (featurep 'org-id) (org-id-locations-save)))
(run-at-time "00:59" 3600 #'nd/org-save-all-org-buffers)
(defun nd/org-commit-repos ()
"Commit org git repos automatically"
(let* ((cmd (format "autogit \"%s\"" org-directory)))
(async-shell-command cmd)))
;; TODO don't hardcode this name
(add-to-list 'display-buffer-alist
'("\\*Async Shell Command\\*" display-buffer-no-window))
(nd/run-at-hour-minute 1 59 3600 #'nd/org-save-all-org-buffers)
(nd/run-at-hour-minute 1 0 3600 #'nd/org-commit-repos)
#+END_SRC
*** stateless configuration
=org-ml= provides stateless functions for operating on org buffers.
@ -1720,11 +1809,16 @@ The advantage of doing it this way is that I can byte-compile and test independe
(require 'org-x)
#+end_src
** buffer interface
*** startup folding
*** folding
Org 9.4 by default makes files open with the outline totally unfolded. I don't like this; it makes it seem like my laptop is screaming at me whenever I view an org file.
#+begin_src emacs-lisp
(setq org-startup-folded t)
#+end_src
Org 9.6 seemed to switch the default folding style which breaks search/replace. Change it back like so.
#+begin_src emacs-lisp
(setq org-fold-core-style 'overlays)
#+end_src
*** line wrap
I often write long, lengthy prose in org buffers, so use =visual-line-mode= to make lines wrap in automatic and sane manner.
#+BEGIN_SRC emacs-lisp
@ -2122,13 +2216,18 @@ In terms of logging, I like to record the time of each change upon leaving any s
**** colors
Aesthetically, I like all my keywords to have bold colors.
#+BEGIN_SRC emacs-lisp
(setq org-todo-keyword-faces
`((,org-x-kw-todo :foreground "light coral" :weight bold)
(,org-x-kw-next :foreground "khaki" :weight bold)
(,org-x-kw-done :foreground "light green" :weight bold)
(,org-x-kw-wait :foreground "orange" :weight bold)
(,org-x-kw-hold :foreground "violet" :weight bold)
(,org-x-kw-canc :foreground "deep sky blue" :weight bold)))
(setq
org-todo-keyword-faces
(-let (((todo next done wait hold canc)
(nd/choose-theme
'("indian red" "dark goldenrod" "forest green" "dark orange" "dark violet" "DodgerBlue1")
'("light coral" "khaki" "light green" "orange" "violet" "deep sky blue"))))
`((,org-x-kw-todo :foreground ,todo :weight bold)
(,org-x-kw-next :foreground ,next :weight bold)
(,org-x-kw-done :foreground ,done :weight bold)
(,org-x-kw-wait :foreground ,wait :weight bold)
(,org-x-kw-hold :foreground ,hold :weight bold)
(,org-x-kw-canc :foreground ,canc :weight bold))))
#+END_SRC
*** links and IDs
IDs and links are useful for meetings where I either reference tasks to discuss or reference action items to do in the future.
@ -2199,11 +2298,15 @@ Each group also has its own color, defined by its prefix symbol.
(->> (alist-get prefix grouped-tags)
(--map (list it :foreground color)))))
(setq org-tag-faces
(append
(add-foreground org-x-tag-location-prefix "PaleGreen")
(add-foreground org-x-tag-resource-prefix "SkyBlue")
(add-foreground org-x-tag-misc-prefix "PaleGoldenrod")
(add-foreground org-x-tag-category-prefix "violet")))))
(-let (((loc res misc cat)
(nd/choose-theme
'("medium sea green" "steel blue" "dark goldenrod" "dark violet")
'("PaleGreen" "SkyBlue" "PaleGoldenrod" "violet"))))
(append
(add-foreground org-x-tag-location-prefix loc)
(add-foreground org-x-tag-resource-prefix res)
(add-foreground org-x-tag-misc-prefix misc)
(add-foreground org-x-tag-category-prefix cat))))))
#+END_SRC
*** properties
The built-in =effort= is used as the fourth and final homonymous GTD context (the other three being covered above using tags). It is further restricted with =Effort_All= to allow easier filtering in the agenda.
@ -2353,11 +2456,11 @@ Prevent accidental refiling under tasks with done keywords
;; TODO this no work, although does work if var is global
;; redfining the targets works for now
(add-hook 'org-agenda-mode-hook
(lambda ()
(when (equal (buffer-name) "*Org Agenda(A)*")
(setq-local org-refile-targets
'(("~/Org/journal/goals.org" :maxlevel . 9))))))
;; (add-hook 'org-agenda-mode-hook
;; (lambda ()
;; (when (equal (buffer-name) "*Org Agenda(A)*")
;; (setq-local org-refile-targets
;; '(("~/Org/journal/goals.org" :maxlevel . 9))))))
;; (lambda () (when (org-entry-get nil "GOAL") t))))))
;; (setq org-refile-targets '((nil :maxlevel . 9)
;; ("~/Org/reference/idea.org" :maxlevel . 9)
@ -2378,9 +2481,15 @@ The modeline is a nice place to indicate if something is clocked in or out. Unfo
Solution: flashy colors.
#+BEGIN_SRC emacs-lisp
(defvar nd/spaceline-clock-fg nil)
(defvar nd/spaceline-clock-bg nil)
(setq nd/spaceline-clock-fg (nd/choose-theme "#3E3D31" "#3E3D31"))
(setq nd/spaceline-clock-bg (nd/choose-theme "#88F918" "#66cd00"))
(defface nd/spaceline-highlight-clocked-face
`((t (:background "chartreuse3"
:foreground "#3E3D31"
`((t (:background ,nd/spaceline-clock-bg
:foreground ,nd/spaceline-clock-fg
:inherit 'mode-line)))
"Default highlight face for spaceline.")
@ -3294,197 +3403,207 @@ Initialize by running =nd/mu-init=.
#+BEGIN_SRC emacs-lisp
(nd/require-bin "pandoc" :aur "pandoc-bin")
(nd/when-bin "mu"
(require 'mu4e)
(use-package password-store
:straight t)
(let ((acnts-path (f-join (nd/expand-lib-directory "mu4e") "accounts.el")))
(when (f-exists-p acnts-path)
(nd/when-bin "mu"
;; load mu itself
(require 'mu4e)
(require 'smtpmail)
;; (require 'smtpmail-async)
(defun nd/make-mu4e-context (name dir addr smtp-srv sent-behavior)
(let* ((trash (format "/%s/trash" dir))
(drafts (format "/%s/drafts" dir))
(sent (format "/%s/sent" dir))
(archive (format "/%s/archive" dir))
(inbox (format "/%s/inbox" dir))
(shortcuts (--map (list :maildir (car it) :key (cdr it))
`((,trash . ?t)
(,drafts . ?d)
(,sent . ?s)
(,archive . ?a)
(,inbox . ?i))))
;;
;; apply common config shared b/t all accounts I use
;;
(mf (lambda (d msg)
(-some--> msg
(mu4e-message-field it :maildir)
(string-prefix-p (concat "/" d) it)))))
(make-mu4e-context
:name name
:match-func (-partial mf dir) ; use lexical scope here
:vars `((mu4e-trash-folder . ,trash)
(mu4e-drafts-folder . ,drafts)
(mu4e-sent-folder . ,sent)
(mu4e-refile-folder . ,archive)
(mu4e-sent-messages-behavior . ,sent-behavior)
(smtpmail-stream-type . starttls)
(smtpmail-smtp-server . ,smtp-srv)
(smtpmail-smtp-service . 587)
(smtpmail-smtp-user . ,addr)
(user-mail-address . ,addr)
(mu4e-maildir-shortcuts . ,shortcuts)))))
(defun nd/mu-init (maildir)
"Initialize the mu database using available contexts."
(->> mu4e-contexts
(--map (->> (mu4e-context-vars it)
(alist-get 'user-mail-address)
(format "--my-address=%s")))
(s-join " ")
(format "mu init --maildir %s %s" maildir)
(shell-command-to-string)))
;; display mu4e in same window
(add-to-list 'display-buffer-alist
`(,(regexp-quote mu4e-main-buffer-name)
display-buffer-same-window))
(defun nd/mu4e-junk-folder (msg)
"Hacky function to return junk folder from context.
(setq mail-user-agent 'mu4e-user-agent
message-kill-buffer-on-exit t
Must be bound to symbol `nd/mu4e-junk-folder`."
(->> (mu4e-context-determine msg nil)
(mu4e-context-vars)
(alist-get 'nd/mu4e-junk-folder)))
;; misc
mu4e-change-filenames-when-moving t
mu4e-confirm-quit nil
mu4e-compose-dont-reply-to-self t
mu4e-get-mail-command "mbsync -a && mu-index-emacs-maybe"
mu4e-use-fancy-chars t
(defun nd/mu4e-headers-mark-for-junk ()
"Function to mark messages as junk."
(interactive)
(mu4e-headers-mark-and-next 'junk))
;; sub some fancy chars that don't have valid codes
mu4e-headers-trashed-mark '("T" . "Ω")
mu4e-headers-unread-mark '("U" . "✉")
mu4e-headers-personal-mark '("P" . "Ρ")
mu4e-headers-list-mark '("L" . "Λ")
mu4e-headers-attach-mark '("a" . "ɑ")
mu4e-headers-thread-root-prefix '("* " . "● ")
mu4e-headers-threaded-label '("T" . "Ψ")
mu4e-headers-related-label '("R" . "↔")
(defun nd/make-mu4e-context (name dir addr smtp-srv smtp-tls sent-behavior)
(-let* ((trash (format "/%s/trash" dir))
(drafts (format "/%s/drafts" dir))
(sent (format "/%s/sent" dir))
(archive (format "/%s/archive" dir))
(inbox (format "/%s/inbox" dir))
(junk (format "/%s/junk" dir))
(shortcuts (--map (list :maildir (car it) :key (cdr it))
`((,trash . ?t)
(,drafts . ?d)
(,sent . ?s)
(,archive . ?a)
(,inbox . ?i)
(,junk . ?j))))
;; either use TLS or no authentication for outgoing
((smtp-proto smtp-port) (if smtp-tls
'(starttls 587)
'(nil 25)))
(mf (lambda (d msg)
(-some--> msg
(mu4e-message-field it :maildir)
(string-prefix-p (concat "/" d) it)))))
(make-mu4e-context
:name name
:match-func (-partial mf dir) ; use lexical scope here
:vars `((mu4e-trash-folder . ,trash)
(mu4e-drafts-folder . ,drafts)
(mu4e-sent-folder . ,sent)
(mu4e-refile-folder . ,archive)
(nd/mu4e-junk-folder . ,junk)
(mu4e-sent-messages-behavior . ,sent-behavior)
(smtpmail-stream-type . ,smtp-proto)
(smtpmail-smtp-server . ,smtp-srv)
(smtpmail-smtp-service . ,smtp-port)
(smtpmail-smtp-user . ,addr)
(user-mail-address . ,addr)
(mu4e-maildir-shortcuts . ,shortcuts)))))
;; directories
mu4e-attachment-dir "~/Downloads"
;; headers
mu4e-headers-show-target nil
mu4e-headers-fields '((:human-date . 11)
(:flags . 5)
(:from . 22)
(:thread-subject))
mu4e-headers-date-format "%F"
mu4e-headers-time-format "%R"
;; display mu4e in same window
(add-to-list 'display-buffer-alist
`(,(regexp-quote mu4e-main-buffer-name)
display-buffer-same-window))
;; view
mu4e-view-show-images t
mu4e-view-show-addresses t
mu4e-view-prefer-html t
;; special mark for junk (which is different from trash)
;; trash = delete later
;; junk = spam, which I don't want to delete so I can train spam filters
;;
;; NOTE weird cross symbol picked because it looks like a certain digit
(add-to-list
'mu4e-marks
'(junk :char ("j" . "┻")
:prompt "junk"
:dyn-target
(lambda (target msg) (nd/mu4e-junk-folder msg))
:action
(lambda
(docid msg target)
(mu4e--server-move docid
(mu4e--mark-check-target target)
"-N"))))
;; compose
mu4e-compose-signature-auto-include nil ;; sigs are annoying by default
mu4e-compose-signature "Thank you,\nNathan Dwarshuis"
;; buttload of common settings I like
(setq mail-user-agent 'mu4e-user-agent
message-kill-buffer-on-exit t
;; aliases
mail-personal-alias-file (no-littering-expand-etc-file-name
"mailrc")
;; misc
mu4e-change-filenames-when-moving t
mu4e-confirm-quit nil
mu4e-compose-dont-reply-to-self t
mu4e-get-mail-command "mbsync -a && mu-index-emacs-maybe"
mu4e-use-fancy-chars t
;; yanking (aka citing)
message-yank-prefix "" ;; the ">" characters are annoying
message-yank-cited-prefix ""
message-yank-empty-prefix ""
;; sub some fancy chars that don't have valid codes
mu4e-headers-trashed-mark '("T" . "Ω")
mu4e-headers-unread-mark '("U" . "✉")
mu4e-headers-personal-mark '("P" . "Ρ")
mu4e-headers-list-mark '("L" . "Λ")
mu4e-headers-attach-mark '("a" . "ɑ")
mu4e-headers-thread-root-prefix '("* " . "● ")
mu4e-headers-threaded-label '("T" . "Ψ")
mu4e-headers-related-label '("R" . "↔")
;; contexts (multiple inboxes)
mu4e-context-policy 'pick-first
mu4e-compose-context-policy 'ask-if-none
mu4e-contexts
(list
(nd/make-mu4e-context "personal"
"yavin4"
"ndwar@yavin4.ch"
"peart4prez.yavin4.ch"
'sent)
(nd/make-mu4e-context "alpha"
"gmail"
"natedwarshuis@gmail.com"
"smtp.gmail.com"
'delete)))
;; enable visual line mode and spell checking
(add-hook 'mu4e-compose-mode-hook 'turn-off-auto-fill)
(add-hook 'mu4e-compose-mode-hook 'visual-line-mode)
(add-hook 'mu4e-view-mode-hook 'turn-off-auto-fill)
(add-hook 'mu4e-view-mode-hook 'visual-line-mode)
(add-hook 'mu4e-compose-mode-hook (lambda () (flyspell-mode 1)))
;; Outlook doesn't know how to fold mu4e messages by default
;; This is enabled by using 32 underscores followed by the addressing
;; info of the previou message(s).
(require 'nnheader) ; necessary for the header macros below
;; directories
mu4e-attachment-dir "~/Downloads"
;; headers
mu4e-headers-show-target nil
mu4e-headers-fields '((:human-date . 11)
(:flags . 5)
(:from . 22)
(:thread-subject))
mu4e-headers-date-format "%F"
mu4e-headers-time-format "%R"
(defun nd/message-insert-citation-header ()
"Insert the header of the reply message."
(let* ((h message-reply-headers)
(sep "________________________________")
(from (concat "From: " (mail-header-from h)))
(date (concat "Sent: " (mail-header-date h)))
(to (concat "To: " user-full-name))
(subj (concat "Subject: " (message-strip-subject-re (mail-header-subject h)))))
(insert (string-join `("" ,sep ,from ,date ,to ,subj "") "\n"))))
(setq message-citation-line-function 'nd/message-insert-citation-header)
;; view
mu4e-view-show-images t
mu4e-view-show-addresses t
mu4e-view-prefer-html t
;; prevent html to text conversion from destroying links
(setq
mu4e-compose-pre-hook
(lambda ()
(let* ((msg mu4e-compose-parent-message)
(html (and msg (plist-get msg :body-html)))
;; oops, mu4e screwed up
(mu4e-html2text-command
(nd/if-bin "pandoc"
"pandoc -f html -t plain --reference-links"
'mu4e-shr2text)))
(when (and html mu4e-view-prefer-html (member mu4e-compose-type '(reply forward)))
;; hackity hack, since the normal mu4e-message-body-text function
;; does not render the desired html, do it here and force the
;; aforementioned function to only look at text by removing
;; the html
(plist-put msg :body-txt (mu4e~html2text-shell msg mu4e-html2text-command))
(plist-put msg :body-html nil)))))
;; compose
message-signature nil
(require 'smtpmail)
;; (require 'smtpmail-async)
(setq send-mail-function 'smtpmail-send-it
smtpmail-debug-info nil
auth-source-debug nil
message-send-mail-function 'smtpmail-send-it)
(setq auth-sources '(password-store))
;; aliases
mail-personal-alias-file (no-littering-expand-etc-file-name
"mailrc")
(defun nd/mu-init ()
"Initialize the mu database"
(->> mu4e-contexts
(--map (->> (mu4e-context-vars it)
(alist-get 'user-mail-address)
(format "--my-address=%s")))
(s-join " ")
(format "mu init --maildir /mnt/data/Mail %s")
(shell-command-to-string)))
;; yanking (aka citing)
message-yank-prefix "" ;; the ">" characters are annoying
message-yank-cited-prefix ""
message-yank-empty-prefix ""
(defun nd/lookup-oauth-secret (type user)
(->> (format "pass email/%s/%s" user type)
(shell-command-to-string)
(s-trim)))
;; contexts (multiple inboxes)
mu4e-context-policy 'pick-first
mu4e-compose-context-policy 'ask-if-none)
(defun nd/xoauth2-get-secrets (host user port)
(when (and (string= host "smtp.gmail.com")
(string= user "natedwarshuis@gmail.com")
(string= port "587"))
(list :token-url (nd/lookup-oauth-secret "token_url" user)
:client-id (nd/lookup-oauth-secret "client_id" user)
:client-secret (nd/lookup-oauth-secret "client_secret" user)
:refresh-token (nd/lookup-oauth-secret "refresh_token" user))))
;; enable visual line mode and spell checking
(add-hook 'mu4e-compose-mode-hook 'turn-off-auto-fill)
(add-hook 'mu4e-compose-mode-hook 'visual-line-mode)
(add-hook 'mu4e-view-mode-hook 'turn-off-auto-fill)
(add-hook 'mu4e-view-mode-hook 'visual-line-mode)
(add-hook 'mu4e-compose-mode-hook (lambda () (flyspell-mode 1)))
(use-package auth-source-xoauth2
:straight t
:after smtpmail
:config
(setq auth-source-xoauth2-creds #'nd/xoauth2-get-secrets)
(add-to-list 'smtpmail-auth-supported 'xoauth2)
(auth-source-xoauth2-enable)))
;; Outlook doesn't know how to fold mu4e messages by default
;; This is enabled by using 32 underscores followed by the addressing
;; info of the previou message(s).
(require 'nnheader) ; necessary for the header macros below
(defun nd/message-insert-citation-header ()
"Insert the header of the reply message."
(let* ((h message-reply-headers)
(sep "________________________________")
(from (concat "From: " (mail-header-from h)))
(date (concat "Sent: " (mail-header-date h)))
(to (concat "To: " user-full-name))
(subj (concat "Subject: " (message-strip-subject-re (mail-header-subject h)))))
(insert (string-join `("" ,sep ,from ,date ,to ,subj "") "\n"))))
(setq message-citation-line-function 'nd/message-insert-citation-header)
;; prevent html to text conversion from destroying links
(setq
mu4e-compose-pre-hook
(lambda ()
(let* ((msg mu4e-compose-parent-message)
(html (and msg (plist-get msg :body-html)))
;; oops, mu4e screwed up
(mu4e-html2text-command
(nd/if-bin "pandoc"
"pandoc -f html -t plain --reference-links"
'mu4e-shr2text)))
(when (and html mu4e-view-prefer-html (member mu4e-compose-type '(reply forward)))
;; hackity hack, since the normal mu4e-message-body-text function
;; does not render the desired html, do it here and force the
;; aforementioned function to only look at text by removing
;; the html
(plist-put msg :body-txt (mu4e~html2text-shell msg mu4e-html2text-command))
(plist-put msg :body-html nil)))))
(setq send-mail-function 'smtpmail-send-it
smtpmail-debug-info nil
auth-source-debug nil
message-send-mail-function 'smtpmail-send-it)
;; load instance-specific accounts
(load-file acnts-path))))
#+END_SRC
** shell
#+begin_src emacs-lisp
@ -4010,7 +4129,10 @@ Since I use vi mode in my terminal emulator, need to preserve the escape key's r
;; the old open attachment function broke in mu 1.6, fix it here
(nd/when-bin "mu"
(evil-define-key '(normal) mu4e-view-mode-map
"p" 'mu4e-view-mime-part-action))
"p" #'mu4e-view-mime-part-action)
(evil-define-key '(normal) mu4e-headers-mode-map
"." #'nd/mu4e-headers-mark-for-junk))
#+end_src
** local
These are for mode-specific bindings that can/should be outside of the evil maps above (there are not many, and these may be merged with their evil bretheren in the future).
@ -4020,10 +4142,10 @@ These are for mode-specific bindings that can/should be outside of the evil maps
(add-hook 'org-mode-hook
(lambda ()
;; use the hyper keys/vim arrows with the shifters instead of shift/arrows
(local-set-key (kbd "H-k") 'org-shiftup)
(local-set-key (kbd "H-l") 'org-shiftright)
(local-set-key (kbd "H-j") 'org-shiftdown)
(local-set-key (kbd "H-h") 'org-shiftleft)
(local-set-key (kbd "H-<up>") 'org-shiftup)
(local-set-key (kbd "H-<right>") 'org-shiftright)
(local-set-key (kbd "H-<down>") 'org-shiftdown)
(local-set-key (kbd "H-<left>") 'org-shiftleft)
;; storing links is important, make a shortcut
(local-set-key (kbd "C-c l") 'org-store-link)
@ -4227,8 +4349,8 @@ The only thing I like about elpy is the interactive shell
*** pyenv
This key collides with plenty of other stuff, notably scheduling in org mode
#+BEGIN_SRC emacs-lisp
(nd/when-bin "pyenv"
(define-key pyenv-mode-map (kbd "C-c C-s") nil))
;;(nd/when-bin "pyenv"
;; (define-key pyenv-mode-map (kbd "C-c C-s") nil))
#+END_SRC
*** counsel
#+begin_src emacs-lisp

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 14 KiB

1
local/lib/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
mu4e

View File

@ -4399,23 +4399,30 @@ FUTURE-LIMIT in a list."
(either :right it)))))
;; child id functions
(remove-done
(ids)
(--remove (member (org-x-dag-id->todo it) org-done-keywords) ids))
(action-qtp-getter
()
(->> (org-x-dag->action-ids)
;; TODO could also remove DONE/CANC and things
;; underneath these
(--remove (org-x-dag-id->ns-key :survivalp it))
(remove-done)
(append (org-x-dag->current-qtp-ids))))
(svg-action-getter
()
(->> (org-x-dag->action-ids)
;; TODO could also remove DONE/CANC and things
;; underneath these
(remove-done)
(--remove (and (org-x-dag-id->ns-key :committed it)
(not (org-x-dag-id->ns-key :survivalp it))))))
(epg-action-qtp-getter
()
`(,@(org-x-dag->epg-ids) ,@(action-qtp-getter)))
(->> `(,@(org-x-dag->epg-ids) ,@(action-qtp-getter))
(remove-done)))
;; format functions
(dlp-formatter
@ -4553,16 +4560,27 @@ FUTURE-LIMIT in a list."
(either :right))
(parse-hl)))
(remove-done
(ids)
(--remove (member (org-x-dag-id->todo it) org-done-keywords) ids))
;; parent id getters
(tlg-getter
()
(append (org-x-dag->epg-ids) (org-x-dag->ltg-ids)))
(->> (append (org-x-dag->epg-ids) (org-x-dag->ltg-ids))
(remove-done)))
(goal-getter
()
(append (org-x-dag->svg-ids) (tlg-getter)))
(->> (append (org-x-dag->svg-ids) (tlg-getter))
(remove-done)))
(dlp-getter
()
(append (org-x-dag->current-wkp-ids) (org-x-dag->action-ids)))
(->> (append (org-x-dag->current-wkp-ids) (org-x-dag->action-ids))
(remove-done)))
(weekly-getter
()
(->> (org-x-dag->current-qtp-ids)
(remove-done)))
;; formatters
(goal-formatter
@ -4572,7 +4590,7 @@ FUTURE-LIMIT in a list."
(org-x-dag-id->path nil id)))))
(org-x-dag-sync)
(let ((f (buffer-file-name)))
(let ((f (f-canonical (buffer-file-name))))
(cond
((equal f (org-x-dag->goal-file :endpoint))
(org-x-dag--link-child-to-parent
@ -4592,7 +4610,7 @@ FUTURE-LIMIT in a list."
((equal f (org-x-dag->planning-file :weekly))
(org-x-dag--link-child-to-parent
#'parse-hl
#'org-x-dag->current-qtp-ids
#'weekly-getter
#'org-x-dag-id->title))
((equal f (org-x-dag->planning-file :daily))
(org-x-dag--link-child-to-parent

View File

@ -1,145 +1,138 @@
(("ESS" . "5c4ae91cefa5c56fd13b204a9a996825af836a67")
(("ESS" . "e4f2afb90d11613c4c2a28720dcda226699b4dfb")
("Highlight-Indentation-for-Emacs" . "d88db4248882da2d4316e76ed673b4ac1fa99ce3")
("ace-window" . "77115afc1b0b9f633084cf7479c767988106c196")
("anaconda-mode" . "1fd13a0f20fcc9e841e2d5c9af73c0b23f09cf39")
("annalist.el" . "134fa3f0fb91a636a1c005c483516d4b64905a6d")
("auctex" . "f60d3b907618c2cbb527e59e29821465d6750993")
("anaconda-mode" . "79fa9b4d2bda9f69857aeffb30c75276848a2810")
("annalist.el" . "e1ef5dad75fa502d761f70d9ddf1aeb1c423f41d")
("auctex" . "5b1229745b4d862e07e28fc597d92457688926f2")
("auth-source-xoauth2" . "5d1adfa649bb5a9df20a2fa89f235a55a64b52e4")
("avy" . "be612110cb116a38b8603df367942e2bb3d9bdbe")
("bats-mode" . "fa88930b1baba101ae6474f289a239a236a7d19f")
("beacon" . "85261a928ae0ec3b41e639f05291ffd6bf7c231c")
("biblio.el" . "ee52f6cda82ea6fbc3b400e7b12132595cc0374c")
("blacken" . "1e80b970b130d5c33031f2539c89eb2f13da2572")
("blacken" . "0719cd6b301806c64ec79be9eebe954941e65277")
("c-eldoc" . "f4ede1f37f6de583376669735326367d84a0a917")
("cider" . "5d91ffcc75069efe9c513af285627a4e38685bb1")
("citeproc-el" . "290320fc579f886255f00d7268600df7fa5cc7e8")
("clang-format" . "e48ff8ae18dc7ab6118c1f6752deb48cb1fc83ac")
("clojure-mode" . "906d6a47a646d1191eaead6f8e1ae0810aa9b626")
("company-anaconda" . "da1566db41a68809ef7f91ebf2de28118067c89b")
("citeproc-el" . "fed285385c1a8c0248890cd591f64a0e2598334d")
("clang-format" . "9f4358fcc8b04018cc1ed46fcc96fc7bfa361a47")
("company-anaconda" . "1fe526163c265891cc20d971dc58b661ad8bcf23")
("company-auctex" . "9400a2ec7459dde8cbf1a5d50dfee4e300ed7e18")
("company-c-headers" . "9d384571b1190e99d0a789e5296176d69a3d0771")
("company-irony" . "b44711dfce445610c1ffaec4951c6ff3882b216a")
("company-math" . "3eb006874e309ff4076d947fcbd61bb6806aa508")
("company-mode" . "8a78f320019574bc35b5727f95b052b27918da20")
("compat" . "e07c0f29d45a73cc0bdf9423780979978c1d9d22")
("conda.el" . "f3ea3876eecd00a1fca16fd7fd68e56e3beac87c")
("csv-mode" . "d190a479b4f36806b604da527e5d5a50909d3ceb")
("dash.el" . "d5182da04ca54c026ea0bf381f2c1642a30e2686")
("delight" . "70cb8cec9e5eb2c24364e065d85c2ea8f14a587c")
("company-mode" . "6c7731d4ec1e43199ea328e1691999b4fe8967a8")
("compat" . "25da9d232399203a38722aa6638b7fe8ecab3f60")
("conda.el" . "60e14d1e9793431b91913a5688e278bd91d56224")
("csv-mode" . "cdb73a771b0b9fa3cbae66dde5b934be6550a8b1")
("dash.el" . "1de9dcb83eacfb162b6d9a118a4770b1281bcd84")
("delight" . "b59977bb957a5a79eb8aa0028d8e6e8ed6a7a6e1")
("dhall-mode" . "87ab69fe765d87b3bb1604a306a8c44d6887681d")
("dired-du" . "e5a2aa64849aae14fd6d1973919ec7e13ed76dd0")
("dired-hacks" . "523f51b4152a3bf4e60fe57f512732c698b5c96f")
("dockerfile-mode" . "52c6c00da1d31c0b6c29c74335b3af63ed6bf06c")
("ebib" . "5a03e4662dccbffe63605bb8e88bfb691ebe0afa")
("el-get" . "cd998078949db70b736c0c3ac77ec23d97686f9a")
("elpy" . "840713f23af99b83d04034c3703f7e73c3baa7dc")
("emacs-async" . "3ae74c0a4ba223ba373e0cb636c385e08d8838be")
("emacs-buttercup" . "30c703d215b075aaede936a2c424f65b5f7b6391")
("dired-du" . "0fc6119ddd3144453158ac107a8b107d82652c36")
("dired-hacks" . "a01c126c3b1068655509487c76971895f5459d09")
("dockerfile-mode" . "39a012a27fcf6fb629c447d13b6974baf906714c")
("ebib" . "2f2d39d1953fa10d7c3dad6a4611d8ec0d489aba")
("el-get" . "f220df34333fdb363b84b28f4ed4a5575341bf45")
("elpy" . "777e9909c8f1c11f1cfb8dbf5fe4a66d2ab95e1e")
("emacs-async" . "72b70b004505db2f06318fefd6b358704b9167d7")
("emacs-buttercup" . "a1a86b027ffe030e1c78a9f43c50cd20a6fed19a")
("emacs-calfw" . "03abce97620a4a7f7ec5f911e669da9031ab9088")
("emacs-dashboard" . "34a0076f01a729b4aae16947fa0d0e130cafedfd")
("emacs-format-all-the-code" . "2e02fc6d487c9e7eb482f09b5b2bfbd0f9f11d24")
("emacs-htmlize" . "dd27bc3f26efd728f2b1f01f9e4ac4f61f2ffbf9")
("emacs-language-id" . "06f960f733e5958c4fe0e52db666ce6f6710f508")
("emacs-dashboard" . "3852301f9c6f3104d9cc98389612b5ef3452a7de")
("emacs-format-all-the-code" . "f8feea08fef7ed542b8e676e90445d57ebd2c458")
("emacs-htmlize" . "ed5e5b05fd260e8f161a488d56f10e7f6e01fb75")
("emacs-language-id" . "435114f208b97e97aa1576ef1966a33d90cad01b")
("emacs-refactor" . "cac1b52932926f56d7f6d2923732d20bbd20670d")
("emacs-reformatter" . "1cbf7225b0f934a32bec98ca1f78e8dee77aef94")
("emacs-web-server" . "22ce66ea43e0eadb9ec1d691a35d9695fc29cee6")
("emacs-which-key" . "ee6f0637f75ded903653b7a300a8588e3a8427f7")
("emacsmirror-mirror" . "3f68f75157c5d2d5eb1843b287ee82f14ef07642")
("epl" . "78ab7a85c08222cd15582a298a364774e3282ce6")
("evil" . "1d37abaa9e9da89c6e9461804595e338b5ef3585")
("emacs-reformatter" . "0d29a04d69d47599e2cb7f1a8f8e897a2b592921")
("emacs-request" . "01e338c335c07e4407239619e57361944a82cb8a")
("emacs-web-server" . "3982c55e9061475038a3ccd61aecb2de3d407cec")
("emacs-which-key" . "1e89fa000e9ba9549f15ef57abccd118d5f2fe1a")
("emacsmirror-mirror" . "55c75c9ec26d9167a7815f20056f6ce0170f88cf")
("evil" . "3ba76c1c1f6e8f0389d7bebbd220eefaca796da4")
("evil-ReplaceWithRegister" . "91cc7bf21a94703c441cc9212214075b226b7f67")
("evil-collection" . "4a7d924dbd851ef1b2ccb85778be6e7a6a81ebd4")
("evil-collection" . "acb056b1d0d3aad2f32b1ca9c019a9a2e976f03e")
("evil-commentary" . "c5945f28ce47644c828aac1f5f6ec335478d17fb")
("evil-org-mode" . "b1f309726b1326e1a103742524ec331789f2bf94")
("evil-surround" . "f273821f575ace519066fb106ee45a5b8577475f")
("f.el" . "af7d37c619010b576fd22b50c62c71ff33093f3c")
("evil-surround" . "da05c60b0621cf33161bb4335153f75ff5c29d91")
("f.el" . "1e7020dc0d4c52d3da9bd610d431cab13aa02d8c")
("fill-column-indicator" . "c35f9de072c241699b57bcb46da84bed5af29cfe")
("flycheck" . "5f2ef177cb21ae8b73714575802beef04abd0f5e")
("flycheck" . "10430dee428f7bab176743097d996182fac29daa")
("flycheck-clang-analyzer" . "646d9f3a80046ab231a07526778695d5decad92d")
("flycheck-haskell" . "50425a8b96fea84ea15940a4a07b184e43bb8e7a")
("flycheck-package" . "3a6aaed29ff61418c48c0251e1432c30748ae739")
("flyspell-correct" . "7d7b6b01188bd28e20a13736ac9f36c3367bd16e")
("gnu-elpa-mirror" . "52eecca7b2812cb652d29952f594b450f81988cb")
("goto-chg" . "278cd3e6d5107693aa2bb33189ca503f22f227d0")
("flycheck-haskell" . "b7c4861aa754220b7d0cfc05aa0895bb35665683")
("flycheck-package" . "75efa098cf17dc14c363e2ca9b68afdac7766b5b")
("flyspell-correct" . "1e7a5a56362dd875dddf848b9a9e25d1395b9d37")
("gnu-elpa-mirror" . "5338f22d8cee40109a2616007b40b558e53eb0ae")
("goto-chg" . "72f556524b88e9d30dc7fc5b0dc32078c166fda7")
("graphviz-dot-mode" . "8ff793b13707cb511875f56e167ff7f980a31136")
("haskell-mode" . "41c0cf61591279a22ac511f925c041c40969bdb8")
("helm-bibtex" . "a7aeb940bd5d3510a7046ee9f2922f5a19bd3b44")
("ht.el" . "3c1677f1bf2ded2ab07edffb7d17def5d2b5b6f6")
("haskell-mode" . "727f72a2a4b8e4fd0a7b62129668baea55a2c3e0")
("helm-bibtex" . "8b71b4f5ce62eeaf18067f57faaddc06449fbe1c")
("ht.el" . "1c49aad1c820c86f7ee35bf9fff8429502f60fef")
("hydra" . "317e1de33086637579a7aeb60f77ed0405bf359b")
("iedit" . "27c61866b1b9b8d77629ac702e5f48e67dfe0d3b")
("impatient-mode" . "a4e4e12852840996b027cb8e9fb2b809c37a0ee3")
("inf-ruby" . "5a8b87fe6873bc684552cd993e375c382d729753")
("inheritenv" . "2102ed2d105a5c9f366cb6503d04794600985598")
("irony-mode" . "870d1576fb279bb93f776a71e65f45283c423a9e")
("inf-ruby" . "0cfe8b2fb1ab222ed423a8e6f339d398fa32966f")
("inheritenv" . "bac62ca6324828623cf8ce5a3d6aee0fcb65d620")
("irony-mode" . "40e0ce19eb850bdf1f77225f11713cc816250d95")
("jinja2-mode" . "03e5430a7efe1d163a16beaf3c82c5fd2c2caee1")
("js-comint" . "b788bf5d57ad6b902c4096b666c6d78ceff7c116")
("json-mode" . "eedb4560034f795a7950fa07016bd4347c368873")
("js-comint" . "ef2ccccad5740f3d8b5295f52a35df4f62471480")
("json-mode" . "77125b01c0ddce537085201098bea9b4b8ba6be3")
("json-snatcher" . "b28d1c0670636da6db508d03872d96ffddbc10f2")
("let-alist" . "021fc10df2e44faba4728d849ee767cf890aa51a")
("let-alist" . "6e9f470e78cf50afa0e53a61da191d68d87a0104")
("lispy" . "fe44efd21573868638ca86fc8313241148fabbe3")
("list-utils" . "f02dcef36330871855346f9eab97eef58d323d9a")
("lua-mode" . "ad639c62e38a110d8d822c4f914af3e20b40ccc4")
("lua-mode" . "d074e4134b1beae9ed4c9b512af741ca0d852ba3")
("magit" . "b908c79b44f5c282eec44f19fc1d9967f041dd5c")
("map" . "a0e501aede34f183a8baa5d3d41610a3ffa1728e")
("markdown-mode" . "f3ee31ffc28b3d8e86da2208c87eac75fd6e6eae")
("markdown-mode" . "0cdebc833ed9b98baf9f260ed12b1e36b0ca0e89")
("math-symbol-lists" . "ac3eb053d3b576fcdd192b0ac6ad5090ea3a7079")
("melpa" . "07aee214c4db85ca2b0ad8b8c55cf99345b84a7a")
("melpa" . "1b06cc08de41e82f3f148aa9e35663e2e06427ae")
("nix-mode" . "719feb7868fb567ecfe5578f6119892c771ac5e5")
("no-littering" . "8b07314d2f0594ff22bf798d9a5f5bf44b4dd4cd")
("nongnu-elpa" . "4456edc151f4147d763d0067a8da5922e6f60d25")
("org" . "943197829b5610e84c99de69c86c73ab9b760913")
("org-bullets" . "767f55feb58b840a5a04eabfc3fbbf0d257c4792")
("org-ml" . "f57336a9126a168ad32ccce017c072474555395a")
("org-ref" . "26c06912c7833104c7b4c7b96b8f200e98067a68")
("org-ref" . "4029a37e3ba36fb812cdf228e4b21db06ade2b6d")
("org-sql" . "43376abf46b897a9a862cfcc1c087f4b8688634c")
("org-super-agenda" . "f4f528985397c833c870967884b013cf91a1da4a")
("org-super-agenda" . "51c9da5ce7b791150758984bab469d2222516844")
("origami.el" . "e558710a975e8511b9386edc81cd6bdd0a5bda74")
("outline-magic" . "2a5f07417b696cf7541d435c43bafcc64817636b")
("ox-pandoc" . "66c32cca4f6047dd7e0f77f10bd565a2d83d4729")
("package-lint" . "933cb1ef5938c5f99f8d388027bc0e8518fdada9")
("ox-pandoc" . "399d787b6e2124bd782615338b845c3724a47718")
("package-lint" . "972dd8403ac8d2d43f298ef89a6b118e49c7355f")
("paredit" . "9a2c4b37fc8c1c7bdbb1f86fdec874c0d0652e64")
("parsebib" . "ace9df707108b17759c004c7387655277122d4c1")
("parseclj" . "1ce54fa2eb7a5d99d34c07d271e18eaabd0489da")
("parseedn" . "a67204eeaa32ca8f11f6aeecc2a88349f196add6")
("password-store" . "28cec11f1dbe6c4273d30370af45b69c9f408386")
("pcre2el" . "b941ed8a96299868171fac625ecffec77de3e986")
("pdf-tools" . "c69e7656a4678fe25afbd29f3503dd19ee7f9896")
("php-mode" . "73d2dedb81cb210d8ba79d60af7918d52cc37bf7")
("pkg-info" . "76ba7415480687d05a4353b27fea2ae02b8d9d61")
("pkgbuild-mode" . "9525be8ecbd3a0d0bc7cc27e6d0f403e111aa067")
("password-store" . "b5e965a838bb68c1227caa2cdd874ba496f10149")
("pcre2el" . "380723b2701cceb75c266440fb8db918f3340d50")
("pdf-tools" . "30b50544e55b8dbf683c2d932d5c33ac73323a16")
("php-mode" . "c8e4c16ca0d234f4a659713a94467f0c32ef4bc8")
("pkgbuild-mode" . "8ef396d8fa9187b65c065a6bc2ca15dfaf3255df")
("poly-R" . "8024e852cfca642dea2045a41b2033baa2f1f9a5")
("poly-markdown" . "98695eb7ca4ca11dcec71a1cab64903bbf79b4d3")
("poly-noweb" . "3b0cd36ca9a707e8a09337a3468fa85d81fc461c")
("polymode" . "ca060e081a1f849a880732670dc15370ac987b89")
("popup-el" . "69efb517f3b8ba8ed82dfb4e39b74b325bc98a59")
("popup-el" . "545e258024f6e4a8b2a066a5442d9e0147a7ee03")
("powerline" . "c35c35bdf5ce2d992882c1f06f0f078058870d4a")
("projectile" . "31b87151b1fe43221736ded957a1123a54e32531")
("pyenv-mode" . "b818901b8eac0e260ced66a6a5acabdbf6f5ba99")
("pythonic" . "c18a5bd8cb2ba59014b6b29b5bf1903bd2476a07")
("projectile" . "0163b335a18af0f077a474d4dc6b36e22b5e3274")
("pythonic" . "00f8cafe02bdac0f3e562ffe6881ce654c8eb588")
("pyvenv" . "31ea715f2164dd611e7fc77b26390ef3ca93509b")
("queue" . "130c2d656cd5d7376552272fab9e50a7c37d0c4a")
("rainbow-delimiters" . "a32b39bdfe6c61c322c37226d66e1b6d4f107ed0")
("rainbow-mode" . "8e96388fb4d616a9dde23e712bad0d9cd048fbf0")
("robe" . "912ae2ba1f467bd55b2da64bfec9db3f8a723916")
("queue" . "df8a1a2ad77d57c25e7005f0add275c13f9db20f")
("rainbow-delimiters" . "f40ece58df8b2f0fb6c8576b527755a552a5e763")
("rainbow-mode" . "0740f31f300982534183a2f60b1918de418a6f2c")
("robe" . "6bc8a07fc483407971de0966d367a11006b3ab80")
("ruby-test-mode" . "d66db4aca6e6a246f65f7195ecfbc7581d35fb7a")
("rvm.el" . "e1e83b5466c132c066142ac63729ba833c530c83")
("s.el" . "dda84d38fffdaf0c9b12837b504b402af910d01d")
("sesman" . "e0f555f963c9f02f8e4a50e06fc353eb4c15ee77")
("snakemake-mode" . "0c4c5b6a25735ac025ce124ace9f0259eb5198e9")
("spaceline" . "e0f848cc116d9046a04a09f5728fabf892863b7e")
("seq" . "d6b97ea450817ecef174d9c65d59b69bc5721a35")
("snakemake-mode" . "4ad41da69e4b95b38a3d3273874c44caab20cc56")
("spaceline" . "086420d16e526c79b67fc1edec4c2ae1e699f372")
("spacemacs-theme" . "319ad1cd6aa05dcb43e4edca50eca339892e0865")
("spinner" . "634529bb3173e09b37499f636de70abf29d9fa8a")
("straight.el" . "039e5c9a9b5c00749602afb41341e9e77ba09429")
("straight.el" . "b3760f5829dba37e855add7323304561eb57a3d4")
("string-inflection" . "50ad54970b3cc79b6b83979bde9889ad9a9e1a9c")
("sudo-edit" . "74eb1e6986461baed9a9269566ff838530b4379b")
("swiper" . "d28225e86f8dfb3825809ad287f759f95ee9e479")
("systemd-mode" . "8742607120fbc440821acbc351fda1e8e68a8806")
("tablist" . "5f7b71a92bfb25418d7da86ad9c45f14b149496f")
("toc-org" . "bf2e4b358efbd860ecafe6e74776de0885d9d100")
("swiper" . "2a25a6fb5b081cb141c5eccac8ee58ab1feeb747")
("tablist" . "fcd37147121fabdf003a70279cf86fbe08cfac6f")
("toc-org" . "6d3ae0fc47ce79b1ea06cabe21a3c596395409cd")
("transient" . "239be53b01e003c5206087d850d9672a42dc4b32")
("ts.el" . "552936017cfdec89f7fc20c254ae6b37c3f22c5b")
("use-package" . "a6e856418d2ebd053b34e0ab2fda328abeba731c")
("with-editor" . "84ba06ed513e97223630905f4788370e18116f40")
("yaml-mode" . "b153150e0e77b4ec462d741cdb16956c6ae270d6")
("yasnippet" . "5cbdbf0d2015540c59ed8ee0fcf4788effdf75b6")
("xterm-color" . "2ad407c651e90fff2ea85d17bf074cee2c022912")
("yaml-mode" . "7b5ce294fb15c2c8926fa476d7218aa415550a2a")
("yasnippet" . "eb5ba2664c3a68ae4a53bb38b85418dd131b208f")
("zoutline" . "32857c6c4b9b0bcbed14d825a10b91a98d5fed0a"))
:gamma