Compare commits

...

11 Commits

8 changed files with 132 additions and 118 deletions

View File

@ -1784,11 +1784,11 @@ Save all org buffers 1 minute before the hour, then commit whatever I saved.
*** stateless configuration
=org-ml= provides stateless functions for operating on org buffers.
#+BEGIN_SRC emacs-lisp
(use-package org-ml
:straight t
:config
;; make the match functions super fast with memoization
(setq org-ml-memoize-match-patterns t))
;; (use-package org-ml
;; :straight t
;; :config
;; ;; make the match functions super fast with memoization
;; (setq org-ml-memoize-match-patterns t))
#+END_SRC
*** personal library
@ -1804,9 +1804,11 @@ The advantage of doing it this way is that I can byte-compile and test independe
(nd/load-and-compile (nd/expand-lib-directory "interval"))
(nd/load-and-compile (nd/expand-lib-directory "dag"))
(nd/load-and-compile (nd/expand-lib-directory "org-x"))
(nd/load-and-compile (nd/expand-local-pkg-directory "org-ml"))
(require 'dag)
(require 'org-x)
(require 'org-ml)
#+end_src
** buffer interface
*** folding

View File

@ -10,7 +10,13 @@
;; ensure we use built-in org mode
;; (use-package org :straight org-plus-contrib)
(straight-use-package '(org :type built-in))
;; (straight-use-package '(org :type built-in))
(straight-use-package
'(org :type git
:repo "git://git.savannah.gnu.org/emacs/org-mode.git"
:branch "release_9.7.9"))
;;(load-file "~/.config/emacs/straight/repos/org/lisp/org-element-ast.el")
;;(load-file "~/.config/emacs/straight/repos/org/lisp/org-element.el")
;; load everything else
(org-babel-load-file nd/conf-main)

View File

@ -77,7 +77,7 @@ Returns a new timespan."
(when timestamp
(let ((offset (org-element-property :begin headline))
(start-time (org-ml-timestamp-get-start-time timestamp))
(range (org-ml-timestamp-get-range timestamp)))
(range (org-ml-timestamp-get-length timestamp)))
(org-x-agg--make-timespan start-time range offset filepath))))
(defun org-x-agg--effort-to-seconds (effort-str)
@ -178,7 +178,7 @@ time of the :start-time property."
(cl-flet
((append-unixtime
(span)
`(:unixtime ,(org-ml-time-to-unixtime (plist-get span :start-time)) ,@span)))
`(:unixtime ,(org-ml-timelist-to-unixtime (plist-get span :start-time)) ,@span)))
(-map #'append-unixtime timespans)))
;; get conflict headlines
@ -230,7 +230,7 @@ returned."
"Return TIMESPANS that conflict with each other.
The returned list will be a list of pairs of timespans
like (SPAN-a SPAN-b) which are two timespans that conflict."
(->> (--filter (org-ml-time-is-long (plist-get it :start-time)) timespans)
(->> (--filter (org-ml-timelist-has-time (plist-get it :start-time)) timespans)
(org-x-agg--timespans-append-unixtime)
(org-x-agg--timespans-remove-past)
(--sort (< (plist-get it :unixtime) (plist-get other :unixtime)))
@ -265,7 +265,7 @@ like (SPAN-a SPAN-b) which are two timespans that conflict."
;; `encode-time' and `decode-time' might not use the right time zone
;; unless specified manually
(-let* ((tz (current-time-zone))
(start-time* (if (org-ml-time-is-long start-time) start-time
(start-time* (if (org-ml-timelist-has-time start-time) start-time
`(,@(-take 3 start-time) 0 0)))
((y m d H M) start-time*)
(start-epoch (encode-float-time `(0 ,M ,H ,d ,m ,y nil nil ,tz)))

View File

@ -44,7 +44,7 @@
"Headline todo keyword for canceled task or project.")
(defconst org-x-done-keywords `(,org-x-kw-done ,org-x-kw-canc)
"Headline todo keywords that mark a task as 'complete'.")
"Headline todo keywords that mark a task as `complete'.")
(defconst org-x-meeting-keywords (cons org-x-kw-todo org-x-done-keywords)
"Allowed keywords for meetings.")

View File

@ -66,7 +66,7 @@
(defun org-x-dag-timestamp-to-epoch (ts)
(->> (org-ml-timestamp-get-start-time ts)
(org-ml-time-to-unixtime)))
(org-ml-timelist-to-unixtime)))
;; calendar interface
@ -91,7 +91,7 @@
(defun org-x-dag-datetimes-same-length-p (datetime0 datetime1)
;; ASSUME all digits in this comparison are on the calendar/clock (eg day 32
;; does not 'rollover' to day 1 on the next month)
(not (xor (org-ml-time-is-long datetime0) (org-ml-time-is-long datetime1))))
(not (xor (org-ml-timelist-has-time datetime0) (org-ml-timelist-has-time datetime1))))
;; TODO some of this is redundant because I'm checking the length twice
;; Maybe a -> Maybe a -> (a -> a -> b) -> b -> Maybe b
@ -110,7 +110,7 @@
(defun org-x-dag-datetime-split (datetime)
;; TODO this function doesn't guarantee that a short timestamp is properly
;; formatted
(if (org-ml-time-is-long datetime)
(if (org-ml-timelist-has-time datetime)
(-split-at 3 datetime)
`(,(org-x-dag-datetime-to-date datetime) nil)))
@ -403,7 +403,7 @@ relative shift in days from ABS."
(defun org-x-dag-partition-timestamp (ts)
(list :datetime (org-ml-timestamp-get-start-time ts)
:length (org-ml-timestamp-get-range ts)
:length (org-ml-timestamp-get-length ts)
:pos (org-ml-get-property :begin ts)
:repeater (org-ml-timestamp-extract-modulus 'repeater ts)
:warning (org-ml-timestamp-extract-modulus 'warning ts)))
@ -427,7 +427,7 @@ relative shift in days from ABS."
(-max-by #'org-x-dag-pts> ps))
(defun org-x-dag-pts-is-long-p (pts)
(org-ml-time-is-long (plist-get pts :datetime)))
(org-ml-timelist-has-time (plist-get pts :datetime)))
(defun org-x-dag-pts-to-epoch (pts)
(->> (plist-get pts :datetime)
@ -804,7 +804,7 @@ used for optimization."
(-if-let (,c (-some->> it-planning
(org-ml-get-property :closed)
(org-ml-timestamp-get-start-time)
(org-ml-time-to-unixtime)))
(org-ml-timelist-to-unixtime)))
(cond
((equal it-todo org-x-kw-canc)
(let ((it-comptime (complete-time ,c t)))
@ -852,7 +852,7 @@ deadline (eg via epoch time) or if it has a repeater."
(if (car (org-ml-timestamp-get-repeater deadline)) t
(let ((this-epoch (-some->> deadline
(org-ml-timestamp-get-start-time)
(org-ml-time-to-unixtime))))
(org-ml-timelist-to-unixtime))))
(< parent-epoch this-epoch))))))
(defun org-x-dag-bs-action-project-inner (node-data ancestry child-bss)
@ -1298,7 +1298,7 @@ deadline (eg via epoch time) or if it has a repeater."
(deadline (-some->> planning
(org-ml-get-property :deadline)
(org-ml-timestamp-get-start-time)
(org-ml-time-to-unixtime))))
(org-ml-timelist-to-unixtime))))
(list :canceled-parent-p (or c (equal todo org-x-kw-canc))
:held-parent-p (or h (equal todo org-x-kw-hold))
:parent-deadline (cond
@ -1526,7 +1526,7 @@ deadline (eg via epoch time) or if it has a repeater."
(-if-let (sched (-some->> (plist-get m :planning)
(org-ml-get-property :scheduled)
(org-ml-timestamp-get-start-time)))
(if (org-ml-time-is-long sched)
(if (org-ml-timelist-has-time sched)
(either :left "WKP branch node must be short scheduled")
(-let (((&plist :date d :offset o) date-offset)
(this-abs (org-x-dag-date-to-absolute sched)))
@ -1557,7 +1557,7 @@ deadline (eg via epoch time) or if it has a repeater."
(offset (->> (alist-get org-x-prop-week-len props nil nil #'equal)
(string-to-number)))
(ancestry (cond
((or (not datetime) (org-ml-time-is-long datetime))
((or (not datetime) (org-ml-timelist-has-time datetime))
(either :left "WKP root nodes must be short scheduled"))
((< offset 1)
(either :left "WKP root week length must be an int >= 1"))
@ -1811,7 +1811,7 @@ denoted by CUR-KEY with any errors that are found."
(lambda (id this-h res)
(-let* (((&alist :lifetime l) res)
(d (org-x-dag-adjlist-id-planning adjlist :deadline id))
(ns (if (car (org-ml-timestamp-get-repeater d))
(ns (if (and d (car (org-ml-timestamp-get-repeater d)))
(org-x-dag--ns-err "EPG has deadline with repeater" nil)
(either :right `(:committed ,l :deadline ,d)))))
(ht-set this-h id ns)
@ -2044,8 +2044,8 @@ DEF-FUN and the output from GET-FUN (type :: a -> NS)."
(org-ml-timestamp-get-start-time)))
(let ((set-dead (org-ml-timestamp-get-start-time to-set)))
(cond
((xor (org-ml-time-is-long this-dead)
(org-ml-time-is-long set-dead))
((xor (org-ml-timelist-has-time this-dead)
(org-ml-timelist-has-time set-dead))
(-> "EPG as parent with different deadline precision"
(org-x-dag--ns-err nil)))
((org-x-dag-datetime< set-dead this-dead)
@ -2599,7 +2599,7 @@ highest in the tree."
(defun org-x-dag-id->planning-epoch (which id)
(-some->> (org-x-dag-id->planning-datetime which id)
(org-ml-time-to-unixtime)))
(org-ml-timelist-to-unixtime)))
(defun org-x-dag-id->agenda-timestamp (id)
"Retrieve timestamp information of ID for sorting agenda views.
@ -2892,7 +2892,7 @@ encountered will be returned."
('warning '(:warning-value :warning-unit :warning-type))
('repeater '(:repeater-value :repeater-unit :repeater-type))))
(islongp (->> (org-ml-timestamp-get-start-time ts)
(org-ml-time-is-long))))
(org-ml-timelist-has-time))))
(-when-let ((value unit type) (org-ml-get-properties props ts))
(let ((v (convert-value islongp value unit))
(u (convert-unit unit)))
@ -2944,7 +2944,7 @@ FUTURE-LIMIT in a list."
(defun org-x-dag-get-scheduled-at (sel-date pts)
(-let* (((&plist :datetime d :repeater r) pts)
(islongp (org-ml-time-is-long d))
(islongp (org-ml-timelist-has-time d))
(sel-date+ (org-x-dag-datetime-shift sel-date 1 'submonth))
((future-limit cur)
(if islongp
@ -2955,7 +2955,7 @@ FUTURE-LIMIT in a list."
(defun org-x-dag-get-deadlines-at (sel-date pts)
(-let* (((&plist :datetime d :repeater r :warning w) pts)
(islongp (org-ml-time-is-long d))
(islongp (org-ml-timelist-has-time d))
((warn-shift warn-shifttype)
(if w w
(let ((f (if islongp 1440 1)))
@ -3465,14 +3465,14 @@ FUTURE-LIMIT in a list."
;; agenda/calendar
(defun org-x-dag-show-gaps (sel-date ids)
(let* ((epoch (org-ml-time-to-unixtime sel-date))
(let* ((epoch (org-ml-timelist-to-unixtime sel-date))
(epoch+ (+ epoch 86400))
(epoch- (- epoch 86400)))
(cl-flet*
((to-interval
(duration datetime)
(when (and (< 0 duration) (org-ml-time-is-long datetime))
(let* ((start (org-ml-time-to-unixtime datetime))
(when (and (< 0 duration) (org-ml-timelist-has-time datetime))
(let* ((start (org-ml-timelist-to-unixtime datetime))
(end (+ start duration)))
(when (or (and (<= epoch start) (<= start epoch+))
(and (<= epoch- start) (<= epoch end)))
@ -3605,7 +3605,7 @@ FUTURE-LIMIT in a list."
(x)
(-let* (((&plist :datetime :id) x)
(duration (or (org-x-dag-id->duration id) 0))
(start (org-ml-time-to-unixtime datetime)))
(start (org-ml-timelist-to-unixtime datetime)))
`(,start ,(+ start (* 60 duration)))))
(format-dtl
(fun dtl conflict)
@ -3621,7 +3621,7 @@ FUTURE-LIMIT in a list."
(can-conflict-p
(dtl)
(-let (((&plist :datetime :id) dtl))
(and (org-ml-time-is-long datetime)
(and (org-ml-timelist-has-time datetime)
(not (org-x-dag-id->is-done-p id))))))
(with-temp-buffer
(org-mode)
@ -3681,9 +3681,9 @@ FUTURE-LIMIT in a list."
(if ids (cons (org-x-dag-build-parent-link-drawer ids) children) children)))
(defun org-x-dag-headline-get-parent-links (headline)
(->> headline
(org-ml-headline-get-contents (org-x-logbook-config))
(org-x-dag-section-get-parent-links)))
(-some->> headline
(org-ml-headline-get-contents (org-x-logbook-config))
(org-x-dag-section-get-parent-links)))
(defun org-x-dag-headline-set-parent-links (ids headline)
(org-ml-headline-map-contents* (org-x-logbook-config)
@ -3868,7 +3868,7 @@ FUTURE-LIMIT in a list."
(org-x-dag-build-planning-id-headline title 4 paragraph ids))
(defun org-x-dag-build-dlp-headline (title paragraph ids datetime)
(let ((pl (org-ml-build-planning! :scheduled datetime)))
(let ((pl (list :scheduled datetime)))
(->> (org-x-dag-build-planning-id-headline title 4 paragraph ids)
(org-ml-headline-set-planning pl))))

View File

@ -66,7 +66,7 @@ nothing."
(with-current-buffer buffer
(widen)
(goto-char pos)
(org-show-context 'agenda)
(org-fold-show-context 'agenda)
,@body
,@get-head-form)
,@update-form

View File

@ -94,7 +94,7 @@ entire subtrees to save time and ignore tasks")
(car)
(org-ml-get-property :value)
(org-ml-timestamp-get-end-time)
(org-ml-time-to-unixtime))))
(org-ml-timelist-to-unixtime))))
(cond
((and first-item-ut first-clock-ut (< first-item-ut first-clock-ut))
first-clock-ut)
@ -294,7 +294,7 @@ the epoch time of the timestamp."
(org-x-headline-is-closed-p)))
(defun org-x-headline-is-created-in-future ()
"Return non-nil if current headline was 'created' in the future.
"Return non-nil if current headline was \"created\" in the future.
This should not happen and is an error if it does, and the
headline is tested analogously to `org-x-headline-is-created-p'
except tests if the timestamp is in the future. Actual returned
@ -321,11 +321,11 @@ timestamp."
(scheduled-ut (-some->> planning
(org-ml-get-property :scheduled)
(org-ml-timestamp-get-start-time)
(org-ml-time-to-unixtime)))
(org-ml-timelist-to-unixtime)))
(deadline-ut (-some->> planning
(org-ml-get-property :deadline)
(org-ml-timestamp-get-start-time)
(org-ml-time-to-unixtime)))
(org-ml-timelist-to-unixtime)))
(created-ut (-some->> (org-ml-headline-get-node-property org-x-prop-created hl)
(org-2ft))))
;; not inert if headline is scheduled or deadlined in the future
@ -504,7 +504,7 @@ property."
(defmacro org-x-headline-is-task-with-p (&rest body)
"Return t if all of BODY is t on the current headline.
'it' is bound to the keyword (if any)."
`it' is bound to the keyword (if any)."
(declare (indent 0))
`(-when-let (it (org-x-headline-is-task-p))
(and ,@body t)))
@ -562,7 +562,7 @@ property."
(defun org-x-headline-get-meeting-drawer (drawer-name)
"Return DRAWER-NAME under current headline.
If drawer is present but has no children, return 'none'. If
If drawer is present but has no children, return `none'. If
drawer is present and has a plain-list, return its items as a
list of nodes. If none of these conditions are true, return nil."
(-when-let (d (->> (org-ml-parse-this-headline)
@ -1281,7 +1281,7 @@ latter codes in the list trump earlier ones."
(org-ml-match org-x--first-active-ts-pattern)
(car)
(org-ml-timestamp-get-start-time)
(org-ml-time-to-unixtime)))
(org-ml-timelist-to-unixtime)))
(new-status
(cur-status ts)
(let ((new (cond
@ -1528,7 +1528,7 @@ ARG and INTERACTIVE are passed to `org-store-link'."
(node)
(-some->> (org-x-metablock-get-timestamp node)
(org-ml-timestamp-get-start-time)
(org-ml-time-to-unixtime)
(org-ml-timelist-to-unixtime)
(< (float-time)))))
(->> (org-x-parse-file-headlines (org-x-get-daily-plan-file) 'all)
(--filter (null (org-ml-headline-get-subheadlines it)))
@ -1614,7 +1614,7 @@ ARG and INTERACTIVE are passed to `org-store-link'."
(ts (-some->> (org-ml-headline-get-planning headline)
(org-ml-get-property :scheduled)
(org-ml-timestamp-get-start-time)
(org-ml-time-to-unixtime))))
(org-ml-timelist-to-unixtime))))
(when (org-ml-is-type 'plain-list first)
(->> (org-ml-get-children first)
(--map (org-x--make-agenda-metaitem headline is-closed ts it))))))
@ -1723,7 +1723,8 @@ This includes unchecking all checkboxes, marking keywords as
(--remove (org-x--is-drawer-with-name org-x-drwr-agenda it))))
;; remove CLOSED planning entry
(org-ml-headline-map-planning*
(-some->> it (org-ml-planning-set-timestamp! :closed nil)))
(plist-put it :closed nil))
;; (-some->> it (org-ml-planning-set-timestamp! :closed nil)))
;; clear item checkboxes
(org-ml-match-map* '(section :any * item)
(org-ml-set-property :checkbox 'off it))
@ -1762,11 +1763,14 @@ timestamp in the contents of the headline will be shifted."
subtree)
(t
(org-ml-headline-map-planning*
(-some->> it
(org-ml-map-property* :scheduled
(when it (org-ml-timestamp-shift offset unit it)))
(org-ml-map-property* :deadline
(when it (org-ml-timestamp-shift offset unit it))))
(-let (((&plist :scheduled s :deadline d) it))
(when s
(->> (org-ml-timelist-shift offset unit s)
(plist-put it :scheduled)))
(when d
(->> (org-ml-timelist-shift offset unit d)
(plist-put it :deadline)))
it)
subtree)))))
(shift
(offset unit subtree)
@ -1785,7 +1789,8 @@ timestamp in the contents of the headline will be shifted."
(--map-when (org-ml-get-property :todo-keyword it)
(assign-id it)
it)))))
(->> (org-ml-clone-node-n n headline)
(->> (-repeat n headline)
(--map (org-element-copy it t))
(--map-indexed (org-x--subtree-shift-timestamps
(* offset (1+ it-index)) unit it))
(-map #'assign-id))))
@ -1896,7 +1901,7 @@ including those that are inherited."
(let ((atodo (org-ml-get-property :todo-keyword headline))
(atime (-> (substring (cdr org-time-stamp-formats) 1 -1)
(format-time-string))))
(->> (org-ml-clone-node headline)
(->> (org-element-copy headline t)
(org-ml-headline-set-node-property "ARCHIVE_TIME" atime)
(org-ml-headline-set-node-property "ARCHIVE_FILE" afile)
(org-ml-headline-set-node-property "ARCHIVE_OLPATH" apath)
@ -1936,7 +1941,7 @@ and slow."
(org-ml-set-property :todo-keyword org-x-kw-done)
(org-ml-headline-map-planning*
(let ((time (org-ml-unixtime-to-time-long (float-time))))
(org-ml-planning-set-timestamp! :closed time it)))
(plist-put it :closed time)))
;; shift it to the top level
(org-ml-shift-property :level level-shift)
(org-ml-match-map* '(:any * headline)
@ -1963,7 +1968,7 @@ and slow."
(org-ml-unixtime-to-time-long)
(org-ml-build-timestamp!)
(org-ml-to-string)
(org-ml-build-node-property org-x-prop-created))))
(list org-x-prop-created))))
(org-ml-update-this-headline*
(org-ml-headline-map-node-properties* (-snoc it np) it))))
@ -1978,7 +1983,7 @@ If ARG is non-nil use long timestamp format."
(org-ml-unixtime-to-time-short ut))
(org-ml-build-timestamp!)
(org-ml-to-string)
(org-ml-build-node-property org-x-prop-expire))))
(list org-x-prop-expire))))
(org-ml-update-this-headline*
(org-ml-headline-map-node-properties* (cons np it) it)))))
@ -1986,7 +1991,7 @@ If ARG is non-nil use long timestamp format."
"Set days-to-live of the current headline."
(interactive)
(let ((np (->> (org-x--read-number-from-minibuffer "Days to live" t)
(org-ml-build-node-property org-x-prop-days-to-live))))
(list org-x-prop-days-to-live))))
(org-ml-update-this-headline*
(org-ml-headline-map-node-properties* (cons np it) it))))
@ -2127,7 +2132,7 @@ This will return matching matcher form for FILTER and TYPE
where TYPE is not in the regular `org-agenda-filter-make-matcher'
function. This is intended to be used as :before-until advice and
will return nil if the type is not valid (which is currently
'property')"
`property')"
(when (eq type 'property)
(-some->> (-map #'org-x-agenda-filter-make-property-matcher-form filter)
(cons 'and))))

View File

@ -1,135 +1,136 @@
(("ESS" . "e4f2afb90d11613c4c2a28720dcda226699b4dfb")
(("ESS" . "d60c13a6a347ea7a91ea3408bb464cff0ab4fef6")
("Highlight-Indentation-for-Emacs" . "d88db4248882da2d4316e76ed673b4ac1fa99ce3")
("ace-window" . "77115afc1b0b9f633084cf7479c767988106c196")
("anaconda-mode" . "79fa9b4d2bda9f69857aeffb30c75276848a2810")
("anaconda-mode" . "f900bd7656a03aa24ef3295251f266736f7756eb")
("annalist.el" . "e1ef5dad75fa502d761f70d9ddf1aeb1c423f41d")
("auctex" . "5b1229745b4d862e07e28fc597d92457688926f2")
("auctex" . "1855fdc01f7f6be6d331d25f8d30c22437cf3d66")
("auth-source-xoauth2" . "5d1adfa649bb5a9df20a2fa89f235a55a64b52e4")
("avy" . "be612110cb116a38b8603df367942e2bb3d9bdbe")
("bats-mode" . "fa88930b1baba101ae6474f289a239a236a7d19f")
("beacon" . "85261a928ae0ec3b41e639f05291ffd6bf7c231c")
("biblio.el" . "ee52f6cda82ea6fbc3b400e7b12132595cc0374c")
("blacken" . "0719cd6b301806c64ec79be9eebe954941e65277")
("blacken" . "3c6eb86ad871ca14fcfd4e5c0e7b285afa1f1f71")
("c-eldoc" . "f4ede1f37f6de583376669735326367d84a0a917")
("citeproc-el" . "fed285385c1a8c0248890cd591f64a0e2598334d")
("clang-format" . "9f4358fcc8b04018cc1ed46fcc96fc7bfa361a47")
("company-anaconda" . "1fe526163c265891cc20d971dc58b661ad8bcf23")
("citeproc-el" . "54184baaff555b5c7993d566d75dd04ed485b5c0")
("clang-format" . "7a955a4ed7e92fdb82983e307cb523547bb0285a")
("company-anaconda" . "169252fca79a79da41ef22f2ec0eab0cf1313966")
("company-auctex" . "9400a2ec7459dde8cbf1a5d50dfee4e300ed7e18")
("company-c-headers" . "9d384571b1190e99d0a789e5296176d69a3d0771")
("company-irony" . "b44711dfce445610c1ffaec4951c6ff3882b216a")
("company-math" . "3eb006874e309ff4076d947fcbd61bb6806aa508")
("company-mode" . "6c7731d4ec1e43199ea328e1691999b4fe8967a8")
("compat" . "25da9d232399203a38722aa6638b7fe8ecab3f60")
("conda.el" . "60e14d1e9793431b91913a5688e278bd91d56224")
("csv-mode" . "cdb73a771b0b9fa3cbae66dde5b934be6550a8b1")
("company-mode" . "58542350fb6a949f5ed91616a715e79ee42bd8a8")
("compat" . "c1f94ac75d6ea7f93c8da51e3f78ab3f39dbc2a2")
("conda.el" . "ce748a53f9c7d7a7d112632d32c848d6e5482e18")
("csv-mode" . "6979fc18ebe133cfe2fca02efda9a9f0cd13428a")
("dash.el" . "1de9dcb83eacfb162b6d9a118a4770b1281bcd84")
("delight" . "b59977bb957a5a79eb8aa0028d8e6e8ed6a7a6e1")
("delight" . "15acb0f0ba400c470e378f9984b315f9e02c1122")
("dhall-mode" . "87ab69fe765d87b3bb1604a306a8c44d6887681d")
("dired-du" . "0fc6119ddd3144453158ac107a8b107d82652c36")
("dired-hacks" . "a01c126c3b1068655509487c76971895f5459d09")
("dockerfile-mode" . "39a012a27fcf6fb629c447d13b6974baf906714c")
("ebib" . "2f2d39d1953fa10d7c3dad6a4611d8ec0d489aba")
("el-get" . "f220df34333fdb363b84b28f4ed4a5575341bf45")
("elpy" . "777e9909c8f1c11f1cfb8dbf5fe4a66d2ab95e1e")
("emacs-async" . "72b70b004505db2f06318fefd6b358704b9167d7")
("emacs-buttercup" . "a1a86b027ffe030e1c78a9f43c50cd20a6fed19a")
("dired-du" . "c16cad8c40a022a03dee1956a15ff44d1e42dc07")
("dired-hacks" . "e9e408e8571aee5574ca0a431ef15cac5a3585d4")
("dockerfile-mode" . "4d893bd2da15833ce056332e6c972d5d93e78f04")
("ebib" . "66d35ede5c209e2aaa81c885acde1214b5a1c132")
("el-get" . "2f3d2be393d70dab3047ac21512628dc91ec3a35")
("elpy" . "c40bab559fe77dcef6b90d5502eba1ecd566e86d")
("emacs-async" . "43f97d7e689eea65043ded1464747a2f3ce7661c")
("emacs-buttercup" . "bf01a33f8bc2d3664121d3b20f7496e67ce55e6a")
("emacs-calfw" . "03abce97620a4a7f7ec5f911e669da9031ab9088")
("emacs-dashboard" . "3852301f9c6f3104d9cc98389612b5ef3452a7de")
("emacs-dashboard" . "c9d2dda2cd75e9f6d05be0e52fb126f63e6e7430")
("emacs-format-all-the-code" . "f8feea08fef7ed542b8e676e90445d57ebd2c458")
("emacs-htmlize" . "ed5e5b05fd260e8f161a488d56f10e7f6e01fb75")
("emacs-language-id" . "435114f208b97e97aa1576ef1966a33d90cad01b")
("emacs-language-id" . "44452e4f7962aca41cc2539fce1d27799d6e656c")
("emacs-refactor" . "cac1b52932926f56d7f6d2923732d20bbd20670d")
("emacs-reformatter" . "0d29a04d69d47599e2cb7f1a8f8e897a2b592921")
("emacs-reformatter" . "48277af8b15d3a6a279cd489a55957e2dc819d8f")
("emacs-request" . "01e338c335c07e4407239619e57361944a82cb8a")
("emacs-web-server" . "3982c55e9061475038a3ccd61aecb2de3d407cec")
("emacs-which-key" . "1e89fa000e9ba9549f15ef57abccd118d5f2fe1a")
("emacsmirror-mirror" . "55c75c9ec26d9167a7815f20056f6ce0170f88cf")
("evil" . "3ba76c1c1f6e8f0389d7bebbd220eefaca796da4")
("emacs-which-key" . "38d4308d1143b61e4004b6e7a940686784e51500")
("emacsmirror-mirror" . "f261e80a72e8e66b0c19c28914653110c9d62838")
("evil" . "ea552efeeb809898932f55d1690da9cbe8ef5fa1")
("evil-ReplaceWithRegister" . "91cc7bf21a94703c441cc9212214075b226b7f67")
("evil-collection" . "acb056b1d0d3aad2f32b1ca9c019a9a2e976f03e")
("evil-collection" . "6365e7c8ae728f7a26294db261b6778d089a6263")
("evil-commentary" . "c5945f28ce47644c828aac1f5f6ec335478d17fb")
("evil-org-mode" . "b1f309726b1326e1a103742524ec331789f2bf94")
("evil-surround" . "da05c60b0621cf33161bb4335153f75ff5c29d91")
("f.el" . "1e7020dc0d4c52d3da9bd610d431cab13aa02d8c")
("fill-column-indicator" . "c35f9de072c241699b57bcb46da84bed5af29cfe")
("flycheck" . "10430dee428f7bab176743097d996182fac29daa")
("flycheck" . "7a6398ea3538a898eba0276f0f89b2f878325a89")
("flycheck-clang-analyzer" . "646d9f3a80046ab231a07526778695d5decad92d")
("flycheck-haskell" . "b7c4861aa754220b7d0cfc05aa0895bb35665683")
("flycheck-package" . "75efa098cf17dc14c363e2ca9b68afdac7766b5b")
("flyspell-correct" . "1e7a5a56362dd875dddf848b9a9e25d1395b9d37")
("gnu-elpa-mirror" . "5338f22d8cee40109a2616007b40b558e53eb0ae")
("gnu-elpa-mirror" . "4654b388ea470965f5e7c6c2e166b4c6b09855da")
("goto-chg" . "72f556524b88e9d30dc7fc5b0dc32078c166fda7")
("graphviz-dot-mode" . "8ff793b13707cb511875f56e167ff7f980a31136")
("haskell-mode" . "727f72a2a4b8e4fd0a7b62129668baea55a2c3e0")
("haskell-mode" . "c9dbfdc3ba79afab4a6fcd10fe8606039e4faacc")
("helm-bibtex" . "8b71b4f5ce62eeaf18067f57faaddc06449fbe1c")
("ht.el" . "1c49aad1c820c86f7ee35bf9fff8429502f60fef")
("hydra" . "317e1de33086637579a7aeb60f77ed0405bf359b")
("iedit" . "27c61866b1b9b8d77629ac702e5f48e67dfe0d3b")
("impatient-mode" . "a4e4e12852840996b027cb8e9fb2b809c37a0ee3")
("inf-ruby" . "0cfe8b2fb1ab222ed423a8e6f339d398fa32966f")
("inheritenv" . "bac62ca6324828623cf8ce5a3d6aee0fcb65d620")
("inf-ruby" . "b234625c85a48cc71e7045f5d48f079f410d576a")
("inheritenv" . "e8b012933cf5cc8deee8d961ca6c6c0d92745218")
("irony-mode" . "40e0ce19eb850bdf1f77225f11713cc816250d95")
("jinja2-mode" . "03e5430a7efe1d163a16beaf3c82c5fd2c2caee1")
("js-comint" . "ef2ccccad5740f3d8b5295f52a35df4f62471480")
("json-mode" . "77125b01c0ddce537085201098bea9b4b8ba6be3")
("json-snatcher" . "b28d1c0670636da6db508d03872d96ffddbc10f2")
("let-alist" . "6e9f470e78cf50afa0e53a61da191d68d87a0104")
("let-alist" . "4e05e158612f360f6080b1349d3962b1c8fee902")
("lispy" . "fe44efd21573868638ca86fc8313241148fabbe3")
("list-utils" . "f02dcef36330871855346f9eab97eef58d323d9a")
("lua-mode" . "d074e4134b1beae9ed4c9b512af741ca0d852ba3")
("magit" . "b908c79b44f5c282eec44f19fc1d9967f041dd5c")
("markdown-mode" . "0cdebc833ed9b98baf9f260ed12b1e36b0ca0e89")
("magit" . "9395de2c94cc430ca865f497046c16f66deccf16")
("markdown-mode" . "6102ac5b7301b4c4fc0262d9c6516693d5a33f2b")
("math-symbol-lists" . "ac3eb053d3b576fcdd192b0ac6ad5090ea3a7079")
("melpa" . "1b06cc08de41e82f3f148aa9e35663e2e06427ae")
("melpa" . "bfa04bef05bdeab1a097cb5204263ee9078f83a9")
("nix-mode" . "719feb7868fb567ecfe5578f6119892c771ac5e5")
("no-littering" . "8b07314d2f0594ff22bf798d9a5f5bf44b4dd4cd")
("nongnu-elpa" . "69e5a9b389738b8f090b96b909a213293cf8e46c")
("no-littering" . "1ac24bb31e64b2efecae2f715f10882e130c1168")
("nongnu-elpa" . "94966229ca17882de6cbc1b709120e19a030d35d")
("org" . "233a0ced97366090c31ef94562879bb2f729b120")
("org-bullets" . "767f55feb58b840a5a04eabfc3fbbf0d257c4792")
("org-ml" . "f57336a9126a168ad32ccce017c072474555395a")
("org-ref" . "4029a37e3ba36fb812cdf228e4b21db06ade2b6d")
("org-sql" . "43376abf46b897a9a862cfcc1c087f4b8688634c")
("org-super-agenda" . "51c9da5ce7b791150758984bab469d2222516844")
("org-ref" . "fd178abf12a85f8e12005d1df683564bdc534124")
("org-sql" . "3dbf11d692cf0d5e64235ad4041ed0b5a6775064")
("org-super-agenda" . "05a710065af5ee4b3982f9619f864f7af12ca1d3")
("origami.el" . "e558710a975e8511b9386edc81cd6bdd0a5bda74")
("outline-magic" . "2a5f07417b696cf7541d435c43bafcc64817636b")
("ox-pandoc" . "399d787b6e2124bd782615338b845c3724a47718")
("package-lint" . "972dd8403ac8d2d43f298ef89a6b118e49c7355f")
("paredit" . "9a2c4b37fc8c1c7bdbb1f86fdec874c0d0652e64")
("ox-pandoc" . "34e6ea97b586e20529d07158a73af3cf33cdd1d5")
("package-lint" . "a60fcca5b8a94c07d7a12e446c4ca7fb6a84cdc6")
("paredit" . "037b9b8acbca75151f133b6c0f7f3ff97d9042e5")
("parsebib" . "ace9df707108b17759c004c7387655277122d4c1")
("password-store" . "b5e965a838bb68c1227caa2cdd874ba496f10149")
("pcre2el" . "380723b2701cceb75c266440fb8db918f3340d50")
("pcre2el" . "b4d846d80dddb313042131cf2b8fbf647567e000")
("pdf-tools" . "30b50544e55b8dbf683c2d932d5c33ac73323a16")
("php-mode" . "c8e4c16ca0d234f4a659713a94467f0c32ef4bc8")
("php-mode" . "e3087db57e6b1682eb80af2916f106ac19472ce3")
("pkgbuild-mode" . "8ef396d8fa9187b65c065a6bc2ca15dfaf3255df")
("poly-R" . "8024e852cfca642dea2045a41b2033baa2f1f9a5")
("poly-markdown" . "98695eb7ca4ca11dcec71a1cab64903bbf79b4d3")
("poly-noweb" . "3b0cd36ca9a707e8a09337a3468fa85d81fc461c")
("polymode" . "ca060e081a1f849a880732670dc15370ac987b89")
("popup-el" . "545e258024f6e4a8b2a066a5442d9e0147a7ee03")
("popup-el" . "c83d6e5f5fa693e08a542ea9ad7c06eced652de9")
("powerline" . "c35c35bdf5ce2d992882c1f06f0f078058870d4a")
("projectile" . "0163b335a18af0f077a474d4dc6b36e22b5e3274")
("pythonic" . "00f8cafe02bdac0f3e562ffe6881ce654c8eb588")
("projectile" . "002e52769e5fda5e03fb9069ae02b2d3763c92e8")
("pythonic" . "c1e5643e044f1faaf6ecfadc719b981c048aeb79")
("pyvenv" . "31ea715f2164dd611e7fc77b26390ef3ca93509b")
("queue" . "df8a1a2ad77d57c25e7005f0add275c13f9db20f")
("queue" . "8df1334d54d4735d2f821790422a850dfaaa08ef")
("rainbow-delimiters" . "f40ece58df8b2f0fb6c8576b527755a552a5e763")
("rainbow-mode" . "0740f31f300982534183a2f60b1918de418a6f2c")
("rainbow-mode" . "2e6b18609c2fdd1a2dc513937a64d276fd6cf24c")
("robe" . "6bc8a07fc483407971de0966d367a11006b3ab80")
("ruby-test-mode" . "d66db4aca6e6a246f65f7195ecfbc7581d35fb7a")
("rvm.el" . "e1e83b5466c132c066142ac63729ba833c530c83")
("s.el" . "dda84d38fffdaf0c9b12837b504b402af910d01d")
("seq" . "d6b97ea450817ecef174d9c65d59b69bc5721a35")
("seq" . "da86da9bf111f68fb81efd466d76d53af5aebc00")
("snakemake-mode" . "4ad41da69e4b95b38a3d3273874c44caab20cc56")
("spaceline" . "086420d16e526c79b67fc1edec4c2ae1e699f372")
("spacemacs-theme" . "319ad1cd6aa05dcb43e4edca50eca339892e0865")
("straight.el" . "b3760f5829dba37e855add7323304561eb57a3d4")
("string-inflection" . "50ad54970b3cc79b6b83979bde9889ad9a9e1a9c")
("spacemacs-theme" . "9f3781430106adfe512790d55a9705568b58d968")
("straight.el" . "88e574ae75344e39b436f863ef0344135c7b6517")
("string-inflection" . "617df25e91351feffe6aff4d9e4724733449d608")
("sudo-edit" . "74eb1e6986461baed9a9269566ff838530b4379b")
("swiper" . "2a25a6fb5b081cb141c5eccac8ee58ab1feeb747")
("swiper" . "8dc02d5b725f78d1f80904807b46f5406f129674")
("tablist" . "fcd37147121fabdf003a70279cf86fbe08cfac6f")
("toc-org" . "6d3ae0fc47ce79b1ea06cabe21a3c596395409cd")
("transient" . "239be53b01e003c5206087d850d9672a42dc4b32")
("transient" . "5a41cd581e051fb5acf0444b02b926070073b89f")
("ts.el" . "552936017cfdec89f7fc20c254ae6b37c3f22c5b")
("use-package" . "a6e856418d2ebd053b34e0ab2fda328abeba731c")
("with-editor" . "84ba06ed513e97223630905f4788370e18116f40")
("with-editor" . "77cb2403158cfea9d8bfb8adad81b84d1d6d7c6a")
("xterm-color" . "2ad407c651e90fff2ea85d17bf074cee2c022912")
("yaml-mode" . "7b5ce294fb15c2c8926fa476d7218aa415550a2a")
("yasnippet" . "eb5ba2664c3a68ae4a53bb38b85418dd131b208f")