From b99c6c0f539dbc448f2c89d916cab2cfdb913973 Mon Sep 17 00:00:00 2001 From: KemoNine Date: Fri, 22 Apr 2022 16:59:41 -0400 Subject: [PATCH] elpa changes --- .../all-the-icons-dired-pkg.el | 4 +- code/elpa/archives/gnu/archive-contents | 19 +- .../elpa/archives/gnu/archive-contents.signed | 2 +- code/elpa/archives/melpa/archive-contents | 60 +- .../elpa/dashboard-20220409.620/banners/1.txt | 8 + .../elpa/dashboard-20220409.620/banners/2.txt | 6 + .../elpa/dashboard-20220409.620/banners/3.txt | 8 + .../elpa/dashboard-20220409.620/banners/4.txt | 17 + .../dashboard-20220409.620/banners/emacs.png | Bin 0 -> 43759 bytes .../dashboard-20220409.620/banners/logo.png | Bin 0 -> 32305 bytes .../dashboard-autoloads.el | 39 + .../dashboard-20220409.620/dashboard-pkg.el | 12 + .../dashboard-widgets.el | 1267 +++++++++++++++++ code/elpa/dashboard-20220409.620/dashboard.el | 472 ++++++ .../dashboard-project-status-autoloads.el | 23 + .../dashboard-project-status-pkg.el | 2 + .../dashboard-project-status.el | 99 ++ .../dired-collapse-autoloads.el | 42 - .../dired-collapse-pkg.el | 2 - .../dired-collapse.el | 162 --- .../dired-hacks-utils-pkg.el | 4 +- .../dired-rainbow-pkg.el | 4 +- .../dired-ranger-autoloads.el | 73 - .../dired-ranger-pkg.el | 2 - .../dired-ranger.el | 299 ---- .../dired-single-pkg.el | 4 +- code/elpa/git-20140128.1041/git-autoloads.el | 22 + code/elpa/git-20140128.1041/git-pkg.el | 2 + code/elpa/git-20140128.1041/git.el | 280 ++++ .../all-the-icons-dired-autoloads.el | 43 - .../all-the-icons-dired-pkg.el | 2 - .../all-the-icons-dired.el | 159 --- org/elpa/dashboard-20220409.620/banners/1.txt | 8 + org/elpa/dashboard-20220409.620/banners/2.txt | 6 + org/elpa/dashboard-20220409.620/banners/3.txt | 8 + org/elpa/dashboard-20220409.620/banners/4.txt | 17 + .../dashboard-20220409.620/banners/emacs.png | Bin 0 -> 43759 bytes .../dashboard-20220409.620/banners/logo.png | Bin 0 -> 32305 bytes .../dashboard-autoloads.el | 39 + .../dashboard-20220409.620/dashboard-pkg.el | 12 + .../dashboard-widgets.el | 1267 +++++++++++++++++ org/elpa/dashboard-20220409.620/dashboard.el | 472 ++++++ .../dashboard-project-status-autoloads.el | 23 + .../dashboard-project-status-pkg.el | 2 + .../dashboard-project-status.el | 99 ++ .../dired-collapse-autoloads.el | 42 - .../dired-collapse-pkg.el | 2 - .../dired-collapse.el | 162 --- .../dired-hacks-utils-autoloads.el | 23 - .../dired-hacks-utils-pkg.el | 2 - .../dired-hacks-utils.el | 275 ---- .../dired-rainbow-autoloads.el | 22 - .../dired-rainbow-pkg.el | 2 - .../dired-rainbow.el | 181 --- .../dired-ranger-autoloads.el | 73 - .../dired-ranger-pkg.el | 2 - .../dired-ranger.el | 299 ---- .../dired-single-autoloads.el | 73 - .../dired-single-pkg.el | 2 - .../dired-single.el | 215 --- org/elpa/git-20140128.1041/git-autoloads.el | 22 + org/elpa/git-20140128.1041/git-pkg.el | 2 + org/elpa/git-20140128.1041/git.el | 280 ++++ .../origami-autoloads.el | 76 + .../origami-20200331.1019/origami-parsers.el | 266 ++++ org/elpa/origami-20200331.1019/origami-pkg.el | 15 + org/elpa/origami-20200331.1019/origami.el | 828 +++++++++++ 67 files changed, 5748 insertions(+), 2207 deletions(-) create mode 100644 code/elpa/dashboard-20220409.620/banners/1.txt create mode 100644 code/elpa/dashboard-20220409.620/banners/2.txt create mode 100644 code/elpa/dashboard-20220409.620/banners/3.txt create mode 100644 code/elpa/dashboard-20220409.620/banners/4.txt create mode 100644 code/elpa/dashboard-20220409.620/banners/emacs.png create mode 100644 code/elpa/dashboard-20220409.620/banners/logo.png create mode 100644 code/elpa/dashboard-20220409.620/dashboard-autoloads.el create mode 100644 code/elpa/dashboard-20220409.620/dashboard-pkg.el create mode 100644 code/elpa/dashboard-20220409.620/dashboard-widgets.el create mode 100644 code/elpa/dashboard-20220409.620/dashboard.el create mode 100644 code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el create mode 100644 code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el create mode 100644 code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el delete mode 100644 code/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el delete mode 100644 code/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el delete mode 100644 code/elpa/dired-collapse-20210403.1230/dired-collapse.el delete mode 100644 code/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el delete mode 100644 code/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el delete mode 100644 code/elpa/dired-ranger-20180401.2206/dired-ranger.el create mode 100644 code/elpa/git-20140128.1041/git-autoloads.el create mode 100644 code/elpa/git-20140128.1041/git-pkg.el create mode 100644 code/elpa/git-20140128.1041/git.el delete mode 100644 org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-autoloads.el delete mode 100644 org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el delete mode 100644 org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired.el create mode 100644 org/elpa/dashboard-20220409.620/banners/1.txt create mode 100644 org/elpa/dashboard-20220409.620/banners/2.txt create mode 100644 org/elpa/dashboard-20220409.620/banners/3.txt create mode 100644 org/elpa/dashboard-20220409.620/banners/4.txt create mode 100644 org/elpa/dashboard-20220409.620/banners/emacs.png create mode 100644 org/elpa/dashboard-20220409.620/banners/logo.png create mode 100644 org/elpa/dashboard-20220409.620/dashboard-autoloads.el create mode 100644 org/elpa/dashboard-20220409.620/dashboard-pkg.el create mode 100644 org/elpa/dashboard-20220409.620/dashboard-widgets.el create mode 100644 org/elpa/dashboard-20220409.620/dashboard.el create mode 100644 org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el create mode 100644 org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el create mode 100644 org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el delete mode 100644 org/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el delete mode 100644 org/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el delete mode 100644 org/elpa/dired-collapse-20210403.1230/dired-collapse.el delete mode 100644 org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-autoloads.el delete mode 100644 org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el delete mode 100644 org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils.el delete mode 100644 org/elpa/dired-rainbow-20190722.1109/dired-rainbow-autoloads.el delete mode 100644 org/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el delete mode 100644 org/elpa/dired-rainbow-20190722.1109/dired-rainbow.el delete mode 100644 org/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el delete mode 100644 org/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el delete mode 100644 org/elpa/dired-ranger-20180401.2206/dired-ranger.el delete mode 100644 org/elpa/dired-single-20211101.2319/dired-single-autoloads.el delete mode 100644 org/elpa/dired-single-20211101.2319/dired-single-pkg.el delete mode 100644 org/elpa/dired-single-20211101.2319/dired-single.el create mode 100644 org/elpa/git-20140128.1041/git-autoloads.el create mode 100644 org/elpa/git-20140128.1041/git-pkg.el create mode 100644 org/elpa/git-20140128.1041/git.el create mode 100644 org/elpa/origami-20200331.1019/origami-autoloads.el create mode 100644 org/elpa/origami-20200331.1019/origami-parsers.el create mode 100644 org/elpa/origami-20200331.1019/origami-pkg.el create mode 100644 org/elpa/origami-20200331.1019/origami.el diff --git a/code/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el b/code/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el index a6ce0d7..e0def8d 100644 --- a/code/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el +++ b/code/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el @@ -1,2 +1,2 @@ -;;; Generated package description from all-the-icons-dired.el -*- no-byte-compile: t -*- -(define-package "all-the-icons-dired" "20220304.1638" "Shows icons for each file in dired mode" '((emacs "24.4") (all-the-icons "2.2.0")) :commit "147ed0dfd1034a686795a08dc63e2c293128597e" :authors '(("jtbm37")) :maintainer '("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") :keywords '("files" "icons" "dired") :url "https://github.com/wyuenho/all-the-icons-dired") +;;; Generated package description from all-the-icons-dired.el -*- no-byte-compile: t -*- +(define-package "all-the-icons-dired" "20220304.1638" "Shows icons for each file in dired mode" '((emacs "24.4") (all-the-icons "2.2.0")) :commit "147ed0dfd1034a686795a08dc63e2c293128597e" :authors '(("jtbm37")) :maintainer '("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") :keywords '("files" "icons" "dired") :url "https://github.com/wyuenho/all-the-icons-dired") diff --git a/code/elpa/archives/gnu/archive-contents b/code/elpa/archives/gnu/archive-contents index 1c78ee3..1ca8966 100644 --- a/code/elpa/archives/gnu/archive-contents +++ b/code/elpa/archives/gnu/archive-contents @@ -1606,7 +1606,7 @@ ("Stefan Monnier" . "monnier@iro.umontreal.ca")) (:url . "http://elpa.gnu.org/packages/lex.html"))]) (lin . - [(0 3 0) + [(0 3 1) ((emacs (27 1))) "Make `hl-line-mode' more suitable for selection UIs" tar @@ -1615,7 +1615,7 @@ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) - (:commit . "edc29c2afe98ecd120108b7d3561aff938cc22c3"))]) + (:commit . "520621e51a6f6882beda4420fa5ccee6682748dd"))]) (lmc . [(1 4) ((emacs @@ -1661,7 +1661,7 @@ (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:url . "https://github.com/fourier/loccur"))]) (logos . - [(0 3 1) + [(0 3 2) ((emacs (27 1))) "Simple focus mode and extras" tar @@ -1670,7 +1670,7 @@ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) - (:commit . "9e6824b8fa67c6c96e46eeb410cbca2f88193a2d"))]) + (:commit . "dd25e36b64320f2ba9400a3929443aa81085e697"))]) (map . [(3 2 1) ((emacs @@ -2269,7 +2269,7 @@ ("Scott Andrew Borton" . "scott@pp.htv.fi")) (:maintainer "John Darrington" . "john@darrington.wattle.id.au"))]) (pulsar . - [(0 3 0) + [(0 3 1) ((emacs (27 1))) "Pulse highlight on demand or after select functions" tar @@ -2278,7 +2278,7 @@ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) - (:commit . "cdb7892a2b7e8e7cc644b8e24e5ab6bf0c51584d"))]) + (:commit . "86a7c429c6878287c068106b318889824cad3210"))]) (pyim . [(4 1 1) ((emacs @@ -2949,15 +2949,16 @@ ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:keywords "convenience"))]) (tmr . - [(0 2 1) + [(0 2 2) ((emacs (27 1))) - "TMR Must Recur" tar + "Set timers using a convenient notation" tar ((:url . "https://git.sr.ht/~protesilaos/tmr") + (:keywords "convenience" "timer") (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) - (:commit . "30784cbe2eb036e58e99cd9b9e44909e7db93cdc"))]) + (:commit . "bf13ea973126ea5a1a8f6d4216959d9da4ade979"))]) (tramp . [(2 5 2 3) ((emacs diff --git a/code/elpa/archives/gnu/archive-contents.signed b/code/elpa/archives/gnu/archive-contents.signed index 39d3607..a069b33 100644 --- a/code/elpa/archives/gnu/archive-contents.signed +++ b/code/elpa/archives/gnu/archive-contents.signed @@ -1 +1 @@ -Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) (trust undefined) created at 2022-04-21T17:15:02-0400 using RSA \ No newline at end of file +Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) (trust undefined) created at 2022-04-22T05:05:03-0400 using RSA \ No newline at end of file diff --git a/code/elpa/archives/melpa/archive-contents b/code/elpa/archives/melpa/archive-contents index b5f0071..22319fd 100644 --- a/code/elpa/archives/melpa/archive-contents +++ b/code/elpa/archives/melpa/archive-contents @@ -100,7 +100,7 @@ (all-the-icons-completion . [(20220409 1204) ((emacs (26 1)) (all-the-icons (5 0))) "Add icons to completion candidates" single ((:commit . "286e2c064a1298be0d8d4100dc91d7a7a554d04a") (:authors ("Itai Y. Efrat ")) (:maintainer "Itai Y. Efrat" . "itai3397@gmail.com") (:keywords "convenient" "lisp") (:url . "https://github.com/iyefrat/all-the-icons-completion"))]) (all-the-icons-dired . [(20220304 1638) ((emacs (24 4)) (all-the-icons (2 2 0))) "Shows icons for each file in dired mode" single ((:commit . "147ed0dfd1034a686795a08dc63e2c293128597e") (:authors ("jtbm37")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "files" "icons" "dired") (:url . "https://github.com/wyuenho/all-the-icons-dired"))]) (all-the-icons-gnus . [(20180511 654) ((emacs (24 4)) (dash (2 12 0)) (all-the-icons (3 1 0))) "Shows icons for in Gnus" single ((:commit . "27f78996da0725943bcfb2d18038e6f7bddfa9c7") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "mail" "tools"))]) - (all-the-icons-ibuffer . [(20220228 1513) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" single ((:commit . "21d5859f1412413f165e0ca44f6002902409a9f9") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ibuffer") (:url . "https://github.com/seagle0128/all-the-icons-ibuffer"))]) + (all-the-icons-ibuffer . [(20220422 1034) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" single ((:commit . "feebb1c2fe6564cc46489e37b7423afec670f3a6") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ibuffer") (:url . "https://github.com/seagle0128/all-the-icons-ibuffer"))]) (all-the-icons-ivy . [(20190508 1803) ((emacs (24 4)) (all-the-icons (2 4 0)) (ivy (0 8 0))) "Shows icons while using ivy and counsel" single ((:commit . "a70cbfa1effe36efc946a823a580cec686d5e88d") (:authors ("asok")) (:maintainer "asok") (:keywords "faces"))]) (all-the-icons-ivy-rich . [(20220411 222) ((emacs (25 1)) (ivy-rich (0 1 0)) (all-the-icons (2 2 0))) "Better experience with icons for ivy" single ((:commit . "b2fc7db5432431e56babb3440c7a4aab8ff0744d") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ivy") (:url . "https://github.com/seagle0128/all-the-icons-ivy-rich"))]) (almost-mono-themes . [(20210306 1040) ((emacs (24))) "Almost monochromatic color themes" tar ((:commit . "6503bf0e5429a51906fb1db94941a4fa678bf9b1") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:keywords "faces") (:url . "https://github.com/cryon/almost-mono-themes"))]) @@ -556,7 +556,7 @@ (cm-mode . [(20170203 2107) ((cl-lib (0 5))) "Minor mode for CriticMarkup" single ((:commit . "276d49c859822265070ae5dfbb403fd7d8d06436") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "markdown"))]) (cmake-font-lock . [(20211224 2006) ((cmake-mode (0 0))) "Advanced, type aware, highlight support for CMake" single ((:commit . "0d6111b36a66013aa9b452e664c93308df3b07e1") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "languages") (:url . "https://github.com/Lindydancer/cmake-font-lock"))]) (cmake-ide . [(20210610 1525) ((emacs (24 4)) (cl-lib (0 5)) (seq (1 11)) (levenshtein (0)) (s (1 11 0))) "Calls CMake to find out include paths and other compiler flags" single ((:commit . "28dc4ab5bd01d99553901b4efeb7234280928b18") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com") (:keywords "languages") (:url . "http://github.com/atilaneves/cmake-ide"))]) - (cmake-mode . [(20220322 1258) ((emacs (24 1))) "major-mode for editing CMake sources" single ((:commit . "7fc013a9229087cbafeb9ff4c96d1d1acb71c5d6"))]) + (cmake-mode . [(20220322 1258) ((emacs (24 1))) "major-mode for editing CMake sources" single ((:commit . "bcd98b5f9846d7b9d2a6518501eb7ac56139665e"))]) (cmake-project . [(20171121 1115) nil "Integrates CMake build process with Emacs" single ((:commit . "a7cf9e4c01c4683e14b6942cc5cc5e8cddc98721") (:authors ("Alexander Lamaison" . "alexander.lamaison@gmail")) (:maintainer "Alexander Lamaison" . "alexander.lamaison@gmail") (:keywords "c" "cmake" "languages" "tools") (:url . "http://github.com/alamaison/emacs-cmake-project"))]) (cmd-to-echo . [(20161203 2133) ((emacs (24 4)) (s (1 11 0)) (shell-split-string (20151224 208))) "Show the output of long-running commands in the echo area" single ((:commit . "e0e874fc0e1ad6d291e39ed76023445297ad438a") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) (cmm-mode . [(20150225 746) nil "Major mode for C-- source code" single ((:commit . "c3ad514dff3eb30434f6b20d953276d4c00de1ee"))]) @@ -687,7 +687,7 @@ (conllu-mode . [(20200501 2328) ((emacs (25)) (cl-lib (0 5)) (flycheck (30)) (hydra (0 13 0)) (s (1 0))) "editing mode for CoNLL-U files" tar ((:commit . "0db3063572b0de08874822e20570bb153747e6ed") (:authors ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com") (:keywords "extensions") (:url . "https://github.com/odanoburu/conllu-mode"))]) (connection . [(20191111 446) nil "TCP-based client connection" single ((:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "network"))]) (constant-theme . [(20180921 1012) ((emacs (24 1))) "A calm, dark, almost monochrome color theme." tar ((:commit . "23543a09729569b566175abe1efbe774048d3fa8") (:authors ("Jannis Pohlmann" . "contact@jannispohlmann.de")) (:maintainer "Jannis Pohlmann" . "contact@jannispohlmann.de") (:keywords "themes") (:url . "https://github.com/jannis/emacs-constant-theme"))]) - (consult . [(20220421 1130) ((emacs (27 1))) "Consulting completing-read" tar ((:commit . "6df330a2856a5d4fc19c865d8839ce64f179bd89") (:authors ("Daniel Mendler and Consult contributors")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/consult"))]) + (consult . [(20220422 1334) ((emacs (27 1))) "Consulting completing-read" tar ((:commit . "d705257e99622d738ec48295eb573f2c686d3757") (:authors ("Daniel Mendler and Consult contributors")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/consult"))]) (consult-company . [(20211021 1152) ((emacs (27 1)) (company (0 9)) (consult (0 9))) "Consult frontend for company" single ((:commit . "ef1c553b4a72b23297b55708bf6f6dd1b27cc68e") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:url . "https://github.com/mohkale/consult-company"))]) (consult-dir . [(20211007 2352) ((emacs (26 1)) (consult (0 9)) (project (0 6 0))) "Insert paths into the minibuffer prompt" single ((:commit . "08f543ae6acbfc1ffe579ba1d00a5414012d5c0b") (:authors ("Karthik Chikmagalur")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") (:keywords "convenience") (:url . "https://github.com/karthink/consult-dir"))]) (consult-eglot . [(20220409 1238) ((emacs (27 1)) (eglot (1 7)) (consult (0 16)) (project (0 3 0))) "A consulting-read interface for eglot" single ((:commit . "0da8801dd8435160ce1f62ad8066bd52e38f5cbd") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem") (:keywords "tools" "completion" "lsp") (:url . "https://github.com/mohkale/consult-eglot"))]) @@ -814,7 +814,7 @@ (dakrone-theme . [(20170801 1933) nil "dakrone's custom dark theme" single ((:commit . "232ad1be5f3572dcbdf528f1655109aa355a6937") (:authors ("Lee Hinman ")) (:maintainer "Lee Hinman ") (:keywords "color" "themes") (:url . "https://github.com/dakrone/dakrone-theme"))]) (danneskjold-theme . [(20220316 1101) nil "Beautiful high-contrast Emacs theme." tar ((:commit . "054c0b9bc9cefb53a4065096e66707d20885c461") (:authors ("Dmitry Akatov" . "akatovda@yandex.com")) (:maintainer "Dmitry Akatov" . "akatovda@yandex.com") (:url . "https://github.com/rails-to-cosmos/"))]) (dante . [(20210301 1738) ((dash (2 12 0)) (emacs (25 1)) (f (0 19 0)) (flycheck (0 30)) (company (0 9)) (haskell-mode (13 14)) (s (1 11 0)) (lcr (1 0))) "Development mode for Haskell" single ((:commit . "8741419333fb85ed2c1d71f5902688f5201b0a40") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:keywords "haskell" "tools") (:url . "https://github.com/jyp/dante"))]) - (dap-mode . [(20220416 1252) ((emacs (26 1)) (dash (2 18 0)) (lsp-mode (6 0)) (bui (1 1 0)) (f (0 20 0)) (s (1 12 0)) (lsp-treemacs (0 1)) (posframe (0 7 0)) (ht (2 3))) "Debug Adapter Protocol mode" tar ((:commit . "e29d3e6c79356a4c149bb50059cffca7de0ce079") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/dap-mode"))]) + (dap-mode . [(20220416 1252) ((emacs (26 1)) (dash (2 18 0)) (lsp-mode (6 0)) (bui (1 1 0)) (f (0 20 0)) (s (1 12 0)) (lsp-treemacs (0 1)) (posframe (0 7 0)) (ht (2 3))) "Debug Adapter Protocol mode" tar ((:commit . "adc947a1428fe6b4136fcee5e7c73a04b16fb9ed") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/dap-mode"))]) (darcsum . [(20190316 2215) nil "a pcl-cvs like interface for managing darcs patches" single ((:commit . "6a8b690539d133c5e3d17cb23fe4365fbb6fb493") (:authors ("John Wiegley" . "johnw@gnu.org")) (:maintainer "John Wiegley" . "johnw@gnu.org") (:keywords "completion" "convenience" "tools" "vc"))]) (darcula-theme . [(20171227 1845) nil "Inspired by IntelliJ's Darcula theme" single ((:commit . "d9b82b58ded9014985be6658f4ab17e26ed9e93e") (:authors ("Sam Halliday" . "Sam.Halliday@gmail.com")) (:maintainer "Sam Halliday" . "Sam.Halliday@gmail.com") (:keywords "faces") (:url . "https://gitlab.com/fommil/emacs-darcula-theme"))]) (dark-krystal-theme . [(20170808 1300) ((emacs (24 0))) "an Emacs 24 theme based on Dark Krystal (tmTheme)" single ((:commit . "79084b99665dc9ffb0ec62cc092349a5ecebebbc") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) @@ -886,7 +886,7 @@ (dictcc . [(20220219 1302) ((emacs (24 4)) (cl-lib (0 5)) (ivy (0 10 0))) "Look up translations on dict.cc" single ((:commit . "8ecb954fcf193cba138191f8947c8b0b60a1c6c5") (:authors ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainer "Marten Lienen" . "marten.lienen@gmail.com") (:keywords "convenience"))]) (dictionary . [(20201001 1727) ((connection (1 11)) (link (1 11))) "Client for rfc2229 dictionary servers" single ((:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "interface" "dictionary"))]) (didyoumean . [(20200905 1843) ((emacs (24 4))) "Did you mean to open another file?" single ((:commit . "ce5edcce160b86e7f6480f0381be785d43f97e19") (:keywords "convenience") (:url . "https://gitlab.com/kisaragi-hiu/didyoumean.el"))]) - (diff-ansi . [(20220323 106) ((emacs (27 1))) "Display diff's using alternative diffing tools" single ((:commit . "39b39a7265c59e413ff32f1fccebe4dc1a7a966e") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-ansi"))]) + (diff-ansi . [(20220422 647) ((emacs (27 1))) "Display diff's using alternative diffing tools" single ((:commit . "f47e62503d77dbcadb36e9d3d0ede9242536fa89") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-ansi"))]) (diff-at-point . [(20220211 548) ((emacs (26 2))) "Diff navigation" single ((:commit . "819da8d75762e1fb1a975d78c2b4666506048485") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-at-point"))]) (diff-hl . [(20220405 2359) ((cl-lib (0 2)) (emacs (25 1))) "Highlight uncommitted changes using VC" tar ((:commit . "9d5dc2ffa1e4c7b43734b03dccb5ae6a80800569") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "vc" "diff") (:url . "https://github.com/dgutov/diff-hl"))]) (difflib . [(20210224 2242) ((emacs (24 4)) (cl-generic (0 3)) (ht (2 2)) (s (1 12 0))) "Helpers for computing deltas between sequences." single ((:commit . "646fc4388274fe765bbf4661e17a24e4d081250c") (:authors ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainer "Diego A. Mundo" . "dieggsy@pm.me") (:keywords "matching" "tools" "string") (:url . "http://github.com/dieggsy/difflib.el"))]) @@ -949,7 +949,7 @@ (direx-grep . [(20140515 1506) ((direx (0 1 -3))) "Grep node of direx.el using incremental search like anything.el/helm.el" single ((:commit . "1109a512a80b2673a70b18b8568514049017faad") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/direx-grep"))]) (dirtree . [(20140129 832) ((tree-mode (1 1 1 1)) (windata (0))) "Directory tree views" single ((:commit . "ba55f1e716e386fdd37cb8e7f48616e405dc7251") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com"))]) (dirtree-prosjekt . [(20140129 904) ((prosjekt (0 3)) (dirtree (0 1))) "dirtree integration for prosjekt." single ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))]) - (dirvish . [(20220420 1321) ((emacs (27 1))) "A modern file manager based on dired mode" tar ((:commit . "7a0e47365482700bce2884790c2970b493776838") (:authors ("Alex Lu ")) (:maintainer "Alex Lu ") (:keywords "files" "convenience") (:url . "https://github.com/alexluigit/dirvish"))]) + (dirvish . [(20220422 330) ((emacs (27 1))) "A modern file manager based on dired mode" tar ((:commit . "a7f3759a2dd5333e0bd8def3a73fb9b681b77374") (:authors ("Alex Lu ")) (:maintainer "Alex Lu ") (:keywords "files" "convenience") (:url . "https://github.com/alexluigit/dirvish"))]) (disable-mouse . [(20210512 2114) ((emacs (24 1))) "Disable mouse commands globally" single ((:commit . "cae3be9dd012727b40ad3b511731191f79cebe42") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "mouse") (:url . "https://github.com/purcell/disable-mouse"))]) (disaster . [(20171016 2152) nil "Disassemble C/C++ code under cursor in Emacs" single ((:commit . "10a785facc60d89d78e0d5177985ab1af1741bb4") (:authors ("Justine Tunney" . "jtunney@gmail.com")) (:maintainer "Justine Tunney" . "jtunney@gmail.com") (:keywords "tools") (:url . "https://github.com/jart/disaster"))]) (discourse . [(20160911 819) ((cl-lib (0 5)) (request (0 2)) (s (1 11 0))) "discourse api" single ((:commit . "a86c7e608851e186fe12e892a573994f08c8e65e") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "discourse") (:url . "https://github.com/lujun9972/discourse-api"))]) @@ -1036,7 +1036,7 @@ (dumb-diff . [(20171211 2122) ((emacs (24 3))) "fast arbitrary diffs" single ((:commit . "1a2331d283049b71a07c1b06b1e0627a950d55f4") (:authors ("jack angers")) (:maintainer "jack angers") (:keywords "programming" "diff"))]) (dumb-jump . [(20211018 1545) ((emacs (24 3)) (s (1 11 0)) (dash (2 9 0)) (popup (0 5 3))) "Jump to definition for 50+ languages without configuration" single ((:commit . "dbb915441a2b66f2fbb954ff5de2723c5a4771d4") (:authors ("jack angers and contributors")) (:maintainer "jack angers and contributors") (:keywords "programming") (:url . "https://github.com/jacktasia/dumb-jump"))]) (dummyparens . [(20141009 1024) nil "parenthesis auto-pairing and wrapping" single ((:commit . "9798ef1d0eaa24e4fe66f8aa6022a8c62714cc89") (:authors ("Sergei Nosov ")) (:maintainer "Sergei Nosov ") (:keywords "dummyparens" "auto-pair" "wrapping") (:url . "https://github.com/snosov1/dummyparens"))]) - (dune . [(20210909 1010) nil "Integration with the dune build system" tar ((:commit . "e9cb2d66abb690b7a5585d293793a7e020762e00") (:url . "https://github.com/ocaml/dune"))]) + (dune . [(20210909 1010) nil "Integration with the dune build system" tar ((:commit . "c63c9898e651e5505f965c3a48dd4089b8d88d9a") (:url . "https://github.com/ocaml/dune"))]) (dune-format . [(20210505 108) ((reformatter (0 6)) (emacs (24 1))) "Reformat OCaml's dune files automatically" single ((:commit . "196f16a01f4c855de7becddbc4cfed2f6788693a") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/emacs-dune-format"))]) (duplicate-thing . [(20181031 1500) nil "Duplicate current line & selection" single ((:commit . "9d8fd05e3e5caa35d3f2a0c0032c92f0c0908e21") (:authors ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "convenience" "command" "duplicate" "line" "selection") (:url . "https://github.com/ongaeshi/duplicate-thing"))]) (dut-mode . [(20170729 2111) ((emacs (24))) "Major mode for the Dut programming language" single ((:commit . "9235c7acaa6690942e9de8b7acd1e4be0c859dc1") (:authors ("The dut-mode Authors")) (:maintainer "The dut-mode Authors") (:keywords "languages" "gut") (:url . "https://github.com/dut-lang/dut-mode"))]) @@ -1232,7 +1232,7 @@ (embrace . [(20171031 1833) ((cl-lib (0 5)) (expand-region (0 10 0))) "Add/Change/Delete pairs based on `expand-region'" single ((:commit . "dd5da196e5bcc5e6d87e1937eca0c21da4334ef2") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) (emidje . [(20190209 1726) ((emacs (25)) (cider (0 17 0)) (seq (2 16)) (magit-popup (2 4 0))) "Test runner and report viewer for Midje" single ((:commit . "7e92f053964d925c97dc8cca8d4d70a3030021db") (:authors ("Alan Ghelardi" . "alan.ghelardi@nubank.com.br")) (:maintainer "Alan Ghelardi" . "alan.ghelardi@nubank.com.br") (:keywords "tools") (:url . "https://github.com/nubank/emidje"))]) (emmet-mode . [(20210820 1124) nil "Unofficial Emmet's support for emacs" single ((:commit . "6b2e554f7fd27f732810f4b14ea01e3c54b7b3da") (:authors ("Shin Aoyama" . "smihica@gmail.com")) (:maintainer "Shin Aoyama" . "smihica@gmail.com") (:keywords "convenience") (:url . "https://github.com/smihica/emmet-mode"))]) - (emms . [(20220315 1727) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) "The Emacs Multimedia System" tar ((:commit . "dd1ee74db3325d6a27e14df7ae882b5cbd84989a") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:url . "https://www.gnu.org/software/emms/"))]) + (emms . [(20220422 1318) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) "The Emacs Multimedia System" tar ((:commit . "22f3d9e5359c565b33f55715f90fbde35e4f675e") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:url . "https://www.gnu.org/software/emms/"))]) (emms-bilibili . [(20180103 418) ((emacs (25)) (cl-lib (0 5))) "Play Bilibili in EMMS." single ((:commit . "294bca3dfc42fe3a55fb326ab39bc0fcfc8c5090") (:keywords "emms" "bilibili") (:url . "https://github.com/stardiviner/emms-bilibili"))]) (emms-info-mediainfo . [(20131223 1300) ((emms (0))) "Info-method for EMMS using medianfo" single ((:commit . "bce16eae9eacd38719fea62a9755225a888da59d") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org") (:keywords "multimedia" "processes"))]) (emms-mark-ext . [(20130529 327) ((emms (3 0))) "Extra functions for emms-mark-mode and emms-tag-edit-mode" single ((:commit . "ec68129e3e9e469e5bf160c6a1b7030e322f3541") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "convenience" "multimedia") (:url . "https://github.com/vapniks/emms-mark-ext"))]) @@ -1294,7 +1294,7 @@ (ergoemacs-mode . [(20220411 338) ((emacs (24 1)) (cl-lib (0 5))) "Emacs mode based on common modern interface and ergonomics." tar ((:commit . "9cd89eef490f6c9f4af273bb3dd2c68d5ed2de61") (:authors ("Xah Lee" . "xah@xahlee.org") ("David Capello" . "davidcapello@gmail.com") ("Matthew L. Fidler" . "matthew.fidler@gmail.com") ("Kim F. Storm" . "storm@cua.dk")) (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com") (:keywords "convenience") (:url . "https://github.com/ergoemacs/ergoemacs-mode"))]) (ergoemacs-status . [(20160318 538) ((powerline (2 3)) (mode-icons (0 1 0))) "Adaptive Status Bar / Mode Line" single ((:commit . "d952cc2361adf6eb4d6af60950ad4ab699c81320") (:authors ("Matthew Fidler")) (:maintainer "Matthew Fidler"))]) (eri . [(20200914 644) nil "Enhanced relative indentation (eri)" single ((:commit . "505464961f07f0991263708fd8cbf5f7ad12f53f") (:url . "https://github.com/agda/agda"))]) - (erlang . [(20220215 1844) ((emacs (24 1))) "Erlang major mode" tar ((:commit . "a06b5233c254003e19544c1f5f5d00802884eb0d") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "erlang" "languages" "processes"))]) + (erlang . [(20220215 1844) ((emacs (24 1))) "Erlang major mode" tar ((:commit . "a7b98023a770dae237c6733ef4b287f29615f6bb") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "erlang" "languages" "processes"))]) (erlstack-mode . [(20210419 1917) ((emacs (25 1)) (dash (2 12 0))) "Minor mode for analysing Erlang stacktraces" single ((:commit . "ca264bca24cdaa8b2bac57882716f03f633e42b0") (:authors ("k32")) (:maintainer "k32") (:keywords "tools" "erlang") (:url . "https://github.com/k32/erlstack-mode"))]) (eros . [(20180415 618) ((emacs (24 4))) "Evaluation Result OverlayS for Emacs Lisp" single ((:commit . "dd8910279226259e100dab798b073a52f9b4233a") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "convenience" "lisp") (:url . "https://github.com/xiongtx/eros"))]) (ert-async . [(20200105 1031) ((emacs (24 1))) "Async support for ERT" single ((:commit . "948cf2faa10e085bda3739034ca5ea1912893433") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "lisp" "test") (:url . "http://github.com/rejeep/ert-async.el"))]) @@ -1419,7 +1419,7 @@ (evil-surround . [(20220412 1724) ((evil (1 2 12))) "emulate surround.vim from Vim" single ((:commit . "2bc8aa6425f1311e985cf51ea6b5233c1ee6ce1c") (:authors ("Tim Harper ") ("Vegard Øye ")) (:maintainer "Tim Harper ") (:keywords "emulation" "vi" "evil"))]) (evil-swap-keys . [(20191105 1426) ((emacs (24 4))) "Intelligently swap keys on text input with evil" single ((:commit . "b5ef105499f998b5667da40da30c073229a213ea") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "data" "languages" "tools") (:url . "https://github.com/wbolster/evil-swap-keys"))]) (evil-tabs . [(20160217 1520) ((evil (0 0 0)) (elscreen (0 0 0))) "Integrating Vim-style tabs for Evil mode users." single ((:commit . "53d3314a810017b6056ab6796aef671f5ea1c063") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:keywords "evil" "tab" "tabs" "vim") (:url . "https://github.com/krisajenkins/evil-tabs"))]) - (evil-terminal-cursor-changer . [(20211225 600) ((evil (1 0 8))) "Change cursor shape and color by evil state in terminal" single ((:commit . "3d7db4d6b4a3121ffd7e505b12ea94fcdb8c5df8") (:authors ("7696122")) (:maintainer "7696122") (:keywords "evil" "terminal" "cursor") (:url . "https://github.com/7696122/evil-terminal-cursor-changer"))]) + (evil-terminal-cursor-changer . [(20220422 255) ((evil (1 0 8))) "Change cursor shape and color by evil state in terminal" single ((:commit . "69d562932f9ab9869ab1ed923e9789cbfa0ff14c") (:authors ("7696122")) (:maintainer "7696122") (:keywords "evil" "terminal" "cursor") (:url . "https://github.com/7696122/evil-terminal-cursor-changer"))]) (evil-test-helpers . [(20201008 1515) ((evil (1 14 0))) "unit test helpers for Evil" single ((:commit . "6fa371222f5d56cf96103aa301da8bcbf6c15cc2") (:authors ("Vegard Øye ")) (:maintainer "Vegard Øye "))]) (evil-tex . [(20220415 842) ((emacs (26 1)) (evil (1 0)) (auctex (11 88))) "Useful features for editing LaTeX in evil-mode" single ((:commit . "26035ec9a09f8b38ce0d495ff788e83ec8b195d5") (:keywords "tex" "emulation" "vi" "evil" "wp") (:url . "https://github.com/iyefrat/evil-tex"))]) (evil-text-object-python . [(20191010 1328) ((emacs (25)) (evil (1 2 14)) (dash (2 16 0))) "Python specific evil text objects" single ((:commit . "39d22fc524f0413763f291267eaab7f4e7984318") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/wbolster/evil-text-object-python"))]) @@ -2066,7 +2066,7 @@ (hcl-mode . [(20200315 2129) ((emacs (24 3))) "Major mode for Hashicorp" single ((:commit . "e4d9eef631e8a386341ae8f94f7c2579586e65b5") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/emacs-hcl-mode"))]) (headlong . [(20150417 1526) nil "reckless completion" single ((:commit . "f6830f87f236eee88263cb6976125f72422abe72") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "completion") (:url . "https://github.com/abo-abo/headlong"))]) (heaven-and-hell . [(20190713 1830) ((emacs (24 4))) "easy toggle light/dark themes" single ((:commit . "e1febfd60d060c110a1e43c5f093cd8537251308") (:authors ("Valentin Ignatev" . "valentignatev@gmail.com")) (:maintainer "Valentin Ignatev" . "valentignatev@gmail.com") (:keywords "faces") (:url . "https://github.com/valignatev/heaven-and-hell"))]) - (helm . [(20220421 806) ((helm-core (3 8 4)) (popup (0 5 3))) "Helm is an Emacs incremental and narrowing framework" tar ((:commit . "24cc8959fbcab17fb5ce1e71ead8fd30950014bb") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))]) + (helm . [(20220421 806) ((helm-core (3 8 4)) (popup (0 5 3))) "Helm is an Emacs incremental and narrowing framework" tar ((:commit . "7ff0b93b79117babeb5262b2f0754005b6d050ad") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))]) (helm-R . [(20120820 14) ((helm (20120517)) (ess (20120509))) "helm-sources and some utilities for GNU R." single ((:commit . "b0eb9d5f6a483a9dbe6eb6cf1f2024d4f5938bc2") (:authors ("myuhe ")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/helm-R.el"))]) (helm-ack . [(20141030 1226) ((helm (1 0)) (cl-lib (0 5))) "Ack command with helm interface" single ((:commit . "889bc225318d14c6e3be80e73b1d9d6fb30e48c3") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-ack"))]) (helm-ad . [(20151209 1015) ((dash (2 8 0)) (helm (1 6 2))) "helm source for Active Directory" single ((:commit . "8ac044705d8620ee354a9cfa8cc1b865e83c0d55") (:authors ("Takahiro Noda" . "takahiro.noda+github@gmail.com")) (:maintainer "Takahiro Noda" . "takahiro.noda+github@gmail.com") (:keywords "comm"))]) @@ -2101,7 +2101,7 @@ (helm-codesearch . [(20190412 1153) ((emacs (25 1)) (s (1 11 0)) (dash (2 12 0)) (helm (1 7 7)) (cl-lib (0 5))) "helm interface for codesearch" single ((:commit . "72f1d1de746115ab7e861178b49fa3c0b6b58d90") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com") (:keywords "tools"))]) (helm-commandlinefu . [(20150611 545) ((emacs (24 1)) (helm (1 7 0)) (json (1 3)) (let-alist (1 0 3))) "Search and browse commandlinefu.com from helm" single ((:commit . "9ee7e018c5db23ae9c8d1c8fa969876f15b7280d") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "commandlinefu.com") (:url . "https://github.com/xuchunyang/helm-commandlinefu"))]) (helm-company . [(20190812 1429) ((helm (1 5 9)) (company (0 6 13))) "Helm interface for company-mode" single ((:commit . "6eb5c2d730a60e394e005b47c1db018697094dde") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Daniel Ralston" . "Sodel-the-Vociferous@users.noreply.github.com") (:url . "https://github.com/Sodel-the-Vociferous/helm-company"))]) - (helm-core . [(20220421 733) ((emacs (25 1)) (async (1 9 4))) "Development files for Helm" tar ((:commit . "24cc8959fbcab17fb5ce1e71ead8fd30950014bb") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))]) + (helm-core . [(20220422 706) ((emacs (25 1)) (async (1 9 4))) "Development files for Helm" tar ((:commit . "7ff0b93b79117babeb5262b2f0754005b6d050ad") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))]) (helm-cscope . [(20190615 41) ((xcscope (1 0)) (helm (1 6 7)) (cl-lib (0 5)) (emacs (24 1))) "Helm interface for xcscope.el." single ((:commit . "af1d9e7f4460a88d7400b5a74d5da68084089ac1") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com") (:keywords "cscope" "helm") (:url . "https://github.com/alpha22jp/helm-cscope.el"))]) (helm-css-scss . [(20191230 1549) ((emacs (24 3)) (helm (1 0))) "CSS/SCSS/LESS Selectors with helm interface" single ((:commit . "48b996f73af1fef8d6e88a1c545d98f8c50b0cf3") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "convenience" "scss" "css" "less" "selector" "helm") (:url . "https://github.com/ShingoFukuyama/helm-css-scss"))]) (helm-ctest . [(20191031 1435) ((s (1 9 0)) (dash (2 11 0)) (helm-core (1 7 4))) "Run ctest from within emacs" single ((:commit . "2a29cfb4ec583da247fa2ae7bac88790b1223e40") (:authors ("Dan LaManna" . "me@danlamanna.com")) (:maintainer "Dan LaManna" . "me@danlamanna.com") (:keywords "helm" "ctest"))]) @@ -2303,7 +2303,7 @@ (hl-block-mode . [(20220211 548) ((emacs (26 1))) "Highlighting nested blocks" single ((:commit . "3dd29cfbf24fec16eaf3d47936338adb6b34f5c8") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-hl-block-mode"))]) (hl-fill-column . [(20200607 757) ((names (0 5)) (emacs (24))) "Highlight fill column." single ((:commit . "5782a91ba0182c4e562fa0db6379ff9dd472856b") (:keywords "fill column" "faces") (:url . "https://github.com/laishulu/hl-fill-column"))]) (hl-indent . [(20170429 2104) ((emacs (24)) (cl-lib (0 5))) "Highlight irregular indentation." single ((:commit . "bdb2e0177a7c8b29af26998e688b856adc6ded93") (:authors ("Kirill Ignatiev ")) (:maintainer "Kirill Ignatiev ") (:keywords "convenience" "faces") (:url . "https://github.com/ikirill/hl-indent"))]) - (hl-prog-extra . [(20220324 16) ((emacs (26 2))) "Customizable highlighting for source-code" tar ((:commit . "3312497ddfc7b7bc0e773ae98fc02477a4b0c7a0") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-hl-prog-extra"))]) + (hl-prog-extra . [(20220422 541) ((emacs (26 2))) "Customizable highlighting for source-code" tar ((:commit . "40905568a040c1050941275cc9b970a45b77eb90") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-hl-prog-extra"))]) (hl-sentence . [(20171018 1519) nil "highlight a sentence based on customizable face" single ((:commit . "86ae38d3103bd20da5485cbdd59dfbd396c45ee4") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "highlighting") (:url . "http://github.com/milkypostman/hl-sentence"))]) (hl-todo . [(20220419 1930) ((emacs (25))) "highlight TODO and similar keywords" single ((:commit . "d2f7a9b261a52e3c04c8d677165136a306f0aed3") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/hl-todo"))]) (hledger-mode . [(20210706 1225) ((emacs (24 4)) (popup (0 5 3)) (async (1 9)) (htmlize (1 47))) "A mode for writing journal entries for hledger." tar ((:commit . "9ac07ff0adbce6a402c17e789b1750f9da0d22f4") (:authors ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainer "Narendra Joshi" . "narendraj9@gmail.com") (:keywords "data") (:url . "https://github.com/narendraj9/hledger-mode.git"))]) @@ -2633,7 +2633,7 @@ (kanban . [(20170418 810) nil "Parse org-todo headlines to use org-tables as Kanban tables" single ((:commit . "fcf0173ce0144e59de97ba8a7808192620e5f8f4") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de") (:keywords "outlines" "convenience"))]) (kanji-mode . [(20160826 1139) nil "View stroke order for kanji characters at cursor" tar ((:commit . "eda4f8666486689d36317db7dbda54fb73d3e3d2") (:authors ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainer "Wojciech Gac" . "wojciech.s.gac@gmail.com") (:url . "http://github.com/wsgac/kanji-mode "))]) (kaocha-runner . [(20190904 1950) ((emacs (26)) (s (1 4 0)) (cider (0 21 0)) (parseedn (0 1 0))) "A package for running Kaocha tests via CIDER." single ((:commit . "755b0dfb3bd676c769c4b4aeb81c2cd5828bd207") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:url . "https://github.com/magnars/kaocha-runner.el"))]) - (kaolin-themes . [(20220413 1705) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:commit . "bd37ae6e48d918e9d72513345903093239a8ad8d") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:url . "https://github.com/ogdenwebb/emacs-kaolin-themes"))]) + (kaolin-themes . [(20220422 1305) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:commit . "51b1f719bc300a4f684b6dc7511dfb044f75f575") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:url . "https://github.com/ogdenwebb/emacs-kaolin-themes"))]) (kaomoji . [(20171227 440) ((emacs (24 3)) (helm-core (1 9 1))) "Input kaomoji superb easily" tar ((:commit . "90a1490743b2a30762f5454c9d9309018eff83dd") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:keywords "tools" "fun") (:url . "https://github.com/kuanyui/kaomoji.el"))]) (kapacitor . [(20190414 1908) ((emacs (25 1)) (magit (2 13 0)) (magit-popup (2 12 4))) "Main file for kapacitor-mode" single ((:commit . "e3300d8b4017a2f66b0d929cb85bcc7ee2612072") (:authors ("Manoj Kumar Manikchand" . "manojm.321@gmail.com")) (:maintainer "Manoj Kumar Manikchand" . "manojm.321@gmail.com") (:keywords "kapacitor" "emacs" "magit" "tools") (:url . "http://github.com/Manoj321/kapacitor-el"))]) (karma . [(20160220 1245) ((pkg-info (0 4)) (emacs (24))) "Karma Test Runner Emacs Integration" single ((:commit . "31d3e7708246183d7ed0686be92bf23140af348c") (:authors ("Samuel Tonini")) (:maintainer "Samuel Tonini") (:keywords "language" "javascript" "js" "karma" "testing") (:url . "http://github.com/tonini/karma.el"))]) @@ -2857,7 +2857,7 @@ (lsp-latex . [(20210815 1426) ((emacs (25 1)) (lsp-mode (6 0))) "LSP-mode client for LaTeX, on texlab" single ((:commit . "3f6b2ac9585682828eef81f895757f74cfba7309") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "languages" "tex") (:url . "https://github.com/ROCKTAKEY/lsp-latex"))]) (lsp-ltex . [(20220222 656) ((emacs (26 1)) (lsp-mode (6 1))) "LSP Clients for LTEX" single ((:commit . "e13bedf0032d376e1e28026abda5970bbbdb636d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-languagetool/lsp-ltex"))]) (lsp-metals . [(20220330 1958) ((emacs (26 1)) (scala-mode (1 1)) (lsp-mode (7 0)) (lsp-treemacs (0 2)) (dap-mode (0 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5))) "Scala Client settings" tar ((:commit . "b7f77de69431786c54e9a57845e4f2d75fbee053") (:authors ("Ross A. Baker" . "ross@rossabaker.com") ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainer "Ross A. Baker" . "ross@rossabaker.com") (:keywords "languages" "extensions") (:url . "https://github.com/emacs-lsp/lsp-metals"))]) - (lsp-mode . [(20220421 1428) ((emacs (26 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0))) "LSP mode" tar ((:commit . "d230fd1170ead71276bd5b7a2fc5072fea8fc933") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-mode"))]) + (lsp-mode . [(20220421 1428) ((emacs (26 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0))) "LSP mode" tar ((:commit . "624e9f33876f36f1a4c3d1525a0ae4b36d295fcb") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-mode"))]) (lsp-mssql . [(20191204 1150) ((emacs (25 1)) (lsp-mode (6 2)) (dash (2 14 1)) (f (0 20 0)) (ht (2 0)) (lsp-treemacs (0 1))) "MSSQL LSP bindings" tar ((:commit . "88319a61a06e27fc1d3ea2e7b853ec1692b4c166") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "data" "languages") (:url . "https://github.com/emacs-lsp/lsp-mssql"))]) (lsp-origami . [(20211016 1045) ((origami (1 0)) (lsp-mode (6 1))) "origami.el support for lsp-mode" single ((:commit . "5b88ab77dc2696c93fa5dd9debe183821c533b71") (:authors ("Vibhav Pant")) (:maintainer "Vibhav Pant") (:keywords "languages" "lsp-mode") (:url . "https://github.com/emacs-lsp/lsp-origami"))]) (lsp-p4 . [(20190127 1049) ((lsp-mode (3 0))) "P4 support for lsp-mode" tar ((:commit . "669460d93b87fb876df11b2b68229677e7ad1a26") (:authors ("Dmitri Makarov")) (:maintainer "Dmitri Makarov") (:keywords "lsp" "p4") (:url . "https://github.com/dmakarov/p4ls"))]) @@ -2892,11 +2892,11 @@ (mag-menu . [(20150505 1850) ((splitter (0 1 0))) "Intuitive keyboard-centric menu system" single ((:commit . "9b9277021cd09fb1dba64b1d2a00705d20914bd6") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:keywords "convenience") (:url . "https://github.com/chumpage/mag-menu"))]) (magic-filetype . [(20180219 1552) ((emacs (24)) (s (1 9 0))) "Enhance filetype major mode" single ((:commit . "019494add5ff02dd36cb3f500142fc51125522cc") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "emulations" "vim" "ft" "file" "magic-mode") (:url . "https://github.com/zonuexe/magic-filetype.el"))]) (magic-latex-buffer . [(20210306 422) ((cl-lib (0 5)) (emacs (25 1))) "Magically enhance LaTeX-mode font-locking for semi-WYSIWYG editing" single ((:commit . "903ec91872760e47c0e5715795f8465173615098") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.github.io/"))]) - (magik-mode . [(20220408 1250) nil "mode for editing Magik + some utils." tar ((:commit . "9c0faba222afc875cf604dd7fe4265f1ff891535") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))]) + (magik-mode . [(20220422 837) nil "mode for editing Magik + some utils." tar ((:commit . "af1b83786c95d448dcb4df5406eb1cdba975abf5") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))]) (magit . [(20220412 2029) ((emacs (25 1)) (dash (20210826)) (git-commit (20220222)) (magit-section (20220325)) (transient (20220325)) (with-editor (20220318))) "A Git porcelain inside Emacs." tar ((:commit . "3cfc8458e14c705afdfbeb7dcd3d3f43d7479344") (:authors ("Marius Vollmer" . "marius.vollmer@gmail.com") ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/magit"))]) (magit-annex . [(20220302 1725) ((cl-lib (0 3)) (magit (3 0 0))) "Control git-annex from Magit" single ((:commit . "efe484644666c6b7c544b0fb7b87e30703fa9425") (:authors ("Kyle Meyer" . "kyle@kyleam.com") ("Rémi Vanicat" . "vanicat@debian.org")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-annex"))]) (magit-circleci . [(20191209 2113) ((dash (2 16 0)) (transient (0 1 0)) (magit (2 90 0)) (emacs (25 3))) "CircleCI integration for Magit" single ((:commit . "2d4bdacf498ed3ff7d2c3574d346b2d24cbb12da") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "circleci" "continuous" "integration" "magit" "vc" "tools") (:url . "https://github.com/abrochard/magit-circleci"))]) - (magit-commit-mark . [(20220422 10) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" single ((:commit . "f794b45efcbbaab28d968b3616900dd4370ea030") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-magit-commit-mark"))]) + (magit-commit-mark . [(20220422 705) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" single ((:commit . "2a4d08ac816734fc8195f86f685443e58e63da06") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-magit-commit-mark"))]) (magit-delta . [(20220125 50) ((emacs (25 1)) (magit (20200426)) (xterm-color (2 0))) "Use Delta when displaying diffs in Magit" single ((:commit . "5fc7dbddcfacfe46d3fd876172ad02a9ab6ac616") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com") (:url . "https://github.com/dandavison/magit-delta"))]) (magit-diff-flycheck . [(20190524 551) ((magit (2)) (flycheck (31)) (seq (2)) (emacs (25 1))) "Report errors in diffs" single ((:commit . "28acf74f59e385865746cccf4b1e4c4025ae9433") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com") (:keywords "convenience" "matching") (:url . "https://github.com/ragone/magit-diff-flycheck"))]) (magit-filenotify . [(20151116 2340) ((magit (1 3 0)) (emacs (24 4))) "Refresh status buffer when git tree changes" single ((:commit . "c0865b3c41af20b6cd89de23d3b0beb54c8401a4") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.de") (:keywords "tools"))]) @@ -3059,7 +3059,7 @@ (modern-sh . [(20211101 1001) ((emacs (25 1)) (hydra (0 15 0)) (eval-in-repl (0 9 7))) "Minor mode for editing shell script" single ((:commit . "8ebebe77304aa8170f7af809e7564c79d3bd45da") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/modern-sh"))]) (modtime-skip-mode . [(20140128 2201) nil "Minor mode for disabling modtime and supersession checks on files." single ((:commit . "c0e49523aa26b2263a8693691ac775988015f592") (:authors ("Jordon Biondo" . "biondoj@mail.gvsu.edu")) (:maintainer "Jordon Biondo" . "biondoj@mail.gvsu.edu") (:url . "http://www.github.com/jordonbiondo/modtime-skip-mode"))]) (modular-config . [(20210726 1614) ((emacs (25 1))) "Organize your config into small and loadable modules" single ((:commit . "2bd77193fa3a7ec0541db284b4034821a8f59fea") (:authors ("Sidharth Arya" . "sidhartharya10@gmail.com")) (:maintainer "Sidharth Arya" . "sidhartharya10@gmail.com") (:keywords "startup" "lisp" "tools") (:url . "https://github.com/SidharthArya/modular-config.el"))]) - (modus-themes . [(20220421 1021) ((emacs (27 1))) "Elegant, highly legible and customizable themes" tar ((:commit . "e8f1b8997466e244d9aa1a11b7ffaa4b70419874") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:keywords "faces" "theme" "accessibility") (:url . "https://git.sr.ht/~protesilaos/modus-themes"))]) + (modus-themes . [(20220422 552) ((emacs (27 1))) "Elegant, highly legible and customizable themes" tar ((:commit . "a1752787db94b398a9f120c5f5e24fdf0c82e77b") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:keywords "faces" "theme" "accessibility") (:url . "https://git.sr.ht/~protesilaos/modus-themes"))]) (moe-theme . [(20220111 1220) nil "A colorful eye-candy theme. Moe, moe, kyun!" tar ((:commit . "edf3fe47fb986e283e3b04cba443dcb39fe8720e") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com") (:keywords "themes") (:url . "https://github.com/kuanyui/moe-theme.el"))]) (molar-mass . [(20210519 1342) ((emacs (24 3))) "Calculates molar mass of a molecule" single ((:commit . "838db1486a2dc5a3774eb195d62fbcdef71a63f7") (:authors ("Sergi Ruiz Trepat")) (:maintainer "Sergi Ruiz Trepat") (:keywords "convenience" "chemistry") (:url . "https://github.com/sergiruiztrepat/molar-mass.el"))]) (molecule . [(20180527 743) ((emacs (25 1))) "Simple wrapper for molecule" single ((:commit . "2ef72b81d9aa24ea782b71a061a3abdad6cae162") (:authors (": drymer ")) (:maintainer ": drymer ") (:keywords ":" "languages" "terminals") (:url . "https://git.daemons.it/drymer/molecule.el"))]) @@ -3204,7 +3204,7 @@ (nix-buffer . [(20180212 1518) ((f (0 17 3)) (emacs (24 4))) "Set up buffer environments with nix" single ((:commit . "db57cda36e7477bdc7ef5a136357b971b1d4d099") (:authors ("Shea Levy")) (:maintainer "Shea Levy") (:url . "https://github.com/shlevy/nix-buffer/tree/master/"))]) (nix-env-install . [(20200812 1305) ((emacs (25 1))) "Install packages using nix-env" single ((:commit . "79c34bc117ba1cebeb67fab32c364951d2ec37a0") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "processes" "tools") (:url . "https://github.com/akirak/nix-env-install"))]) (nix-haskell-mode . [(20190615 135) ((emacs (25)) (haskell-mode (16 0)) (nix-mode (1 3 0))) "haskell-mode integrations for Nix" single ((:commit . "68efbcbf949a706ecca6409506968ed2ef928a20") (:authors ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "haskell" "languages" "processes") (:url . "https://github.com/matthewbauer/nix-haskell"))]) - (nix-mode . [(20220228 1520) ((emacs (25 1)) (magit-section (0)) (transient (0 3))) "Major mode for editing .nix files" tar ((:commit . "20ee8d88900b169831d6b0783bd82d2625e940c7") (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "languages" "tools" "unix") (:url . "https://github.com/NixOS/nix-mode"))]) + (nix-mode . [(20220422 451) ((emacs (25 1)) (magit-section (0)) (transient (0 3))) "Major mode for editing .nix files" tar ((:commit . "66206cab276c0f4d1c84e77ba2a67ed6a46b2d9c") (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "languages" "tools" "unix") (:url . "https://github.com/NixOS/nix-mode"))]) (nix-modeline . [(20210405 742) ((emacs (25 1))) "Info about in-progress Nix evaluations on your modeline" single ((:commit . "ecda866b960321bb82deac26af45918e172ef0ba") (:authors ("Jordan Mulcahey" . "snhjordy@gmail.com")) (:maintainer "Jordan Mulcahey" . "snhjordy@gmail.com") (:keywords "processes" "unix" "tools") (:url . "https://github.com/ocelot-project/nix-modeline"))]) (nix-sandbox . [(20210325 1622) ((dash (2 12 1)) (s (1 10 0))) "Utility functions to work with nix-shell sandboxes" single ((:commit . "053a2d5110ce05b7f99bcc2ac4804b70cbe87916") (:authors ("Sven Keidel" . "svenkeidel@gmail.com")) (:maintainer "Sven Keidel" . "svenkeidel@gmail.com") (:url . "https://github.com/travisbhartwell/nix-emacs"))]) (nix-update . [(20190124 1935) ((emacs (25))) "Update \"fetch\" blocks in .nix expressions" single ((:commit . "fc6c39c2da3fcfa62f4796816c084a6389c8b6e7") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "nix") (:url . "https://github.com/jwiegley/nix-update-el"))]) @@ -3285,7 +3285,7 @@ (ob-dart . [(20170106 1624) nil "org-babel functions for Dart evaluation" single ((:commit . "04d63b922a5469506560ca0c00678e57131e0269") (:authors ("Milan Zimmermann")) (:maintainer "Milan Zimmermann") (:keywords "literate programming" "reproducible research" "emacs" "org" "babel" "dart") (:url . "http://github.org/mzimmerm/ob-dart"))]) (ob-deno . [(20201019 101) ((emacs (26 1))) "Babel Functions for Javascript/TypeScript with Deno" single ((:commit . "f1129d20fe9931f1c0b62c4af781f5489abd957f") (:authors ("HIGASHI Taiju")) (:maintainer "HIGASHI Taiju") (:keywords "literate programming" "reproducible research" "javascript" "typescript" "tools") (:url . "https://github.com/taiju/ob-deno"))]) (ob-diagrams . [(20160407 1237) nil "org-babel functions for diagrams evaluation" single ((:commit . "ed6649616325ca5b2d2109f74aded8bcb8aa5186") (:authors ("Daniel Bergey")) (:maintainer "Daniel Bergey") (:keywords "literate programming" "reproducible research") (:url . "http://orgmode.org"))]) - (ob-dsq . [(20220405 2219) ((emacs (27 1))) "Babel functions for the `dsq` CLI tool by Multiprocess Labs" single ((:commit . "37090235c064ba5a5e436b0b77b5442f606cf5b3") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "data" "tools") (:url . "https://github.com/fritzgrabo/ob-dsq"))]) + (ob-dsq . [(20220422 730) ((emacs (27 1))) "Babel functions for the `dsq` CLI tool by Multiprocess Labs" single ((:commit . "3dd955a2c5f7d7aecb10c4bcc4ef0c27f50a6376") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "data" "tools") (:url . "https://github.com/fritzgrabo/ob-dsq"))]) (ob-elixir . [(20170725 1419) ((org (8))) "org-babel functions for elixir evaluation" single ((:commit . "8990a8178b2f7bd93504a9ab136622aab6e82e32") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "elixir") (:url . "http://github.com/zweifisch/ob-elixir"))]) (ob-elm . [(20200528 1857) ((emacs (26 1)) (org (9 3))) "Org-babel functions for elm evaluation" single ((:commit . "d3a9fbc2f56416894c9aed65ea9a20cc1d98f15d") (:authors ("Bonface M. K.")) (:maintainer "Bonface M. K.") (:keywords "languages" "tools") (:url . "https://www.bonfacemunyoki.com"))]) (ob-elvish . [(20180427 1900) nil "org-babel functions for Elvish shell" single ((:commit . "369181ceae1190bf971c71aebf9fc6133bd98c39") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "literate programming" "elvish" "shell" "languages" "processes" "tools") (:url . "https://github.com/zzamboni/ob-elvish"))]) @@ -3398,7 +3398,7 @@ (org-caldav . [(20200510 2030) ((org (7))) "Sync org files with external calendar through CalDAV" single ((:commit . "8569941a0a5a9393ba51afc8923fd7b77b73fa7a") (:authors ("David Engster" . "deng@randomsample.de")) (:maintainer "David Engster" . "deng@randomsample.de") (:keywords "calendar" "caldav"))]) (org-capture-pop-frame . [(20160518 1008) ((emacs (24 4))) "Run org-capture in a new pop frame" single ((:commit . "b16fd712de62cf0d1f9befd03be6ab5983cb3301") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/org-capture-pop-frame.git"))]) (org-category-capture . [(20220114 730) ((org (9 0 0)) (emacs (24))) "Contextualy capture of org-mode TODOs." single ((:commit . "642b39c698db00bc535c1c2335f425fb9f4855a9") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org-mode" "todo" "tools" "outlines") (:url . "https://github.com/IvanMalison/org-projectile"))]) - (org-chef . [(20220412 1423) ((org (0)) (emacs (24))) "Cookbook and recipe management with org-mode." tar ((:commit . "f244b33a5a42d2879b9a6f4fcfeedcefb3326b94") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:url . "https://github.com/Chobbes/org-chef"))]) + (org-chef . [(20220422 300) ((org (0)) (emacs (24))) "Cookbook and recipe management with org-mode." tar ((:commit . "6a786e77e67a715b3cd4f5128b59d501614928af") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:url . "https://github.com/Chobbes/org-chef"))]) (org-cliplink . [(20201126 1020) ((emacs (24 4))) "insert org-mode links from the clipboard" tar ((:commit . "13e0940b65d22bec34e2de4bc8cba1412a7abfbc") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/org-cliplink"))]) (org-clock-convenience . [(20200705 1527) ((cl-lib (0 5)) (org (8)) (emacs (24 3))) "convenience functions for org time tracking" single ((:commit . "efc9773a8dedf834cf4a78fb6f5f8fffe55ef8eb") (:authors ("Derek Feichtinger ")) (:maintainer "Derek Feichtinger ") (:keywords "org") (:url . "https://github.com/dfeich/org-clock-convenience"))]) (org-clock-csv . [(20201222 1506) ((org (8 3)) (s (1 0))) "Export `org-mode' clock entries to CSV format." single ((:commit . "af94b58c2e179a5bcc938f339e93de0eee3da99c") (:authors ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainer "Aaron Jacobs" . "atheriel@gmail.com") (:keywords "calendar" "data" "org") (:url . "https://github.com/atheriel/org-clock-csv"))]) @@ -3454,7 +3454,7 @@ (org-mind-map . [(20180826 2340) ((emacs (24)) (dash (1 8 0)) (org (8 2 10))) "Creates a directed graph from org-mode files" single ((:commit . "95347b2f9291f5c5eb6ebac8e726c03634c61de3") (:authors ("Ted Wiles" . "theodore.wiles@gmail.com")) (:maintainer "Ted Wiles" . "theodore.wiles@gmail.com") (:keywords "orgmode" "extensions" "graphviz" "dot") (:url . "https://github.com/theodorewiles/org-mind-map"))]) (org-ml . [(20211231 700) ((emacs (26 1)) (org (9 3)) (dash (2 17)) (s (1 12))) "Functional Org Mode API" tar ((:commit . "3974435bbf72722801f7ed78855381d77a773162") (:authors ("Nathan Dwarshuis" . "ndwar@yavin4.ch")) (:maintainer "Nathan Dwarshuis" . "ndwar@yavin4.ch") (:keywords "org-mode" "outlines") (:url . "https://github.com/ndwarshuis/org-ml"))]) (org-mobile-sync . [(20180606 524) ((emacs (24 3 50)) (org (8 0))) "automatically sync org-mobile on changes" single ((:commit . "06764b943a528827df1e2acc6bc7806cc2c1351f") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "org-mode" "org" "mobile" "sync" "todo") (:url . "https://framagit.org/steckerhalter/org-mobile-sync"))]) - (org-modern . [(20220420 1400) ((emacs (27 1))) "Modern looks for Org" single ((:commit . "42cb064f9d31adaf00168f18072cec0206b9737c") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/org-modern"))]) + (org-modern . [(20220422 940) ((emacs (27 1))) "Modern looks for Org" single ((:commit . "ff1046705b3950b7a49da50bc34c11da86c6226d") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/org-modern"))]) (org-movies . [(20210920 101) ((emacs (26 1)) (org (9 0)) (request (0 3 0))) "Manage watchlist with Org mode" single ((:commit . "e96fecaffa2924de64a507aa31d2934e667ee1ea") (:authors ("Anh T Nguyen")) (:maintainer "Anh T Nguyen") (:keywords "hypermedia" "outlines" "org") (:url . "https://github.com/teeann/org-movies"))]) (org-mru-clock . [(20211029 1147) ((emacs (26 1))) "Clock in/out of tasks with completion and persistent history" single ((:commit . "a74322f0cfd6e52151f9bb8d4f90833330f69120") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "calendar") (:url . "https://github.com/unhammer/org-mru-clock"))]) (org-msg . [(20220331 1707) ((emacs (24 4)) (htmlize (1 54))) "Org mode to send and reply to email in HTML." single ((:commit . "60e22e446325a9b3387396459d98be7c1c52579d") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:keywords "extensions" "mail") (:url . "https://github.com/jeremy-compostella/org-msg"))]) @@ -3683,8 +3683,8 @@ (parse-it . [(20220214 1531) ((emacs (25 1)) (s (1 12 0))) "Basic Parser in Emacs Lisp" tar ((:commit . "41af4e77ff9b3abf98fb52302a418b638be88f7c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/parse-it"))]) (parsebib . [(20220116 2336) ((emacs (25 1))) "A library for parsing bib files" single ((:commit . "63e85c8477fdf98ba920437c9df15f8f06c315e9") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "bibtex") (:url . "https://github.com/joostkremers/parsebib"))]) (parsec . [(20180730 16) ((emacs (24)) (cl-lib (0 5))) "Parser combinator library" single ((:commit . "2cbbbc2254aa7bcaa4fb5e07c8c1bf2f381dba26") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/parsec.el"))]) - (parseclj . [(20220328 558) ((emacs (25))) "Clojure/EDN parser" tar ((:commit . "b04eae67384c1d8181edf318fd62d422a8220724") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) - (parseedn . [(20220207 1352) ((emacs (26)) (parseclj (1 1 0)) (map (2))) "Clojure/EDN parser" single ((:commit . "ea7b5281ec80aca0bd1cc93a348aebb302497339") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) + (parseclj . [(20220422 936) ((emacs (25))) "Clojure/EDN parser" tar ((:commit . "4d0e780e00f1828b00c43099e6eebc6582998f72") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) + (parseedn . [(20220422 936) ((emacs (26)) (parseclj (1 1 0)) (map (2))) "Clojure/EDN parser" single ((:commit . "dce2eed418ad21acf3d2d6d75c37dfa679b22359") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) (pasp-mode . [(20180404 1700) ((emacs (24 3))) "- A major mode for editing Answer Set Programs." single ((:commit . "59385eb0e8ebcfc8c11dd811fb145d4b0fa3cc92") (:authors ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainer "Henrik Jürges" . "juerges.henrik@gmail.com") (:keywords "asp" "pasp" "answer set programs" "potassco answer set programs" "major mode" "languages") (:url . "https://github.com/santifa/pasp-mode"))]) (pass . [(20210203 810) ((emacs (25)) (password-store (2 1 0)) (password-store-otp (0 1 5)) (f (0 17))) "Major mode for password-store.el" single ((:commit . "5651da53137db9adcb125b4897c2fe27eeb4368d") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com") ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "password-store" "password" "keychain"))]) (passmm . [(20210109 8) ((emacs (24 4)) (password-store (0))) "A minor mode for pass (Password Store)." single ((:commit . "d78d1bf4f397180d2256248df589f33aafb4c8b4") (:authors ("Peter Jones" . "pjones@devalot.com")) (:maintainer "Peter Jones" . "pjones@devalot.com") (:url . "https://github.com/pjones/passmm"))]) @@ -3925,7 +3925,7 @@ (propfont-mixed . [(20150113 2211) ((emacs (24)) (cl-lib (0 5))) "Use proportional fonts with space-based indentation." single ((:commit . "0b461ef4754a469610dba71874a34b6da42176bf") (:authors ("Kirill Ignatiev ")) (:maintainer "Kirill Ignatiev ") (:keywords "faces") (:url . "https://github.com/ikirill/propfont-mixed"))]) (proportional . [(20200309 1556) ((emacs (25 1))) "use a proportional font everywhere" single ((:commit . "0e4537af7ba2bc9dbb449c38350bce012b382f51") (:authors ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:keywords "faces") (:url . "https://github.com/ksjogo/proportional"))]) (prosjekt . [(20151127 1416) ((dash (2 8 0))) "a software project tool for emacs" tar ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))]) - (protobuf-mode . [(20220303 1716) nil "major mode for editing protocol buffers." single ((:commit . "e81c678e7dfd43f75d4d68ba1df75ce168820f11") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com") (:keywords "google" "protobuf" "languages"))]) + (protobuf-mode . [(20220303 1716) nil "major mode for editing protocol buffers." single ((:commit . "bfc956bc3a03f22309173c1872db6ca67d2a161f") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com") (:keywords "google" "protobuf" "languages"))]) (protocols . [(20170802 1132) ((cl-lib (0 5))) "Protocol database access functions." single ((:commit . "d0f7c4acb05465f1a0d4be54363bbd2802647e77") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "net" "protocols") (:url . "https://github.com/davep/protocols.el"))]) (proxy-mode . [(20220210 1410) ((emacs (25))) "A minor mode to toggle proxy." single ((:commit . "620e48c6afaf760d0ee9f5bdf583fd91cd9d0ec6") (:keywords "comm" "proxy") (:url . "https://repo.or.cz/proxy-mode.git"))]) (psalm . [(20211002 1552) ((emacs (24 3)) (php-mode (1 22 3))) "Interface to Psalm" single ((:commit . "28d546a79cb865a78b94cd7e929d66d720505faa") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/psalm.el"))]) @@ -3965,7 +3965,7 @@ (pyenv-mode-auto . [(20180620 1252) ((pyenv-mode (0 1 0)) (s (1 11 0)) (f (0 17 0))) "Automatically activates pyenv version if .python-version file exists." single ((:commit . "347b94cd5ad22e33cc41be661c102d4548767858") (:authors ("Sviatoslav Bulbakha" . "mail@ssbb.me")) (:maintainer "Sviatoslav Bulbakha" . "mail@ssbb.me") (:keywords "python" "pyenv") (:url . "https://github.com/ssbb/pyenv-mode-auto"))]) (pygen . [(20161121 506) ((elpy (1 12 0)) (python-mode (6 2 2)) (dash (2 13 0))) "Python code generation using Elpy and Python-mode." single ((:commit . "9019ff44ba49d7295b1476530feab91fdadb084b") (:authors ("Jack Crawley ")) (:maintainer "Jack Crawley ") (:keywords "python" "code generation") (:url . "https://github.com/JackCrawley/pygen/"))]) (pygn-mode . [(20211021 2325) ((emacs (26 1)) (tree-sitter (0 15 2)) (tree-sitter-langs (0 10 7)) (uci-mode (0 5 4)) (nav-flash (1 0 0)) (ivy (0 10 0))) "Major-mode for chess PGN files, powered by Python" tar ((:commit . "eb1da7e3eb5f5754b60d404b0e341206eebe19ca") (:authors ("Dodge Coates and Roland Walker")) (:maintainer "Dodge Coates and Roland Walker") (:keywords "data" "games" "chess") (:url . "https://github.com/dwcoates/pygn-mode"))]) - (pyim . [(20220422 208) ((emacs (25 1)) (async (1 6)) (xr (1 13))) "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime." tar ((:commit . "63de15e13b8c3ad6be50b7cb6a5855a53a6d8739") (:authors ("Ye Wenbin" . "wenbinye@163.com") ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method") (:url . "https://github.com/tumashu/pyim"))]) + (pyim . [(20220422 936) ((emacs (25 1)) (async (1 6)) (xr (1 13))) "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime." tar ((:commit . "cd1bfd2bbc10fe0ac47d0ec383cde453f6019e6c") (:authors ("Ye Wenbin" . "wenbinye@163.com") ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method") (:url . "https://github.com/tumashu/pyim"))]) (pyim-basedict . [(20210517 43) nil "The default pinyin dict of pyim" tar ((:commit . "86f6de3e3a1523eb278bd3afe7c4ceba2a0e2972") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/tumashu/pyim-basedict"))]) (pyim-cangjiedict . [(20210617 934) ((pyim (3 7))) "Some cangjie dicts for pyim" tar ((:commit . "d17e3d32a6480939b350a91a915ebe8e6efad819") (:authors ("Yuanchen Xie" . "yuanchen.gm@gmail.com")) (:maintainer "Yuanchen Xie" . "yuanchen.gm@gmail.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/p1uxtar/pyim-cangjiedict"))]) (pyim-smzmdict . [(20210505 1445) ((pyim (3 7))) "Sanma(triple) Zhengma dict for pyim" tar ((:commit . "fcddbde17a04d174c7353548056524687f7be8d2") (:authors ("Yue Shi (Zhizhi)")) (:maintainer "Yuanchen Xie") (:keywords "convenience" "i18n" "pyim" "chinese" "zhengma") (:url . "https://github.com/p1uxtar/pyim-smzmdict"))]) @@ -3973,7 +3973,7 @@ (pyimport . [(20180308 1752) ((dash (2 8 0)) (s (1 9 0)) (shut-up (0 3 2))) "Manage Python imports!" single ((:commit . "a6f63cf7ed93f0c0f7c207e6595813966f8852b9") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) (pyimpsort . [(20160130 453) ((emacs (24 3))) "Sort python imports." tar ((:commit . "d5c61d70896b642646dfd3c809c06174ae086c1a") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/pyimpsort.el"))]) (pyinspect . [(20211102 1415) ((emacs (27 1))) "Python object inspector" tar ((:commit . "36cf624236c8b4cce852dd52b64d058d4d4a32fd") (:authors ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainer "Maor Kadosh" . "git@avocadosh.xyz") (:keywords "tools") (:url . "https://github.com/it-is-wednesday/pyinspect.el"))]) - (pylint . [(20210411 1931) nil "minor mode for running `pylint'" single ((:commit . "8bab34e23c88057753bc251373467c47a6c66ba7") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com") (:keywords "languages" "python"))]) + (pylint . [(20210411 1931) nil "minor mode for running `pylint'" single ((:commit . "7163b86c6f4a1a1c4ae1d6e5d3ab324ec76569e5") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com") (:keywords "languages" "python"))]) (pynt . [(20180710 726) ((emacs (24 4)) (ein (0 13 1)) (epc (0 1 1)) (deferred (0 5 1))) "Generate and scroll EIN buffers from python code" single ((:commit . "86cf9ce78d34f92bfd0764c9cbb75427ebd429e6") (:authors ("Edward Banner" . "edward.banner@gmail.com")) (:maintainer "Edward Banner" . "edward.banner@gmail.com") (:keywords "convenience") (:url . "https://github.com/ebanner/pynt"))]) (pyramid . [(20210427 1032) ((emacs (25 2)) (pythonic (0 1 1)) (tablist (0 70))) "Minor mode for working with pyramid projects" tar ((:commit . "66f54f4a9cc9fa81edf768ab433d5b3c5517363c") (:authors ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my") (:keywords "python" "pyramid" "pylons" "convenience" "tools" "processes") (:url . "https://github.com/dakra/pyramid.el"))]) (pytest . [(20200330 41) ((s (1 9 0))) "Easy Python test running in Emacs" single ((:commit . "6934047242db79b1c53e9fe3e0734cc9719ed1c4") (:keywords "pytest" "python" "testing") (:url . "https://github.com/ionrock/pytest-el"))]) @@ -4520,7 +4520,7 @@ (stickyfunc-enhance . [(20150429 1814) ((emacs (24 3))) "An enhancement to stock `semantic-stickyfunc-mode'" single ((:commit . "13bdba51fcd83ccbc3267959d23afc94d458dcb0") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainer "Tu, Do Hoang") (:keywords "c" "languages" "tools") (:url . "https://github.com/tuhdo/semantic-stickyfunc-enhance"))]) (stimmung-themes . [(20220412 1434) ((emacs (25))) "Themes tuned to inner harmonies" tar ((:commit . "77146bd3ad4f275847c965148572bb0ff0b54c1e") (:authors ("Love Lagerkvist")) (:maintainer "Love Lagerkvist") (:keywords "faces") (:url . "https://github.com/motform/stimmung-themes"))]) (stock-ticker . [(20150204 1052) ((s (1 9 0)) (request (0 2 0))) "Show stock prices in mode line" single ((:commit . "f2e564142c9de84232839a5b01979cf95b04d6a9") (:authors ("Gunther Hagleitner")) (:maintainer "Gunther Hagleitner") (:keywords "comms") (:url . "https://github.com/hagleitn/stock-ticker"))]) - (stock-tracker . [(20220422 225) ((emacs (27 1)) (dash (2 16 0)) (async (1 9 5))) "Track stock price" single ((:commit . "ae082b7125b7d64cb262268ac91e42cdcbefb3cc") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "stock" "finance") (:url . "https://github.com/beacoder/stock-tracker"))]) + (stock-tracker . [(20220422 943) ((emacs (27 1)) (dash (2 16 0)) (async (1 9 5))) "Track stock price" single ((:commit . "649812ebd286f1944eaf7b34d45d72ef60a0b0fb") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "stock" "finance") (:url . "https://github.com/beacoder/stock-tracker"))]) (strace-mode . [(20171116 2039) nil "strace output syntax highlighting" single ((:commit . "2901baa968d5180ab985ac40ca22cc20914d01f5") (:authors ("Preston Moore" . "prestonkmoore@gmail.com")) (:maintainer "Preston Moore" . "prestonkmoore@gmail.com") (:keywords "languages"))]) (streak . [(20220311 1929) ((emacs (27 1))) "Track a daily streak in your Mode Line" single ((:commit . "b2206de2fe43f97e754bbcb0abe9b078a419e787") (:authors ("Colin Woodbury ")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca") (:keywords "calendar") (:url . "https://github.com/fosskers/streak"))]) (streamlink . [(20210811 1429) ((s (1 12 0))) "A major mode for streamlink output" single ((:commit . "c265dc61c02ad29ec01dfd8b5cbe3bac60fbf097") (:keywords "multimedia" "streamlink") (:url . "https://github.com/BenediktBroich/streamlink"))]) @@ -4810,7 +4810,7 @@ (undersea-theme . [(20200719 618) ((emacs (24 3))) "Theme styled after undersea imagery" single ((:commit . "b7b5bffe242fd15b9eb8fe5cb7c9b45e474babbc") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/undersea-theme"))]) (underwater-theme . [(20131118 2) nil "A gentle, deep blue color theme" single ((:commit . "4eb9ef014f580adc135d91d1cd68d37a310640b6") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com") (:keywords "faces"))]) (undo-fu . [(20220412 2337) ((emacs (25 1))) "Undo helper with redo" single ((:commit . "f9c39c248cb965cd3c7cb3c8e15a4eee71921f8c") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu"))]) - (undo-fu-session . [(20220421 2239) ((emacs (28 1))) "Persistent undo, available between sessions" single ((:commit . "e4cf026fd535dbd734a355af98b6b2e788947093") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu-session"))]) + (undo-fu-session . [(20220422 320) ((emacs (28 1))) "Persistent undo, available between sessions" single ((:commit . "ee3879e469c792ae09933a2ca160b7979796b9e1") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu-session"))]) (undo-propose . [(20210207 45) ((emacs (24 3))) "Simple and safe undo navigation" single ((:commit . "91a1dfe516d90dab69c368f6669bacb2458ec5e9") (:authors ("Jack Kamm")) (:maintainer "Jack Kamm") (:keywords "convenience" "files" "undo" "redo" "history") (:url . "https://github.com/jackkamm/undo-propose.el"))]) (undohist . [(20220219 634) ((cl-lib (1 0))) "Persistent undo history for GNU Emacs" single ((:commit . "ec95d5038425bca375865803701c971a9c748114") (:authors ("MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com")) (:maintainer "MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com") (:keywords "convenience"))]) (unfill . [(20210106 220) ((emacs (24 1))) "Do the opposite of fill-paragraph or fill-region" single ((:commit . "cd354ea1a74338760ac6f5872d573e3ecb6b4bd2") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience") (:url . "https://github.com/purcell/unfill"))]) @@ -4940,7 +4940,7 @@ (wakatime-mode . [(20211104 1455) nil "Automatic time tracking extension for WakaTime" single ((:commit . "a53c0e819258ea9dbea3ad64b16e4c6c6201f5a5") (:authors ("Gabor Torok" . "gabor@20y.hu")) (:maintainer "Alan Hamlett" . "alan@wakatime.com") (:keywords "calendar" "comm"))]) (wakib-keys . [(20220211 1304) ((emacs (24 4))) "Minor Mode for Modern Keybindings" single ((:commit . "ed86134f91c532a38d2739dd15ea6cec879cbd8a") (:authors ("Abdulla Bubshait")) (:maintainer "Abdulla Bubshait") (:keywords "convenience" "keybindings" "keys") (:url . "https://github.com/darkstego/wakib-keys/"))]) (wal-mode . [(20220409 1214) ((emacs (25 1))) "A major mode for the WAL programming language" single ((:commit . "1daaf882824e8483419dc999c2d5507ad30cc929") (:authors ("Lucas Klemmer" . "lucas.klemmer@jku.at")) (:maintainer "Lucas Klemmer" . "lucas.klemmer@jku.at") (:keywords "languages") (:url . "https://github.com/LucasKl/wal-major-mode"))]) - (walkclj . [(20220421 645) ((emacs (25)) (parseclj (0 1 0)) (treepy (0 1 0))) "Manipulate Clojure parse trees" single ((:commit . "4b4e9fcef2361bdf88ab3c7f905a76672cfd43e4") (:authors ("Arne Brasseur")) (:maintainer "Arne Brasseur") (:keywords "languages") (:url . "https://github.com/plexus/walkclj"))]) + (walkclj . [(20220422 854) ((emacs (25)) (parseclj (0 1 0)) (treepy (0 1 0))) "Manipulate Clojure parse trees" single ((:commit . "ce4e7713d801b03f94f5da9898fce09718380ed4") (:authors ("Arne Brasseur")) (:maintainer "Arne Brasseur") (:keywords "languages") (:url . "https://github.com/plexus/walkclj"))]) (walkman . [(20220318 2122) ((transient (0 1 0)) (org (8 3 5)) (json-mode (1 6 0)) (emacs (26 3))) "Write HTTP requests in Org mode" single ((:commit . "3118dd4f493caffcc2849058833572dfc0c0e0a9") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "walkman" "http" "curl" "org" "comm") (:url . "https://github.com/abrochard/walkman"))]) (wallpaper . [(20201019 2123) ((emacs (25 1))) "Setting the wallpaper" single ((:commit . "cc0101726dd2fa2b4eda06924c7abfae54f663e2") (:authors ("Farlado" . "farlado@sdf.org")) (:maintainer "Farlado" . "farlado@sdf.org") (:keywords "unix" "wallpaper" "extensions") (:url . "https://github.com/farlado/emacs-wallpaper"))]) (wallpreview . [(20220220 427) ((emacs (24 4))) "Set wallpapers with image-dired" single ((:commit . "b1b8f19ae82b344a9577cea7b883ad513ec52222") (:url . "https://github.com/nryotaro/wallpreview"))]) diff --git a/code/elpa/dashboard-20220409.620/banners/1.txt b/code/elpa/dashboard-20220409.620/banners/1.txt new file mode 100644 index 0000000..8bd71a7 --- /dev/null +++ b/code/elpa/dashboard-20220409.620/banners/1.txt @@ -0,0 +1,8 @@ + +######## ## ## ### ###### ###### +## ### ### ## ## ## ## ## ## +## #### #### ## ## ## ## +###### ## ### ## ## ## ## ###### +## ## ## ######### ## ## +## ## ## ## ## ## ## ## ## +######## ## ## ## ## ###### ###### diff --git a/code/elpa/dashboard-20220409.620/banners/2.txt b/code/elpa/dashboard-20220409.620/banners/2.txt new file mode 100644 index 0000000..73b761b --- /dev/null +++ b/code/elpa/dashboard-20220409.620/banners/2.txt @@ -0,0 +1,6 @@ + _______ .___ ___. ___ ______ _______. +| ____|| \/ | / \ / | / | +| |__ | \ / | / ^ \ | ,----' | (----` +| __| | |\/| | / /_\ \ | | \ \ +| |____ | | | | / _____ \ | `----.----) | +|_______||__| |__| /__/ \__\ \______|_______/ diff --git a/code/elpa/dashboard-20220409.620/banners/3.txt b/code/elpa/dashboard-20220409.620/banners/3.txt new file mode 100644 index 0000000..3abfd82 --- /dev/null +++ b/code/elpa/dashboard-20220409.620/banners/3.txt @@ -0,0 +1,8 @@ + _______ _____ ______ ________ ________ ________ +|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\ +\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_ + \ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \ + \ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \ + \ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \ + \|_______|\|__| \|__|\|__|\|__|\|_______|\_________\ + \|_________| diff --git a/code/elpa/dashboard-20220409.620/banners/4.txt b/code/elpa/dashboard-20220409.620/banners/4.txt new file mode 100644 index 0000000..d82d67c --- /dev/null +++ b/code/elpa/dashboard-20220409.620/banners/4.txt @@ -0,0 +1,17 @@ +_ ___ _ _ +_ ___ __ ___ __ _ ___ +__ _ ___ __ ___ + _ ___ _ + _ _ __ _ + ___ __ _ + __ _ + _ _ _ + _ _ _ + _ _ _ + __ ___ + _ _ _ _ + _ _ + _ _ + _ _ + _ +__ diff --git a/code/elpa/dashboard-20220409.620/banners/emacs.png b/code/elpa/dashboard-20220409.620/banners/emacs.png new file mode 100644 index 0000000000000000000000000000000000000000..718b071189247cffc3dd1482d388dcbe35783196 GIT binary patch literal 43759 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 R@xcH9002ovPDHLkV1oEFC}RKs literal 0 HcmV?d00001 diff --git a/code/elpa/dashboard-20220409.620/banners/logo.png b/code/elpa/dashboard-20220409.620/banners/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c9de00c705e2f4f16d2dc36ba7a7952d88c865ab GIT binary patch literal 32305 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 Q_y7O^07*qoM6N<$f@+AI_y7O^ literal 0 HcmV?d00001 diff --git a/code/elpa/dashboard-20220409.620/dashboard-autoloads.el b/code/elpa/dashboard-20220409.620/dashboard-autoloads.el new file mode 100644 index 0000000..6d2d64a --- /dev/null +++ b/code/elpa/dashboard-20220409.620/dashboard-autoloads.el @@ -0,0 +1,39 @@ +;;; dashboard-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dashboard" "dashboard.el" (0 0 0 0)) +;;; Generated autoloads from dashboard.el + +(autoload 'dashboard-setup-startup-hook "dashboard" "\ +Setup post initialization hooks. +If a command line argument is provided, assume a filename and skip displaying +Dashboard." nil nil) + +(register-definition-prefixes "dashboard" '("dashboard-")) + +;;;*** + +;;;### (autoloads nil "dashboard-widgets" "dashboard-widgets.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from dashboard-widgets.el + +(register-definition-prefixes "dashboard-widgets" '("dashboard-" "org-time-less-p" "recentf-list")) + +;;;*** + +;;;### (autoloads nil nil ("dashboard-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dashboard-autoloads.el ends here diff --git a/code/elpa/dashboard-20220409.620/dashboard-pkg.el b/code/elpa/dashboard-20220409.620/dashboard-pkg.el new file mode 100644 index 0000000..6b8e0da --- /dev/null +++ b/code/elpa/dashboard-20220409.620/dashboard-pkg.el @@ -0,0 +1,12 @@ +(define-package "dashboard" "20220409.620" "A startup screen extracted from Spacemacs" + '((emacs "26.1")) + :commit "09290bf700cc269ad3c07d9518cd758b90971fcd" :authors + '(("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com")) + :maintainer + '("Jesús Martínez" . "jesusmartinez93@gmail.com") + :keywords + '("startup" "screen" "tools" "dashboard") + :url "https://github.com/emacs-dashboard/emacs-dashboard") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/dashboard-20220409.620/dashboard-widgets.el b/code/elpa/dashboard-20220409.620/dashboard-widgets.el new file mode 100644 index 0000000..8168afe --- /dev/null +++ b/code/elpa/dashboard-20220409.620/dashboard-widgets.el @@ -0,0 +1,1267 @@ +;;; dashboard-widgets.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2022 emacs-dashboard maintainers +;; +;; Author : Rakan Al-Hneiti +;; Maintainer : Jesús Martínez +;; Shen, Jen-Chieh +;; URL : https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "26.1")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projects (projectile or project.el), org-agenda and more. + +;;; Code: + +(require 'cl-lib) +(require 'subr-x) +(require 'image) + +;; Compiler pacifier +(declare-function all-the-icons-icon-for-dir "ext:all-the-icons.el") +(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") +(declare-function all-the-icons-fileicon "ext:data-fileicons.el") +(declare-function all-the-icons-octicon "ext:data-octicons.el") +(declare-function bookmark-get-filename "ext:bookmark.el") +(declare-function bookmark-all-names "ext:bookmark.el") +(declare-function calendar-date-compare "ext:calendar.el") +(declare-function projectile-cleanup-known-projects "ext:projectile.el") +(declare-function projectile-load-known-projects "ext:projectile.el") +(declare-function projectile-mode "ext:projectile.el") +(declare-function projectile-relevant-known-projects "ext:projectile.el") +;;; project.el in Emacs 26 does not contain this function +(declare-function project-known-project-roots "ext:project.el" nil t) +(declare-function project-forget-zombie-projects "ext:project.el" nil t) +(declare-function org-agenda-format-item "ext:org-agenda.el") +(declare-function org-compile-prefix-format "ext:org-agenda.el") +(declare-function org-entry-is-done-p "ext:org.el") +(declare-function org-in-archived-heading-p "ext:org.el") +(declare-function org-get-category "ext:org.el") +(declare-function org-get-deadline-time "ext:org.el") +(declare-function org-get-heading "ext:org.el") +(declare-function org-get-scheduled-time "ext:org.el") +(declare-function org-get-tags "ext:org.el") +(declare-function org-map-entries "ext:org.el") +(declare-function org-outline-level "ext:org.el") +(declare-function org-today "ext:org.el") +(declare-function org-get-todo-face "ext:org.el") +(declare-function org-get-todo-state "ext:org.el") +(declare-function org-entry-is-todo-p "ext:org.el") +(declare-function org-release-buffers "ext:org.el") +(declare-function recentf-cleanup "ext:recentf.el") +(defalias 'org-time-less-p 'time-less-p) +(defvar org-level-faces) +(defvar org-agenda-new-buffers) +(defvar org-agenda-prefix-format) +(defvar org-agenda-todo-keyword-format) +(defvar org-todo-keywords-1) +(defvar all-the-icons-dir-icon-alist) +(defvar package-activated-list) + +(defcustom dashboard-page-separator "\n\n" + "Separator to use between the different pages." + :type 'string + :group 'dashboard) + +(defcustom dashboard-image-banner-max-height 0 + "Maximum height of banner image. + +This setting applies only if Emacs supports image transforms or +compiled with Imagemagick support. When value is non-zero the image +banner will be resized to the specified height in pixels, with aspect +ratio preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-image-banner-max-width 0 + "Maximum width of banner image. + +This setting applies if Emacs supports image transforms or compiled +with Imagemagick support. When value is non-zero the image banner +will be resized to the specified width in pixels, with aspect ratio +preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-set-heading-icons nil + "When non nil, heading sections will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-file-icons nil + "When non nil, file lists will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-navigator nil + "When non nil, a navigator will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-init-info t + "When non nil, init info will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-footer t + "When non nil, a footer will be displayed at the bottom." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-footer-messages + '("The one true editor, Emacs!" + "Who the hell uses VIM anyway? Go Evil!" + "Free as free speech, free as free Beer" + "Happy coding!" + "Vi Vi Vi, the editor of the beast" + "Welcome to the church of Emacs" + "While any text editor can save your files, only Emacs can save your soul" + "I showed you my source code, pls respond") + "A list of messages, one of which dashboard chooses to display." + :type 'list + :group 'dashboard) + +(defcustom dashboard-show-shortcuts t + "Whether to show shortcut keys for each section." + :type 'boolean + :group 'dashboard) + +(defconst dashboard-banners-directory + (concat (file-name-directory (locate-library "dashboard")) "banners/") + "Default banner directory.") + +(defconst dashboard-banner-official-png + (concat dashboard-banners-directory "emacs.png") + "Emacs banner image.") + +(defconst dashboard-banner-logo-png + (concat dashboard-banners-directory "logo.png") + "Emacs banner image.") + +(defconst dashboard-banner-length 75 + "Width of a banner.") + +(defcustom dashboard-banner-logo-title "Welcome to Emacs!" + "Specify the startup banner." + :type 'string + :group 'dashboard) + +(defcustom dashboard-navigator-buttons nil + "Specify the navigator buttons. +The format is: 'icon title help action face prefix suffix'. + +Example: +'((\"☆\" \"Star\" \"Show stars\" (lambda (&rest _) + (show-stars)) 'warning \"[\" \"]\"))" + :type '(repeat (repeat (list string string string function symbol string string))) + :group 'dashboard) + +(defcustom dashboard-init-info + (lambda () + (let ((package-count 0) (time (emacs-init-time))) + (when (bound-and-true-p package-alist) + (setq package-count (length package-activated-list))) + (when (boundp 'straight--profile-cache) + (setq package-count (+ (hash-table-count straight--profile-cache) package-count))) + (if (zerop package-count) + (format "Emacs started in %s" time) + (format "%d packages loaded in %s" package-count time)))) + "Init info with packages loaded and init time." + :type '(function string) + :group 'dashboard) + +(defcustom dashboard-footer + (nth (random (1- (1+ (length dashboard-footer-messages)))) dashboard-footer-messages) + "A footer with some short message." + :type 'string + :group 'dashboard) + +(defcustom dashboard-footer-icon + (if (and (display-graphic-p) + (or (fboundp 'all-the-icons-fileicon) + (require 'all-the-icons nil 'noerror))) + (all-the-icons-fileicon "emacs" + :height 1.1 + :v-adjust -0.05 + :face 'font-lock-keyword-face) + (propertize ">" 'face 'dashboard-footer)) + "Footer's icon." + :type 'string + :group 'dashboard) + +(defcustom dashboard-startup-banner 'official + "Specify the startup banner. +Default value is `official', it displays the Emacs logo. `logo' displays Emacs +alternative logo. An integer value is the index of text banner. A string +value must be a path to a .PNG or .TXT file. If the value is nil then no banner +is displayed." + :type '(choice (const :tag "offical" official) + (const :tag "logo" logo) + (string :tag "a png or txt path")) + :group 'dashboard) + +(defcustom dashboard-buffer-last-width nil + "Previous width of dashboard-buffer." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-item-generators + '((recents . dashboard-insert-recents) + (bookmarks . dashboard-insert-bookmarks) + (projects . dashboard-insert-projects) + (agenda . dashboard-insert-agenda) + (registers . dashboard-insert-registers)) + "Association list of items to how to generate in the startup buffer. +Will be of the form `(list-type . list-function)'. +Possible values for list-type are: `recents', `bookmarks', `projects', +`agenda' ,`registers'." + :type '(repeat (alist :key-type symbol :value-type function)) + :group 'dashboard) + +(defcustom dashboard-projects-backend 'projectile + "The package that supplies the list of recent projects. +With the value `projectile', the projects widget uses the package +projectile (available in MELPA). With the value `project-el', +the widget uses the package project (available in GNU ELPA). + +To activate the projects widget, add e.g. `(projects . 10)' to +`dashboard-items' after making sure the necessary package is +installed." + :type '(choice (const :tag "Use projectile" projectile) + (const :tag "Use project.el" project-el)) + :group 'dashboard) + +(defcustom dashboard-items + '((recents . 5) + (bookmarks . 5) + (agenda . 5)) + "Association list of items to show in the startup buffer. +Will be of the form `(list-type . list-size)'. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'." + :type '(repeat (alist :key-type symbol :value-type integer)) + :group 'dashboard) + +(defcustom dashboard-item-shortcuts + '((recents . "r") + (bookmarks . "m") + (projects . "p") + (agenda . "a") + (registers . "e")) + "Association list of items and their corresponding shortcuts. +Will be of the form `(list-type . keys)' as understood by `(kbd keys)'. +If nil, shortcuts are disabled. If an entry's value is nil, that item's +shortcut is disbaled. See `dashboard-items' for possible values of list-type.'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defcustom dashboard-item-names nil + "Association list of item heading names. +When an item is nil or not present, the default name is used. +Will be of the form `(default-name . new-name)'." + :type '(alist :key-type string :value-type string) + :options '("Recent Files:" "Bookmarks:" "Agenda for today:" + "Agenda for the coming week:" "Registers:" "Projects:") + :group 'dashboard) + +(defcustom dashboard-items-default-length 20 + "Length used for startup lists with otherwise unspecified bounds. +Set to nil for unbounded." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-heading-icons + '((recents . "history") + (bookmarks . "bookmark") + (agenda . "calendar") + (projects . "rocket") + (registers . "database")) + "Association list for the icons of the heading sections. +Will be of the form `(list-type . icon-name-string)`. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defcustom dashboard-path-style nil + "Style to display path." + :type '(choice + (const :tag "No specify" nil) + (const :tag "Truncate the beginning part of the path" truncate-beginning) + (const :tag "Truncate the middle part of the path" truncate-middle) + (const :tag "Truncate the end part of the path" truncate-end)) + :group 'dashboard) + +(defcustom dashboard-path-max-length 70 + "Maximum length for path to display." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-path-shorten-string "..." + "String the that displays in the center of the path." + :type 'string + :group 'dashboard) + +(defvar recentf-list nil) + +(defvar dashboard-buffer-name) + +;; +;; Faces +;; +(defface dashboard-text-banner + '((t (:inherit font-lock-keyword-face))) + "Face used for text banners." + :group 'dashboard) + +(defface dashboard-banner-logo-title + '((t :inherit default)) + "Face used for the banner title." + :group 'dashboard) + +(defface dashboard-navigator + '((t (:inherit font-lock-keyword-face))) + "Face used for the navigator." + :group 'dashboard) + +(defface dashboard-heading + '((t (:inherit font-lock-keyword-face))) + "Face used for widget headings." + :group 'dashboard) + +(defface dashboard-items-face + '((t (:inherit widget-button))) + "Face used for items." + :group 'dashboard) + +(defface dashboard-no-items-face + '((t (:inherit widget-button))) + "Face used for no items." + :group 'dashboard) + +(defface dashboard-footer + '((t (:inherit font-lock-doc-face))) + "Face used for widget headings." + :group 'dashboard) + +(define-obsolete-face-alias + 'dashboard-text-banner-face 'dashboard-text-banner "1.2.6") +(define-obsolete-face-alias + 'dashboard-banner-logo-title-face 'dashboard-banner-logo-title "1.2.6") +(define-obsolete-face-alias + 'dashboard-heading-face 'dashboard-heading "1.2.6") + +;; +;; Util +;; +(defmacro dashboard-mute-apply (&rest body) + "Execute BODY without message." + (declare (indent 0) (debug t)) + `(let (message-log-max) + (with-temp-message (or (current-message) nil) + (let ((inhibit-message t)) ,@body)))) + +(defun dashboard-funcall-fboundp (fnc &rest args) + "Call FNC with ARGS if exists." + (when (fboundp fnc) (if args (funcall fnc args) (funcall fnc)))) + +;; +;; Generic widget helpers +;; +(defun dashboard-subseq (seq end) + "Return the subsequence of SEQ from 0 to END." + (let ((len (length seq))) + (butlast seq (- len (min len end))))) + +(defun dashboard-get-shortcut-name (item) + "Get the shortcut name to be used for ITEM." + (let ((elem (rassoc item dashboard-item-shortcuts))) + (and elem (car elem)))) + +(defun dashboard-get-shortcut (item) + "Get the shortcut to be used for ITEM." + (let ((elem (assq item dashboard-item-shortcuts))) + (and elem (cdr elem)))) + +(defmacro dashboard-insert-shortcut (shortcut-id + shortcut-char + search-label + &optional no-next-line) + "Insert a shortcut SHORTCUT-CHAR for a given SEARCH-LABEL. +Optionally, provide NO-NEXT-LINE to move the cursor forward a line." + (let* (;; Ensure punctuation and upper case in search string is not + ;; used to construct the `defun' + (name (downcase (replace-regexp-in-string "[[:punct:]]+" "" (format "%s" search-label)))) + ;; remove symbol quote + (sym (intern (replace-regexp-in-string "'" "" (format "dashboard-jump-to-%s" shortcut-id))))) + `(progn + (eval-when-compile (defvar dashboard-mode-map)) + (defun ,sym nil + ,(concat "Jump to " name ". This code is dynamically generated in `dashboard-insert-shortcut'.") + (interactive) + (unless (search-forward ,search-label (point-max) t) + (search-backward ,search-label (point-min) t)) + ,@(unless no-next-line '((forward-line 1))) + (back-to-indentation)) + (eval-after-load 'dashboard + (define-key dashboard-mode-map ,shortcut-char ',sym))))) + +(defun dashboard-append (msg &optional _messagebuf) + "Append MSG to dashboard buffer. +If MESSAGEBUF is not nil then MSG is also written in message buffer." + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (goto-char (point-max)) + (let (buffer-read-only) (insert msg)))) + +(defun dashboard-modify-heading-icons (alist) + "Append ALIST items to `dashboard-heading-icons' to modify icons." + (dolist (icon alist) + (add-to-list 'dashboard-heading-icons icon))) + +(defun dashboard-insert-page-break () + "Insert a page break line in dashboard buffer." + (dashboard-append dashboard-page-separator)) + +(defun dashboard-insert-heading (heading &optional shortcut) + "Insert a widget HEADING in dashboard buffer, adding SHORTCUT if provided." + (when (and (display-graphic-p) dashboard-set-heading-icons) + ;; Try loading `all-the-icons' + (unless (or (fboundp 'all-the-icons-octicon) + (require 'all-the-icons nil 'noerror)) + (error "Package `all-the-icons' isn't installed")) + + (insert (cond + ((string-equal heading "Recent Files:") + (all-the-icons-octicon (cdr (assoc 'recents dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Bookmarks:") + (all-the-icons-octicon (cdr (assoc 'bookmarks dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((or (string-equal heading "Agenda for today:") + (string-equal heading "Agenda for the coming week:")) + (all-the-icons-octicon (cdr (assoc 'agenda dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Registers:") + (all-the-icons-octicon (cdr (assoc 'registers dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Projects:") + (all-the-icons-octicon (cdr (assoc 'projects dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + (t " "))) + (insert " ")) + + (insert (propertize heading 'face 'dashboard-heading)) + + ;; Turn the inserted heading into an overlay, so that we may freely change + ;; its name without breaking any of the functions that expect the default name. + ;; If there isn't a suitable entry in `dashboard-item-names', + ;; we fallback to using HEADING. In that case we still want it to be an + ;; overlay to maintain consistent behavior (such as the point movement) + ;; between modified and default headings. + (let ((ov (make-overlay (- (point) (length heading)) (point) nil t))) + (overlay-put ov 'display (or (cdr (assoc heading dashboard-item-names)) heading)) + (overlay-put ov 'face 'dashboard-heading)) + (when shortcut (insert (format " (%s)" shortcut)))) + +(defun dashboard-center-line (string) + "Center a STRING accoring to it's size." + (insert (make-string (max 0 (floor (/ (- dashboard-banner-length + (+ (length string) 1)) 2))) ?\ ))) + +;; +;; BANNER +;; +(defun dashboard-insert-ascii-banner-centered (file) + "Insert banner from FILE." + (let ((ascii-banner + (with-temp-buffer + (insert-file-contents file) + (let ((banner-width 0)) + (while (not (eobp)) + (let ((line-length (- (line-end-position) (line-beginning-position)))) + (if (< banner-width line-length) + (setq banner-width line-length))) + (forward-line 1)) + (goto-char 0) + (let ((margin + (max 0 (floor (/ (- dashboard-banner-length banner-width) 2))))) + (while (not (eobp)) + (insert (make-string margin ?\ )) + (forward-line 1)))) + (buffer-string)))) + (put-text-property 0 (length ascii-banner) 'face 'dashboard-text-banner ascii-banner) + (insert ascii-banner))) + +(defun dashboard--type-is-gif-p (image-path) + "Return if image is a gif. +String -> bool. +Argument IMAGE-PATH path to the image." + (eq 'gif (image-type image-path))) + +(defun dashboard-insert-image-banner (banner) + "Display an image BANNER." + (when (file-exists-p banner) + (let* ((title dashboard-banner-logo-title) + (size-props + (append (when (> dashboard-image-banner-max-width 0) + (list :max-width dashboard-image-banner-max-width)) + (when (> dashboard-image-banner-max-height 0) + (list :max-height dashboard-image-banner-max-height)))) + (spec + (cond ((dashboard--type-is-gif-p banner) + (create-image banner)) + ((image-type-available-p 'imagemagick) + (apply 'create-image banner 'imagemagick nil size-props)) + (t + (apply 'create-image banner nil nil + (when (and (fboundp 'image-transforms-p) + (memq 'scale (funcall 'image-transforms-p))) + size-props))))) + ;; TODO: For some reason, `elisp-lint' is reporting error void + ;; function `image-size'. + (size (when (fboundp 'image-size) (image-size spec))) + (width (car size)) + (left-margin (max 0 (floor (- dashboard-banner-length width) 2)))) + (goto-char (point-min)) + (insert "\n") + (insert (make-string left-margin ?\ )) + (insert-image spec) + (when (dashboard--type-is-gif-p banner) (image-animate spec 0 t)) + (insert "\n\n") + (when title + (dashboard-center-line title) + (insert (format "%s\n\n" (propertize title 'face 'dashboard-banner-logo-title))))))) + +;; +;; INIT INFO +;; +(defun dashboard-insert-init-info () + "Insert init info when `dashboard-set-init-info' is t." + (when dashboard-set-init-info + (let ((init-info (if (functionp dashboard-init-info) + (funcall dashboard-init-info) + dashboard-init-info))) + (dashboard-center-line init-info) + (insert (propertize init-info 'face 'font-lock-comment-face))))) + +(defun dashboard-get-banner-path (index) + "Return the full path to banner with index INDEX." + (concat dashboard-banners-directory (format "%d.txt" index))) + +(defun dashboard-choose-banner () + "Return the full path of a banner based on the dotfile value." + (when dashboard-startup-banner + (cond ((eq 'official dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-official-png + (dashboard-get-banner-path 1))) + ((eq 'logo dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-logo-png + (dashboard-get-banner-path 1))) + ((integerp dashboard-startup-banner) + (dashboard-get-banner-path dashboard-startup-banner)) + ((stringp dashboard-startup-banner) + (if (and (file-exists-p dashboard-startup-banner) + (or (string-suffix-p ".txt" dashboard-startup-banner) + (and (display-graphic-p) + (image-type-available-p (intern (file-name-extension + dashboard-startup-banner)))))) + dashboard-startup-banner + (message "could not find banner %s, use default instead" dashboard-startup-banner) + (dashboard-get-banner-path 1))) + (t (dashboard-get-banner-path 1))))) + +(defun dashboard-insert-banner () + "Insert Banner at the top of the dashboard." + (goto-char (point-max)) + (let ((banner (dashboard-choose-banner)) buffer-read-only) + (when banner + (if (image-type-available-p (intern (file-name-extension banner))) + (dashboard-insert-image-banner banner) + (dashboard-insert-ascii-banner-centered banner)) + (dashboard-insert-navigator) + (dashboard-insert-init-info)))) + +(defun dashboard-insert-navigator () + "Insert Navigator of the dashboard." + (when (and dashboard-set-navigator dashboard-navigator-buttons) + (dolist (line dashboard-navigator-buttons) + (dolist (btn line) + (let* ((icon (car btn)) + (title (cadr btn)) + (help (or (cadr (cdr btn)) "")) + (action (or (cadr (cddr btn)) #'ignore)) + (face (or (cadr (cddr (cdr btn))) 'dashboard-navigator)) + (prefix (or (cadr (cddr (cddr btn))) (propertize "[" 'face face))) + (suffix (or (cadr (cddr (cddr (cdr btn)))) (propertize "]" 'face face)))) + (widget-create 'item + :tag (concat + (when icon + (propertize icon 'face + (let ((prop-face (get-text-property 0 'face icon))) + (if prop-face + `(:inherit ,prop-face :inherit ,face) + `(:inherit ,face))))) + (when (and icon title + (not (string-equal icon "")) + (not (string-equal title ""))) + (propertize " " 'face 'variable-pitch)) + (when title (propertize title 'face face))) + :help-echo help + :action action + :button-face 'dashboard-items-face + :mouse-face 'highlight + :button-prefix prefix + :button-suffix suffix + :format "%[%t%]") + (insert " "))) + (let* ((width (current-column))) + (beginning-of-line) + (dashboard-center-line (make-string width ?\s)) + (end-of-line)) + (insert "\n")) + (insert "\n"))) + +(defmacro dashboard-insert-section (section-name list list-size shortcut-id shortcut-char action &rest widget-params) + "Add a section with SECTION-NAME and LIST of LIST-SIZE items to the dashboard. +SHORTCUT-CHAR is the keyboard shortcut used to access the section. +ACTION is theaction taken when the user activates the widget button. +WIDGET-PARAMS are passed to the \"widget-create\" function." + `(progn + (dashboard-insert-heading ,section-name + (if (and ,list ,shortcut-char dashboard-show-shortcuts) ,shortcut-char)) + (if ,list + (when (and (dashboard-insert-section-list + ,section-name + (dashboard-subseq ,list ,list-size) + ,action + ,@widget-params) + ,shortcut-id ,shortcut-char) + (dashboard-insert-shortcut ,shortcut-id ,shortcut-char ,section-name)) + (insert (propertize "\n --- No items ---" 'face 'dashboard-no-items-face))))) + +;; +;; Section list +;; +(defmacro dashboard-insert-section-list (section-name list action &rest rest) + "Insert into SECTION-NAME a LIST of items, expanding ACTION and passing REST +to widget creation." + `(when (car ,list) + (mapc + (lambda (el) + (let ((tag ,@rest)) + (insert "\n ") + + (when (and (display-graphic-p) + dashboard-set-file-icons + (or (fboundp 'all-the-icons-icon-for-dir) + (require 'all-the-icons nil 'noerror))) + (let* ((path (car (last (split-string ,@rest " - ")))) + (icon (if (and (not (file-remote-p path)) + (file-directory-p path)) + (all-the-icons-icon-for-dir path nil "") + (cond + ((or (string-equal ,section-name "Agenda for today:") + (string-equal ,section-name "Agenda for the coming week:")) + (all-the-icons-octicon "primitive-dot" :height 1.0 :v-adjust 0.01)) + ((file-remote-p path) + (all-the-icons-octicon "radio-tower" :height 1.0 :v-adjust 0.01)) + (t (all-the-icons-icon-for-file (file-name-nondirectory path) + :v-adjust -0.05)))))) + (setq tag (concat icon " " ,@rest)))) + + (widget-create 'item + :tag tag + :action ,action + :button-face 'dashboard-items-face + :mouse-face 'highlight + :button-prefix "" + :button-suffix "" + :format "%[%t%]"))) + ,list))) + +;; Footer +(defun dashboard-random-footer () + "Return a random footer from `dashboard-footer-messages'." + (nth (random (length dashboard-footer-messages)) dashboard-footer-messages)) + +(defun dashboard-insert-footer () + "Insert footer of dashboard." + (when-let ((footer (and dashboard-set-footer (dashboard-random-footer)))) + (insert "\n") + (dashboard-center-line footer) + (insert dashboard-footer-icon) + (insert " ") + (insert (propertize footer 'face 'dashboard-footer)) + (insert "\n"))) + +;; +;; Truncate +;; +(defcustom dashboard-shorten-by-window-width nil + "Shorten path by window edges." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-shorten-path-offset 0 + "Shorten path offset on the edges." + :type 'integer + :group 'dashboard) + +(defun dashboard-f-filename (path) + "Return file name from PATH." + (file-name-nondirectory path)) + +(defun dashboard-f-base (path) + "Return directory name from PATH." + (file-name-nondirectory (directory-file-name (file-name-directory path)))) + +(defun dashboard-shorten-path-beginning (path) + "Shorten PATH from beginning if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + front) + (if (<= len-path dashboard-path-max-length) path + (setq front (ignore-errors (substring path (- len-path len-total) len-path))) + (if front (concat dashboard-path-shorten-string front) "")))) + +(defun dashboard-shorten-path-middle (path) + "Shorten PATH from middle if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + (center (/ len-total 2)) + (end-back center) + (start-front (- len-path center)) + back front) + (if (<= len-path dashboard-path-max-length) path + (setq back (substring path 0 end-back) + front (ignore-errors (substring path start-front len-path))) + (if front (concat back dashboard-path-shorten-string front) "")))) + +(defun dashboard-shorten-path-end (path) + "Shorten PATH from end if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + back) + (if (<= len-path dashboard-path-max-length) path + (setq back (ignore-errors (substring path 0 len-total))) + (if (and back (< 0 dashboard-path-max-length)) + (concat back dashboard-path-shorten-string) "")))) + +(defun dashboard--get-base-length (path type) + "Return the length of the base from the PATH by TYPE." + (let* ((is-dir (file-directory-p path)) + (base (if is-dir (dashboard-f-base path) (dashboard-f-filename path))) + (option (cl-case type + (recents 'dashboard-recentf-show-base) + (bookmarks 'dashboard-bookmarks-show-base) + (projects 'dashboard-projects-show-base))) + (option-val (symbol-value option)) + base-len) + (cl-case option-val + (`align (setq base-len (dashboard--align-length-by-type type))) + (`nil (setq base-len 0)) + (t (setq base-len (length base)))) + base-len)) + +(defun dashboard-shorten-path (path type) + "Shorten the PATH by TYPE." + (setq path (abbreviate-file-name path)) + (let ((dashboard-path-max-length + (if (and dashboard-path-style dashboard-shorten-by-window-width) + (- (window-width) (dashboard--get-base-length path type) + dashboard-shorten-path-offset) + dashboard-path-max-length))) + (cl-case dashboard-path-style + (truncate-beginning (dashboard-shorten-path-beginning path)) + (truncate-middle (dashboard-shorten-path-middle path)) + (truncate-end (dashboard-shorten-path-end path)) + (t path)))) + +(defun dashboard-shorten-paths (paths alist type) + "Shorten all path from PATHS by TYPE and store it to ALIST." + (let (lst-display abbrev (index 0)) + (setf (symbol-value alist) nil) ; reset + (dolist (item paths) + (setq abbrev (dashboard-shorten-path item type) + ;; Add salt here, and use for extraction. + ;; See function `dashboard-extract-key-path-alist'. + abbrev (format "%s|%s" index abbrev)) + ;; store `abbrev' as id; and `item' with value + (push (cons abbrev item) (symbol-value alist)) + (push abbrev lst-display) + (cl-incf index)) + (reverse lst-display))) + +(defun dashboard-extract-key-path-alist (key alist) + "Remove salt from KEY, and return true shorten path from ALIST." + (let* ((key (car (assoc key alist))) (split (split-string key "|"))) + (nth 1 split))) + +(defun dashboard-expand-path-alist (key alist) + "Get the full path (un-shorten) using KEY from ALIST." + (cdr (assoc key alist))) + +(defun dashboard--generate-align-format (fmt len) + "Return FMT after inserting align LEN." + (let ((pos (1+ (string-match-p "%s" fmt)))) + (concat (substring fmt 0 pos) + (concat "-" (number-to-string len)) + (substring fmt pos (length fmt))))) + +(defun dashboard--align-length-by-type (type) + "Return the align length by TYPE of the section." + (let ((len-item (cdr (assoc type dashboard-items))) (count 0) (align-length -1) + len-list base) + (cl-case type + (`recents + (require 'recentf) + (setq len-list (length recentf-list)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count recentf-list) + align-length (max align-length (length (dashboard-f-filename base)))) + (cl-incf count))) + (`bookmarks + (let ((bookmarks-lst (bookmark-all-names))) + (setq len-list (length bookmarks-lst)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count bookmarks-lst) + align-length (max align-length (length base))) + (cl-incf count)))) + (`projects + (let ((projects-lst (dashboard-projects-backend-load-projects))) + (setq len-list (length projects-lst)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count projects-lst) + align-length (max align-length (length (dashboard-f-base base)))) + (cl-incf count)))) + (t (error "Unknown type for align length: %s" type))) + align-length)) + +;; +;; Recentf +;; +(defcustom dashboard-recentf-show-base nil + "Show the base file name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-recentf-item-format "%s %s" + "Format to use when showing the base of the file name." + :type 'string + :group 'dashboard) + +(defvar dashboard-recentf-alist nil + "Alist records shorten's recent files and it's full paths.") + +(defvar dashboard--recentf-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-recents (list-size) + "Add the list of LIST-SIZE items from recently edited files." + (setq dashboard--recentf-cache-item-format nil) + (recentf-mode) + (dashboard-mute-apply (recentf-cleanup)) + (dashboard-insert-section + "Recent Files:" + (dashboard-shorten-paths recentf-list 'dashboard-recentf-alist 'recents) + list-size + 'recents + (dashboard-get-shortcut 'recents) + `(lambda (&rest _) + (find-file-existing (dashboard-expand-path-alist ,el dashboard-recentf-alist))) + (let* ((file (dashboard-expand-path-alist el dashboard-recentf-alist)) + (filename (dashboard-f-filename file)) + (path (dashboard-extract-key-path-alist el dashboard-recentf-alist))) + (cl-case dashboard-recentf-show-base + (`align + (unless dashboard--recentf-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'recents)) + (new-fmt (dashboard--generate-align-format + dashboard-recentf-item-format len-align))) + (setq dashboard--recentf-cache-item-format new-fmt))) + (format dashboard--recentf-cache-item-format filename path)) + (`nil path) + (t (format dashboard-recentf-item-format filename path)))))) + +;; +;; Bookmarks +;; +(defcustom dashboard-bookmarks-show-base t + "Show the base file name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-bookmarks-item-format "%s - %s" + "Format to use when showing the base of the file name." + :type 'string + :group 'dashboard) + +(defvar dashboard--bookmarks-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-bookmarks (list-size) + "Add the list of LIST-SIZE items of bookmarks." + (require 'bookmark) + (dashboard-insert-section + "Bookmarks:" + (dashboard-subseq (bookmark-all-names) list-size) + list-size + 'bookmarks + (dashboard-get-shortcut 'bookmarks) + `(lambda (&rest _) (bookmark-jump ,el)) + (if-let* ((filename el) + (path (bookmark-get-filename el)) + (path-shorten (dashboard-shorten-path path 'bookmarks))) + (cl-case dashboard-bookmarks-show-base + (`align + (unless dashboard--bookmarks-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'bookmarks)) + (new-fmt (dashboard--generate-align-format + dashboard-bookmarks-item-format len-align))) + (setq dashboard--bookmarks-cache-item-format new-fmt))) + (format dashboard--bookmarks-cache-item-format filename path-shorten)) + (`nil path-shorten) + (t (format dashboard-bookmarks-item-format filename path-shorten))) + el))) + +;; +;; Projects +;; +(defcustom dashboard-projects-switch-function + nil + "Custom function to switch to projects from dashboard. +If non-NIL, should be bound to a function with one argument. The function will +be called with the root directory of the project to switch to." + :type '(choice (const :tag "Default" nil) function) + :group 'dashboard) + +(defcustom dashboard-projects-show-base nil + "Show the project name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-projects-item-format "%s %s" + "Format to use when showing the base of the project name." + :type 'string + :group 'dashboard) + +(defvar dashboard-projects-alist nil + "Alist records the shorten's project paths and it's full paths.") + +(defvar dashboard--projects-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-projects (list-size) + "Add the list of LIST-SIZE items of projects." + (setq dashboard--projects-cache-item-format nil) + (dashboard-insert-section + "Projects:" + (dashboard-shorten-paths + (dashboard-subseq (dashboard-projects-backend-load-projects) list-size) + 'dashboard-projects-alist 'projects) + list-size + 'projects + (dashboard-get-shortcut 'projects) + `(lambda (&rest _) + (funcall (dashboard-projects-backend-switch-function) + (dashboard-expand-path-alist ,el dashboard-projects-alist))) + (let* ((file (dashboard-expand-path-alist el dashboard-projects-alist)) + (filename (dashboard-f-base file)) + (path (dashboard-extract-key-path-alist el dashboard-projects-alist))) + (cl-case dashboard-projects-show-base + (`align + (unless dashboard--projects-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'projects)) + (new-fmt (dashboard--generate-align-format + dashboard-projects-item-format len-align))) + (setq dashboard--projects-cache-item-format new-fmt))) + (format dashboard--projects-cache-item-format filename path)) + (`nil path) + (t (format dashboard-projects-item-format filename path)))))) + +(defun dashboard-projects-backend-load-projects () + "Depending on `dashboard-projects-backend' load corresponding backend. +Return function that returns a list of projects." + (cl-case dashboard-projects-backend + (`projectile + (require 'projectile) + (dashboard-mute-apply (projectile-cleanup-known-projects)) + (projectile-load-known-projects)) + (`project-el + (require 'project) + (dashboard-mute-apply (dashboard-funcall-fboundp #'project-forget-zombie-projects)) + (project-known-project-roots)) + (t + (display-warning '(dashboard) + "Invalid value for `dashboard-projects-backend'" + :error)))) + +(defun dashboard-projects-backend-switch-function () + "Return the function to switch to a project. +Custom variable `dashboard-projects-switch-function' variable takes preference +over custom backends." + (or dashboard-projects-switch-function + (cl-case dashboard-projects-backend + (`projectile 'projectile-switch-project-by-name) + (`project-el + (lambda (project) + "This function is used to switch to `PROJECT'." + (let ((default-directory project)) + (project-find-file)))) + (t + (display-warning '(dashboard) + "Invalid value for `dashboard-projects-backend'" + :error))))) + +;; +;; Org Agenda +;; +(defcustom dashboard-week-agenda t + "Show agenda weekly if its not nil." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-agenda-time-string-format "%Y-%m-%d" + "Format time of agenda entries." + :type 'string + :group 'dashboard) + +(defcustom dashboard-match-agenda-entry nil + "Match agenda to extra filter. +It is the MATCH attribute for `org-map-entries'" + :type 'string + :group 'dashboard) + +(defcustom dashboard-agenda-release-buffers nil + "If not nil use `org-release-buffers' after getting the entries." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-filter-agenda-entry 'dashboard-filter-agenda-by-time + "Function to filter `org-agenda' entries." + :type '(choice + (const :tag "No filter" dashboard-no-filter-agenda) + (const :tag "Filter by time" dashboard-filter-agenda-by-time) + (const :tag "Filter by todo" dashboard-filter-agenda-by-todo) + (function :tag "Custom function")) + :group 'dashboard) + +(defcustom dashboard-agenda-sort-strategy nil + "A list of strategies to sort the agenda. If nil agenda is not sorted." + :type '(repeat (choice (const time-up) (const time-down) + (const todo-state-up) (const todo-state-down))) + :group 'dashboard) + +(defcustom dashboard-agenda-prefix-format " %i %-12:c %s " + "Format for each entry in the agenda. +When the dashboard-agenda is created this format is inserted into +`org-agenda-prefix-format' as `dashboard-agenda' and compiled with +`org-compile-prefix-format' previous calling `dashboard-agenda-entry-format' for +each agenda entry." + :type 'string + :group 'dashboard) + +(defun dashboard-agenda-entry-format () + "Format agenda entry to show it on dashboard." + (let* ((scheduled-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (entry-time (or scheduled-time deadline-time)) + (item (org-agenda-format-item + (dashboard-agenda--formatted-time) + (dashboard-agenda--formatted-headline) + (org-outline-level) + (org-get-category) + (org-get-tags))) + (todo-state (org-get-todo-state)) + (todo-index (and todo-state + (length (member todo-state org-todo-keywords-1)))) + (entry-data (list 'dashboard-agenda-time entry-time + 'dashboard-agenda-todo-index todo-index + 'dashboard-agenda-file (buffer-file-name) + 'dashboard-agenda-loc (point)))) + (add-text-properties 0 (length item) entry-data item) + item)) + +(defun dashboard-agenda--formatted-headline () + "Set agenda faces to `HEADLINE' when face text property is nil." + (let* ((headline (org-get-heading t t t t)) + (todo (or (org-get-todo-state) "")) + (org-level-face (nth (- (org-outline-level) 1) org-level-faces)) + (todo-state (format org-agenda-todo-keyword-format todo))) + (when (null (get-text-property 0 'face headline)) + (add-face-text-property 0 (length headline) org-level-face t headline)) + (when (null (get-text-property 0 'face todo-state)) + (add-face-text-property 0 (length todo-state) (org-get-todo-face todo) t todo-state)) + (concat todo-state " " headline))) + +(defun dashboard-agenda--formatted-time () + "Get the scheduled or dead time of an entry. If no time is found return nil." + (when-let ((time (or (org-get-scheduled-time (point)) (org-get-deadline-time (point))))) + (format-time-string dashboard-agenda-time-string-format time))) + +(defun dashboard-due-date-for-agenda () + "Return due-date for agenda period." + (if dashboard-week-agenda + (time-add (current-time) (* 86400 8)) + (time-add (current-time) 86400))) + +(defun dashboard-filter-agenda-by-time () + "Include entry if it has a scheduled-time or deadline-time in the future. +An entry is included if this function returns nil and excluded if returns a +point." + (let ((scheduled-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (due-date (dashboard-due-date-for-agenda))) + (unless (and (not (org-entry-is-done-p)) + (not (org-in-archived-heading-p)) + (or (and scheduled-time + (org-time-less-p scheduled-time due-date)) + (and deadline-time + (org-time-less-p deadline-time due-date)))) + (point)))) + +(defun dashboard-filter-agenda-by-todo () + "Include entry if it is todo and not done. +An entry is included if this function returns nil and excluded +if returns a point." + (unless (and (org-entry-is-todo-p) + (not (org-entry-is-done-p)) + (not (org-in-archived-heading-p))) + (point))) + +(defun dashboard-no-filter-agenda () + "No filter agenda entries." + (when (org-entry-is-done-p) (point))) + +(defun dashboard-get-agenda () + "Get agenda items for today or for a week from now." + (if-let ((prefix-format (assoc 'dashboard-agenda org-agenda-prefix-format))) + (setcdr prefix-format dashboard-agenda-prefix-format) + (push (cons 'dashboard-agenda dashboard-agenda-prefix-format) org-agenda-prefix-format)) + (org-compile-prefix-format 'dashboard-agenda) + (prog1 (org-map-entries 'dashboard-agenda-entry-format + dashboard-match-agenda-entry + 'agenda + dashboard-filter-agenda-entry) + (dashboard-agenda--release-buffers))) + +(defun dashboard-agenda--release-buffers () + "Release agenda buffers buffers. +This is what `org-agenda-exit' do." + (when dashboard-agenda-release-buffers + (org-release-buffers org-agenda-new-buffers) + (setq org-agenda-new-buffers nil))) + +(defun dashboard-agenda--sorted-agenda () + "Return agenda sorted by time. +For now, it only works when dashboard-agenda has been filter by time +and dashboard-agenda-sort is not nil." + (let ((agenda (dashboard-get-agenda)) + (sort-function (dashboard-agenda--sort-function))) + (sort agenda sort-function))) + +(defun dashboard-agenda--sort-function () + "Get the function use to sorted the agenda. +Depending on the list `dashboard-agenda-sorting-strategy' use this strategies to +build a predicate to compare each enty. +This is similar as `org-entries-lessp' but with a different aproach." + (dashboard-agenda--build-sort-function dashboard-agenda-sort-strategy)) + +(defun dashboard-agenda--build-sort-function (strategies) + "Build a predicate to sort the dashboard agenda. +If `STRATEGIES' is nil then sort using the nil predicate. Look for the strategy +predicate, the attributes of the entry and compare entries. If no predicate is +found for the strategy it uses nil predicate." + (if (null strategies) (lambda (_dont _care) nil) + (let ((predicate (dashboard-agenda--build-sort-function-predicate + (car strategies))) + (attribute (dashboard-agenda--build-sort-function-attribute + (car strategies)))) + (if (null predicate) (lambda (_dont _care) nil) + (lambda (entry1 entry2) + (dashboard-agenda--compare-entries entry1 entry2 (cdr strategies) + predicate attribute)))))) + +(defun dashboard-agenda--build-sort-function-predicate (strategy) + "Return the predicate to compare two entryes depending on the `STRATEGY'." + (cl-case strategy + (`time-up 'org-time-less-p) + (`time-down (lambda (a b) (org-time-less-p b a))) + (`todo-state-up '>) + (`todo-state-down '<))) + +(defun dashboard-agenda--build-sort-function-attribute (strategy) + "Return the argument to compare two entries depending to the `STRATEGY'." + (cond + ((memq strategy '(time-up time-down)) 'dashboard-agenda-time) + ((memq strategy '(todo-state-up todo-state-down)) 'dashboard-agenda-todo-index) + (t nil))) + +(defun dashboard-agenda--compare-entries (entry1 entry2 strategies predicate attribute) + "Compare `ENTRY1' and `ENTRY2' by `ATTRIBUTE' using `PREDICATE'. +If both attributes are nil or equals the next strategy in `STRATEGIES' is used +to compare." + (let ((arg1 (get-text-property 0 attribute entry1)) + (arg2 (get-text-property 0 attribute entry2))) + (cond + ((or (and (null arg1) (null arg2)) (equal arg1 arg2)) + (apply (dashboard-agenda--build-sort-function strategies) (list entry1 entry2))) + ((null arg1) nil) + ((null arg2) t) + (t (apply predicate (list arg1 arg2)))))) + +(defun dashboard-insert-agenda (list-size) + "Add the list of LIST-SIZE items of agenda." + (require 'org-agenda) + (dashboard-insert-section + (if dashboard-week-agenda + "Agenda for the coming week:" + "Agenda for today:") + (dashboard-agenda--sorted-agenda) + list-size + 'agenda + (dashboard-get-shortcut 'agenda) + `(lambda (&rest _) + (let ((buffer (find-file-other-window (get-text-property 0 'dashboard-agenda-file ,el)))) + (with-current-buffer buffer + (goto-char (get-text-property 0 'dashboard-agenda-loc ,el)) + (switch-to-buffer buffer)))) + (format "%s" el))) + +;; +;; Registers +;; +(defun dashboard-insert-registers (list-size) + "Add the list of LIST-SIZE items of registers." + (require 'register) + (dashboard-insert-section + "Registers:" + register-alist + list-size + 'registers + (dashboard-get-shortcut 'registers) + (lambda (&rest _) (jump-to-register (car el))) + (format "%c - %s" (car el) (register-describe-oneline (car el))))) + +(provide 'dashboard-widgets) +;;; dashboard-widgets.el ends here diff --git a/code/elpa/dashboard-20220409.620/dashboard.el b/code/elpa/dashboard-20220409.620/dashboard.el new file mode 100644 index 0000000..9c8b80e --- /dev/null +++ b/code/elpa/dashboard-20220409.620/dashboard.el @@ -0,0 +1,472 @@ +;;; dashboard.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2022 emacs-dashboard maintainers +;; +;; Author : Rakan Al-Hneiti +;; Maintainer : Jesús Martínez +;; Shen, Jen-Chieh +;; URL : https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "26.1")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projects (projectile or project.el), org-agenda and more. + +;;; Code: + +(require 'ffap) +(require 'recentf) + +(require 'dashboard-widgets) + +(declare-function bookmark-get-filename "ext:bookmark.el") +(declare-function bookmark-all-names "ext:bookmark.el") +(declare-function dashboard-ls--dirs "ext:dashboard-ls.el") +(declare-function dashboard-ls--files "ext:dashboard-ls.el") +(declare-function page-break-lines-mode "ext:page-break-lines.el") +(declare-function project-forget-projects-under "ext:project.el") + +(defgroup dashboard nil + "Extensible startup screen." + :group 'applications) + +;; Custom splash screen +(defvar dashboard-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-p") 'dashboard-previous-line) + (define-key map (kbd "C-n") 'dashboard-next-line) + (define-key map (kbd "") 'dashboard-previous-line) + (define-key map (kbd "") 'dashboard-next-line) + (define-key map (kbd "k") 'dashboard-previous-line) + (define-key map (kbd "j") 'dashboard-next-line) + (define-key map [tab] 'widget-forward) + (define-key map (kbd "C-i") 'widget-forward) + (define-key map [backtab] 'widget-backward) + (define-key map (kbd "RET") 'dashboard-return) + (define-key map [mouse-1] 'dashboard-mouse-1) + (define-key map (kbd "}") #'dashboard-next-section) + (define-key map (kbd "{") #'dashboard-previous-section) + + (define-key map (kbd "") #'dashboard-remove-item-under) + (define-key map (kbd "") #'dashboard-remove-item-under) + (define-key map (kbd "DEL") #'dashboard-remove-item-under) + + (define-key map (kbd "1") #'dashboard-section-1) + (define-key map (kbd "2") #'dashboard-section-2) + (define-key map (kbd "3") #'dashboard-section-3) + (define-key map (kbd "4") #'dashboard-section-4) + (define-key map (kbd "5") #'dashboard-section-5) + (define-key map (kbd "6") #'dashboard-section-6) + (define-key map (kbd "7") #'dashboard-section-7) + (define-key map (kbd "8") #'dashboard-section-8) + (define-key map (kbd "9") #'dashboard-section-9) + map) + "Keymap for dashboard mode.") + +(defcustom dashboard-after-initialize-hook nil + "Hook that is run after dashboard buffer is initialized." + :group 'dashboard + :type 'hook) + +(define-derived-mode dashboard-mode special-mode "Dashboard" + "Dashboard major mode for startup screen." + :group 'dashboard + :syntax-table nil + :abbrev-table nil + (buffer-disable-undo) + (when (featurep 'whitespace) (whitespace-mode -1)) + (when (featurep 'linum) (linum-mode -1)) + (when (featurep 'display-line-numbers) (display-line-numbers-mode -1)) + (when (featurep 'page-break-lines) (page-break-lines-mode 1)) + (setq-local revert-buffer-function #'dashboard-refresh-buffer) + (setq inhibit-startup-screen t + buffer-read-only t + truncate-lines t)) + +(defcustom dashboard-center-content nil + "Whether to center content within the window." + :type 'boolean + :group 'dashboard) + +(defconst dashboard-buffer-name "*dashboard*" + "Dashboard's buffer name.") + +(defvar dashboard-force-refresh nil + "If non-nil, force refresh dashboard buffer.") + +(defvar dashboard--section-starts nil + "List of section starting positions.") + +;; +;; Util +;; +(defun dashboard--goto-line (line) + "Goto LINE." + (goto-char (point-min)) (forward-line (1- line))) + +(defmacro dashboard--save-excursion (&rest body) + "Execute BODY save window point." + (declare (indent 0) (debug t)) + `(let ((line (line-number-at-pos nil t)) + (column (current-column))) + ,@body + (dashboard--goto-line line) + (move-to-column column))) + +;; +;; Core +;; +(defun dashboard--current-section () + "Return section symbol in dashboard." + (save-excursion + (if (and (search-backward dashboard-page-separator nil t) + (search-forward dashboard-page-separator nil t)) + (let ((ln (thing-at-point 'line))) + (cond ((string-match-p "Recent Files:" ln) 'recents) + ((string-match-p "Bookmarks:" ln) 'bookmarks) + ((string-match-p "Projects:" ln) 'projects) + ((string-match-p "Agenda for " ln) 'agenda) + ((string-match-p "Registers:" ln) 'registers) + ((string-match-p "List Directories:" ln) 'ls-directories) + ((string-match-p "List Files:" ln) 'ls-files) + (t (user-error "Unknown section from dashboard")))) + (user-error "Failed searching dashboard section")))) + +;; +;; Navigation +;; +(defun dashboard-previous-section () + "Navigate back to previous section." + (interactive) + (let ((current-position (point)) current-section-start previous-section-start) + (dolist (elt dashboard--section-starts) + (when (and current-section-start (not previous-section-start)) + (setq previous-section-start elt)) + (when (and (not current-section-start) (< elt current-position)) + (setq current-section-start elt))) + (goto-char (if (eq current-position current-section-start) + previous-section-start + current-section-start)))) + +(defun dashboard-next-section () + "Navigate forward to next section." + (interactive) + (let ((current-position (point)) next-section-start + (section-starts (reverse dashboard--section-starts))) + (dolist (elt section-starts) + (when (and (not next-section-start) + (> elt current-position)) + (setq next-section-start elt))) + (when next-section-start + (goto-char next-section-start)))) + +(defun dashboard--section-lines () + "Return a list of integer represent the starting line number of each section." + (let (pb-lst) + (save-excursion + (goto-char (point-min)) + (while (search-forward dashboard-page-separator nil t) + (when (ignore-errors (dashboard--current-section)) + (push (line-number-at-pos) pb-lst)))) + (setq pb-lst (reverse pb-lst)) + pb-lst)) + +(defun dashboard--goto-section-by-index (index) + "Navigate to item section by INDEX." + (let* ((pg-lst (dashboard--section-lines)) + (items-id (1- index)) + (items-pg (nth items-id pg-lst)) + (items-len (length pg-lst))) + (when (and items-pg (< items-id items-len)) + (dashboard--goto-line items-pg)))) + +(defun dashboard-section-1 () + "Navigate to section 1." (interactive) (dashboard--goto-section-by-index 1)) +(defun dashboard-section-2 () + "Navigate to section 2." (interactive) (dashboard--goto-section-by-index 2)) +(defun dashboard-section-3 () + "Navigate to section 3." (interactive) (dashboard--goto-section-by-index 3)) +(defun dashboard-section-4 () + "Navigate to section 4." (interactive) (dashboard--goto-section-by-index 4)) +(defun dashboard-section-5 () + "Navigate to section 5." (interactive) (dashboard--goto-section-by-index 5)) +(defun dashboard-section-6 () + "Navigate to section 6." (interactive) (dashboard--goto-section-by-index 6)) +(defun dashboard-section-7 () + "Navigate to section 7." (interactive) (dashboard--goto-section-by-index 7)) +(defun dashboard-section-8 () + "Navigate to section 8." (interactive) (dashboard--goto-section-by-index 8)) +(defun dashboard-section-9 () + "Navigate to section 9." (interactive) (dashboard--goto-section-by-index 9)) + +(defun dashboard-previous-line (arg) + "Move point up and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + (interactive "^p") + (dashboard-next-line (- arg))) + +(defun dashboard-next-line (arg) + "Move point down and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + ;; code heavily inspired by `dired-next-line' + (interactive "^p") + (let (line-move-visual goal-column) + (line-move arg t)) + ;; We never want to move point into an invisible line. Dashboard doesn’t + ;; use invisible text currently but when it does we’re ready! + (while (and (invisible-p (point)) + (not (if (and arg (< arg 0)) (bobp) (eobp)))) + (forward-char (if (and arg (< arg 0)) -1 1))) + (beginning-of-line-text)) + +;; +;; ffap +;; +(defun dashboard--goto-section (section) + "Move to SECTION declares in variable `dashboard-item-shortcuts'." + (let ((fnc (intern (format "dashboard-jump-to-%s" section)))) + (dashboard-funcall-fboundp fnc))) + +(defun dashboard--current-index (section &optional pos) + "Return the idex by SECTION from POS." + (let (target-ln section-line) + (save-excursion + (when pos (goto-char pos)) + (setq target-ln (line-number-at-pos)) + (dashboard--goto-section section) + (setq section-line (line-number-at-pos))) + (- target-ln section-line))) + +(defun dashboard--section-list (section) + "Return the list from SECTION." + (cl-case section + (`recents recentf-list) + (`bookmarks (bookmark-all-names)) + (`projects (dashboard-projects-backend-load-projects)) + (`ls-directories (dashboard-ls--dirs)) + (`ls-files (dashboard-ls--files)) + (t (user-error "Unknown section for search: %s" section)))) + +(defun dashboard--current-item-in-path () + "Return the path from current dashboard section in path." + (let ((section (dashboard--current-section)) path) + (cl-case section + (`bookmarks (setq path (bookmark-get-filename path))) + (t + (let ((lst (dashboard--section-list section)) + (index (dashboard--current-index section))) + (setq path (nth index lst))))) + path)) + +(defun dashboard--on-path-item-p () + "Return non-nil if current point is on the item path from dashboard." + (save-excursion + (when (= (point) (line-end-position)) (ignore-errors (forward-char -1))) + (eq (get-char-property (point) 'face) 'dashboard-items-face))) + +(defun dashboard--ffap-guesser--adv (fnc &rest args) + "Advice execution around function `ffap-guesser'. + +Argument FNC is the adviced function. +Optional argument ARGS adviced function arguments." + (cl-case major-mode + (`dashboard-mode + (or (and (dashboard--on-path-item-p) + (dashboard--current-item-in-path)) + (apply fnc args))) ; fallback + (t (apply fnc args)))) +(advice-add 'ffap-guesser :around #'dashboard--ffap-guesser--adv) + +;; +;; Removal +;; +(defun dashboard-remove-item-under () + "Remove a item from the current item section." + (interactive) + (cl-case (dashboard--current-section) + (`recents (dashboard-remove-item-recentf)) + (`bookmarks (dashboard-remove-item-bookmarks)) + (`projects (dashboard-remove-item-projects)) + (`agenda (dashboard-remove-item-agenda)) + (`registers (dashboard-remove-item-registers))) + (dashboard--save-excursion (dashboard-refresh-buffer))) + +(defun dashboard-remove-item-recentf () + "Remove a file from `recentf-list'." + (interactive) + (let ((path (save-excursion (end-of-line) (ffap-guesser)))) + (setq recentf-list (delete path recentf-list))) + (dashboard-mute-apply (recentf-save-list))) + +(defun dashboard-remove-item-projects () + "Remove a path from `project--list'." + (interactive) + (let ((path (save-excursion (end-of-line) (ffap-guesser)))) + (dashboard-mute-apply + (cl-case dashboard-projects-backend + (`projectile ) ; TODO: .. + (`project-el (project-forget-projects-under path)))))) + +(defun dashboard-remove-item-bookmarks () + "Remove a bookmarks from `bookmark-alist'." + (interactive)) ; TODO: .. + +(defun dashboard-remove-item-agenda () + "Remove an agenda from `org-agenda-files'." + (interactive "P") + (let ((agenda-file (get-text-property (point) 'dashboard-agenda-file)) + (agenda-loc (get-text-property (point) 'dashboard-agenda-loc))) + (with-current-buffer (find-file-noselect agenda-file) + (goto-char agenda-loc) + (call-interactively 'org-todo)))) + +(defun dashboard-remove-item-registers () + "Remove a registers from `register-alist'." + (interactive)) ; TODO: .. + +;; +;; Confirmation +;; +(defun dashboard-return () + "Hit return key in dashboard buffer." + (interactive) + (let ((start-ln (line-number-at-pos)) (fd-cnt 0) diff-line entry-pt) + (save-excursion + (while (and (not diff-line) + (not (= (point) (point-min))) + (not (get-char-property (point) 'button)) + (not (= (point) (point-max)))) + (forward-char 1) + (setq fd-cnt (1+ fd-cnt)) + (unless (= start-ln (line-number-at-pos)) + (setq diff-line t))) + (unless (= (point) (point-max)) + (setq entry-pt (point)))) + (when (= fd-cnt 1) + (setq entry-pt (1- (point)))) + (if entry-pt + (widget-button-press entry-pt) + (call-interactively #'widget-button-press)))) + +(defun dashboard-mouse-1 () + "Key for keymap `mouse-1'." + (interactive) + (let ((old-track-mouse track-mouse)) + (when (call-interactively #'widget-button-click) + (setq track-mouse old-track-mouse)))) + +;; +;; Insertion +;; +(defun dashboard-maximum-section-length () + "For the just-inserted section, calculate the length of the longest line." + (let ((max-line-length 0)) + (save-excursion + (dashboard-previous-section) + (while (not (eobp)) + (setq max-line-length + (max max-line-length + (- (line-end-position) (line-beginning-position)))) + (forward-line 1))) + max-line-length)) + +(defun dashboard-insert-startupify-lists () + "Insert the list of widgets into the buffer." + (interactive) + (let ((buffer-exists (buffer-live-p (get-buffer dashboard-buffer-name))) + (recentf-is-on (recentf-enabled-p)) + (origial-recentf-list recentf-list) + (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0)) + (max-line-length 0)) + ;; disable recentf mode, so we don't flood the recent files list with org + ;; mode files do this by making a copy of the part of the list we'll use + ;; let dashboard widgets change that then restore the orginal list afterwards + ;; (this avoids many saves/loads that would result from disabling/enabling + ;; recentf-mode) + (when recentf-is-on + (setq recentf-list (dashboard-subseq recentf-list dashboard-num-recents))) + (when (or dashboard-force-refresh + (not (eq dashboard-buffer-last-width (window-width))) + (not buffer-exists)) + (setq dashboard-banner-length (window-width) + dashboard-buffer-last-width dashboard-banner-length) + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (let (buffer-read-only) + (erase-buffer) + (dashboard-insert-banner) + (dashboard-insert-page-break) + (setq dashboard--section-starts nil) + (mapc (lambda (els) + (let* ((el (or (car-safe els) els)) + (list-size + (or (cdr-safe els) + dashboard-items-default-length)) + (item-generator + (cdr-safe (assoc el dashboard-item-generators)))) + (add-to-list 'dashboard--section-starts (point)) + (funcall item-generator list-size) + (when recentf-is-on + (setq recentf-list origial-recentf-list)) + (setq max-line-length + (max max-line-length (dashboard-maximum-section-length))) + (dashboard-insert-page-break))) + dashboard-items) + (when dashboard-center-content + (when dashboard--section-starts + (goto-char (car (last dashboard--section-starts)))) + (let ((margin (floor (/ (max (- (window-width) max-line-length) 0) 2)))) + (while (not (eobp)) + (unless (string-suffix-p (thing-at-point 'line) dashboard-page-separator) + (insert (make-string margin ?\ ))) + (forward-line 1)))) + (dashboard-insert-footer)) + (goto-char (point-min)) + (dashboard-mode))) + (when recentf-is-on + (setq recentf-list origial-recentf-list)))) + +(add-hook 'window-setup-hook + (lambda () + (add-hook 'window-size-change-functions 'dashboard-resize-on-hook) + (dashboard-resize-on-hook))) + +(defun dashboard-refresh-buffer (&rest _) + "Refresh buffer." + (interactive) + (let ((dashboard-force-refresh t)) (dashboard-insert-startupify-lists)) + (switch-to-buffer dashboard-buffer-name)) + +(defun dashboard-resize-on-hook (&optional _) + "Re-render dashboard on window size change." + (let ((space-win (get-buffer-window dashboard-buffer-name)) + (frame-win (frame-selected-window))) + (when (and space-win + (not (window-minibuffer-p frame-win))) + (with-selected-window space-win + (dashboard-insert-startupify-lists))))) + +;;;###autoload +(defun dashboard-setup-startup-hook () + "Setup post initialization hooks. +If a command line argument is provided, assume a filename and skip displaying +Dashboard." + (when (< (length command-line-args) 2) + (add-hook 'after-init-hook (lambda () + ;; Display useful lists of items + (dashboard-insert-startupify-lists))) + (add-hook 'emacs-startup-hook (lambda () + (switch-to-buffer dashboard-buffer-name) + (goto-char (point-min)) + (redisplay) + (run-hooks 'dashboard-after-initialize-hook))))) + +(provide 'dashboard) +;;; dashboard.el ends here diff --git a/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el new file mode 100644 index 0000000..b45e7c2 --- /dev/null +++ b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el @@ -0,0 +1,23 @@ +;;; dashboard-project-status-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dashboard-project-status" "dashboard-project-status.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from dashboard-project-status.el + +(register-definition-prefixes "dashboard-project-status" '("dashboard-project-status")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dashboard-project-status-autoloads.el ends here diff --git a/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el new file mode 100644 index 0000000..9e680da --- /dev/null +++ b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from dashboard-project-status.el -*- no-byte-compile: t -*- +(define-package "dashboard-project-status" "20190202.1354" "Display a git project status in a dashboard widget." '((emacs "24") (git "0.1.1") (dashboard "1.2.5")) :commit "7675c138e9df8fe2c626e7ba9bbb8b6717671a41" :authors '(("Jason Duncan" . "jasond496@msn.com")) :maintainer '("Jason Duncan" . "jasond496@msn.com") :url "https://github.com/functionreturnfunction/dashboard-project-status") diff --git a/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el new file mode 100644 index 0000000..370f230 --- /dev/null +++ b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el @@ -0,0 +1,99 @@ +;;; dashboard-project-status.el --- Display a git project status in a dashboard widget. -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Jason Duncan, all rights reserved + +;; Author: Jason Duncan +;; Version: 0.0.1 +;; Package-Version: 20190202.1354 +;; Package-Commit: 7675c138e9df8fe2c626e7ba9bbb8b6717671a41 +;; URL: https://github.com/functionreturnfunction/dashboard-project-status +;; Package-Requires: ((emacs "24") (git "0.1.1") (dashboard "1.2.5")) + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; Display a git project status in a dashboard widget. + +;; See README.org for installation and usage. + +;;; Code: + +(require 'git) +(require 'dashboard) + +(defun dashboard-project-status-git-local-is-behind? () + "Return non-nil if current `git-repo' is behind its remote." + (numberp + (string-match-p + (regexp-quote "Your branch is behind") + (git-run "status" "-uno")))) + +(defun dashboard-project-status-git-unstaged-files () + "Return list of unstaged files." + (git--lines + (git-run "diff" "--name-only"))) + +(defun dashboard-project-status-insert-heading () + "Insert a heading with project path and whether or not it is behind." + (dashboard-insert-heading "Project ") + (if (functionp 'magit-status) + (widget-create 'push-button + :action `(lambda (&rest ignore) (magit-status ,git-repo)) + :mouse-face 'highlight + :follow-link "\C-m" + :button-prefix "" + :button-suffix "" + :format "%[%t%]" + (abbreviate-file-name git-repo)) + (dashboard-insert-heading git-repo)) + (dashboard-insert-heading + (if (dashboard-project-status-git-local-is-behind?) + " is behind the remote. (use \"git pull\" to update)" + " is up-to-date."))) + +(defun dashboard-project-status-insert-body (limit) + "Insert lists of untracked, unstaged, and staged files LIMIT -ed as specified." + (let ((count 0)) + (dolist (section `(("Untracked Files:" . ,(git-untracked-files)) + ("Unstaged Files:" . ,(dashboard-project-status-git-unstaged-files)) + ("Staged Files:" . ,(git-staged-files)))) + (when (cdr section) + (let* ((items (cdr section)) + (items (if (> (+ count (length items)) limit) + (dashboard-subseq items 0 (- limit count)) + items))) + (when items + (setq count (+ count (length items))) + (insert hard-newline) + (dashboard-insert-recentf-list + (car section) + (reverse + (let (ret) + (dolist (cur items ret) + (setq ret (cons (expand-file-name + (concat (file-name-as-directory git-repo) cur)) + ret)))))))))))) + +(defun dashboard-project-status (project-dir &optional update) + "Return a function which will insert git status for PROJECT-DIR. +If UPDATE is non-nil, update the remote first with 'git remote update'." + `(lambda (list-size) + (let ((git-repo ,project-dir)) + (when ,update (git-run "remote" "update")) + (dashboard-project-status-insert-heading) + (dashboard-project-status-insert-body list-size)))) + +(provide 'dashboard-project-status) +;;; dashboard-project-status.el ends here diff --git a/code/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el b/code/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el deleted file mode 100644 index e441fc8..0000000 --- a/code/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el +++ /dev/null @@ -1,42 +0,0 @@ -;;; dired-collapse-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-collapse" "dired-collapse.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from dired-collapse.el - -(autoload 'dired-collapse-mode "dired-collapse" "\ -Toggle collapsing of unique nested paths in Dired. - -This is a minor mode. If called interactively, toggle the -`Dired-Collapse mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. - -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. - -To check whether the minor mode is enabled in the current buffer, -evaluate `dired-collapse-mode'. - -The mode's hook is called both when the mode is enabled and when -it is disabled. - -\(fn &optional ARG)" t nil) - -(register-definition-prefixes "dired-collapse" '("dired-collapse")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-collapse-autoloads.el ends here diff --git a/code/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el b/code/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el deleted file mode 100644 index 46cd3a8..0000000 --- a/code/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-collapse.el -*- no-byte-compile: t -*- -(define-package "dired-collapse" "20210403.1230" "Collapse unique nested paths in dired listing" '((dash "2.10.0") (f "0.19.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/code/elpa/dired-collapse-20210403.1230/dired-collapse.el b/code/elpa/dired-collapse-20210403.1230/dired-collapse.el deleted file mode 100644 index bb19891..0000000 --- a/code/elpa/dired-collapse-20210403.1230/dired-collapse.el +++ /dev/null @@ -1,162 +0,0 @@ -;;; dired-collapse.el --- Collapse unique nested paths in dired listing -*- lexical-binding: t -*- - -;; Copyright (C) 2017 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Version: 1.1.0 -;; Package-Version: 20210403.1230 -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Created: 15th July 2017 -;; Package-requires: ((dash "2.10.0") (f "0.19.0") (dired-hacks-utils "0.0.1")) -;; Keywords: files - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; Often times we find ourselves in a situation where a single file -;; or directory is nested in a chain of nested directories with no -;; other content. This is sometimes due to various mandatory -;; layouts demanded by packaging tools or tools generating these -;; deeply-nested "unique" paths to disambiguate architectures or -;; versions (but we often use only one anyway). If the user wants -;; to access these directories they have to quite needlessly -;; drill-down through varying number of "uninteresting" directories -;; to get to the content. - -;; This minor mode is in main inspired by how GitHub renders these -;; paths: if there is a chain of directories where each one only has -;; one child, they are concatenated together and shown on the first -;; level in this collapsed form. When the user clicks this -;; collapsed directory they are immediately brought to the deepest -;; directory with some actual content. - -;; To enable or disable this functionality use `dired-collapse-mode' -;; to toggle it for the current dired buffer. - -;; If the deepest directory contains only a single file this file is -;; displayed instead of the last directory. This way we can get -;; directly to the file itself. This is often helpful with config -;; files which are stored in their own directories, for example in -;; `~/.config/foo/config' and similar situations. - -;; The files or directories re-inserted in this manner will also -;; have updated permissions, file sizes and modification dates so -;; they truly correspond to the properties of the file being shown. - -;; The path to the deepest file is dimmed with the `shadow' face so -;; that it does not distract but at the same time is still available -;; for inspection. - -;; The mode is integrated with `dired-rainbow' so the nested files -;; are properly colored according to user's rules. - -;;; Code: - -(require 'dash) -(require 'dired) -(require 'f) -(require 'dired-hacks-utils) - -(defgroup dired-collapse () - "Collapse unique nested paths in dired listing." - :group 'dired-hacks - :prefix "dired-collapse-") - -(defcustom dired-collapse-remote nil - "If non-nil, enable `dired-collapse' in remote (TRAMP) buffers." - :type 'boolean - :group 'dired-collapse) - -;;;###autoload -(define-minor-mode dired-collapse-mode - "Toggle collapsing of unique nested paths in Dired." - :group 'dired-collapse - :lighter "" - (if dired-collapse-mode - (progn - (add-hook 'dired-after-readin-hook 'dired-collapse 'append 'local) - (add-hook 'dired-subtree-after-insert-hook 'dired-collapse 'append 'local) - ;; collapse the buffer only if it is not empty (= we haven't - ;; yet read in the current directory) - (unless (= (buffer-size) 0) - (dired-collapse))) - (remove-hook 'dired-after-readin-hook 'dired-collapse 'local) - (remove-hook 'dired-subtree-after-insert-hook 'dired-collapse 'local) - (revert-buffer))) - -(defun dired-collapse--replace-file (file) - "Replace file on the current line with FILE." - (delete-region (line-beginning-position) (1+ (line-end-position))) - (insert " ") - (insert-directory file dired-listing-switches nil nil) - (forward-line -1) - (dired-align-file (line-beginning-position) (1+ (line-end-position))) - (-when-let (replaced-file (dired-utils-get-filename)) - (when (file-remote-p replaced-file) - (while (search-forward (dired-current-directory) (line-end-position) t) - (replace-match ""))))) - -(defun dired-collapse--create-ov (&optional to-eol) - "Create the shadow overlay which marks the collapsed path. - -If TO-EOL is non-nil, extend the overlay over the whole -filename (for example when the final directory is empty)." - (save-excursion - (dired-move-to-filename) - (let* ((beg (point)) - (end (save-excursion - (dired-move-to-end-of-filename) - (if to-eol - (point) - (1+ (search-backward "/"))))) - (ov (make-overlay beg end))) - (overlay-put ov 'face 'shadow) - ov))) - -(defun dired-collapse () - "Collapse unique nested paths in dired listing." - (when (or (not (file-remote-p default-directory)) dired-collapse-remote) - (-let* (;; dired-hide-details-mode hides details by assigning a special invisibility text property - ;; to them, while dired-collapse requires all the details. So we disable invisibility here - ;; temporarily. - (buffer-invisibility-spec nil) - (inhibit-read-only t)) - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (when (and (looking-at-p dired-re-dir) - (not (member (dired-utils-get-filename 'no-dir) (list "." ".."))) - (not (eolp))) - (let ((path (dired-utils-get-filename)) - files) - (while (and (file-directory-p path) - (file-accessible-directory-p path) - (setq files (f-entries path)) - (= 1 (length files))) - (setq path (car files))) - (if (and (not files) - (equal path (dired-utils-get-filename))) - (dired-collapse--create-ov 'to-eol) - (setq path (s-chop-prefix (dired-current-directory) path)) - (when (string-match-p "/" path) - (let ((default-directory (dired-current-directory))) - (dired-collapse--replace-file path)) - (dired-insert-set-properties (line-beginning-position) (line-end-position)) - (dired-collapse--create-ov (= 0 (length files))))))) - (forward-line 1)))))) - -(provide 'dired-collapse) -;;; dired-collapse.el ends here diff --git a/code/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el b/code/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el index 0c1de1a..3d91d8d 100644 --- a/code/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el +++ b/code/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el @@ -1,2 +1,2 @@ -;;; Generated package description from dired-hacks-utils.el -*- no-byte-compile: t -*- -(define-package "dired-hacks-utils" "20201005.2318" "Utilities and helpers for dired-hacks collection" '((dash "2.5.0")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) +;;; Generated package description from dired-hacks-utils.el -*- no-byte-compile: t -*- +(define-package "dired-hacks-utils" "20201005.2318" "Utilities and helpers for dired-hacks collection" '((dash "2.5.0")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/code/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el b/code/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el index 648e6bb..3048ef0 100644 --- a/code/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el +++ b/code/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el @@ -1,2 +1,2 @@ -;;; Generated package description from dired-rainbow.el -*- no-byte-compile: t -*- -(define-package "dired-rainbow" "20190722.1109" "Extended file highlighting according to its type" '((dash "2.5.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matus Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matus Goljer" . "matus.goljer@gmail.com") :keywords '("files")) +;;; Generated package description from dired-rainbow.el -*- no-byte-compile: t -*- +(define-package "dired-rainbow" "20190722.1109" "Extended file highlighting according to its type" '((dash "2.5.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matus Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matus Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/code/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el b/code/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el deleted file mode 100644 index f128edd..0000000 --- a/code/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el +++ /dev/null @@ -1,73 +0,0 @@ -;;; dired-ranger-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-ranger" "dired-ranger.el" (0 0 0 0)) -;;; Generated autoloads from dired-ranger.el - -(autoload 'dired-ranger-copy "dired-ranger" "\ -Place the marked items in the copy ring. - -With non-nil prefix argument, add the marked items to the current -selection. This allows you to gather files from multiple dired -buffers for a single paste. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-paste "dired-ranger" "\ -Copy the items from copy ring to current directory. - -With raw prefix argument \\[universal-argument], do not remove -the selection from the stack so it can be copied again. - -With numeric prefix argument, copy the n-th selection from the -copy ring. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-move "dired-ranger" "\ -Move the items from copy ring to current directory. - -This behaves like `dired-ranger-paste' but moves the files -instead of copying them. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-bookmark "dired-ranger" "\ -Bookmark current dired buffer. - -CHAR is a single character (a-zA-Z0-9) representing the bookmark. -Reusing a bookmark replaces the content. These bookmarks are not -persistent, they are used for quick jumping back and forth -between currently used directories. - -\(fn CHAR)" t nil) - -(autoload 'dired-ranger-bookmark-visit "dired-ranger" "\ -Visit bookmark CHAR. - -If the associated dired buffer was killed, we try to reopen it -according to the setting `dired-ranger-bookmark-reopen'. - -The special bookmark `dired-ranger-bookmark-LRU' always jumps to -the least recently visited dired buffer. - -See also `dired-ranger-bookmark'. - -\(fn CHAR)" t nil) - -(register-definition-prefixes "dired-ranger" '("dired-ranger-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-ranger-autoloads.el ends here diff --git a/code/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el b/code/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el deleted file mode 100644 index 634fa93..0000000 --- a/code/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-ranger.el -*- no-byte-compile: t -*- -(define-package "dired-ranger" "20180401.2206" "Implementation of useful ranger features for dired" '((dash "2.7.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/code/elpa/dired-ranger-20180401.2206/dired-ranger.el b/code/elpa/dired-ranger-20180401.2206/dired-ranger.el deleted file mode 100644 index a36b218..0000000 --- a/code/elpa/dired-ranger-20180401.2206/dired-ranger.el +++ /dev/null @@ -1,299 +0,0 @@ -;;; dired-ranger.el --- Implementation of useful ranger features for dired - -;; Copyright (C) 2014-2015 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Version: 0.0.1 -;; Package-Version: 20180401.2206 -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Created: 17th June 2014 -;; Package-requires: ((dash "2.7.0") (dired-hacks-utils "0.0.1")) -;; Keywords: files - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This package implements useful features present in the -;; [ranger](http://ranger.github.io/) file manager which are missing -;; in dired. - -;; Multi-stage copy/pasting of files -;; --------------------------------- - -;; A feature present in most orthodox file managers is a "two-stage" -;; copy/paste process. Roughly, the user first selects some files, -;; "copies" them into a clipboard and then pastes them to the target -;; location. This workflow is missing in dired. - -;; In dired, user first marks the files, then issues the -;; `dired-do-copy' command which prompts for the destination. The -;; files are then copied there. The `dired-dwim-target' option makes -;; this a bit friendlier---if two dired windows are opened, the other -;; one is automatically the default target. - -;; With the multi-stage operations, you can gather files from -;; *multiple* dired buffers into a single "clipboard", then copy or -;; move all of them to the target location. Another huge advantage is -;; that if the target dired buffer is already opened, switching to it -;; via ido or ibuffer is often faster than selecting the path. - -;; Call `dired-ranger-copy' to add marked files (or the file under -;; point if no files are marked) to the "clipboard". With non-nil -;; prefix argument, add the marked files to the current clipboard. - -;; Past clipboards are stored in `dired-ranger-copy-ring' so you can -;; repeat the past pastes. - -;; Call `dired-ranger-paste' or `dired-ranger-move' to copy or move -;; the files in the current clipboard to the current dired buffer. -;; With raw prefix argument (usually C-u), the clipboard is not -;; cleared, so you can repeat the copy operation in another dired -;; buffer. - -;; Bookmarks -;; --------- - -;; Use `dired-ranger-bookmark' to bookmark current dired buffer. You -;; can later quickly revisit it by calling -;; `dired-ranger-bookmark-visit'. - -;; A bookmark name is any single character, letter, digit or a symbol. - -;; A special bookmark with name `dired-ranger-bookmark-LRU' represents -;; the least recently used dired buffer. Its default value is `. If -;; you bind `dired-ranger-bookmark-visit' to the same keybinding, -;; hitting `` will instantly bring you to the previously used dired -;; buffer. This can be used to toggle between two dired buffers in a -;; very fast way. - -;; These bookmarks are not persistent. If you want persistent -;; bookmarks use the bookmarks provided by emacs, see (info "(emacs) -;; Bookmarks"). - -;;; Code: - -(require 'dired-hacks-utils) -(require 'dash) -(require 'ring) - -(defgroup dired-ranger () - "Implementation of useful ranger features for dired." - :group 'dired-hacks - :prefix "dired-ranger-") - - -;; multi-stage copy/paste operations -(defcustom dired-ranger-copy-ring-size 10 - "Specifies how many filesets for copy/paste operations should be stored." - :type 'integer - :group 'dired-ranger) - -(defvar dired-ranger-copy-ring (make-ring dired-ranger-copy-ring-size)) - -;;;###autoload -(defun dired-ranger-copy (arg) - "Place the marked items in the copy ring. - -With non-nil prefix argument, add the marked items to the current -selection. This allows you to gather files from multiple dired -buffers for a single paste." - (interactive "P") - ;; TODO: add dired+ `dired-get-marked-files' support? - (let ((marked (dired-get-marked-files))) - (if (or (not arg) - (ring-empty-p dired-ranger-copy-ring)) - (progn - (ring-insert - dired-ranger-copy-ring - (cons (list (current-buffer)) marked)) - ;; TODO: abstract the message/plural detection somewhere - ;; (e.g. give it a verb and number to produce the correct - ;; string.) - (message (format "Copied %d item%s into copy ring." - (length marked) - (if (> (length marked) 1) "s" "")))) - (let ((current (ring-remove dired-ranger-copy-ring 0))) - (ring-insert - dired-ranger-copy-ring - (cons (-distinct (cons (current-buffer) (car current))) - (-distinct (-concat (dired-get-marked-files) (cdr current))))) - (message (format "Added %d item%s into copy ring." - (length marked) - (if (> (length marked) 1) "s" ""))))))) - -(defun dired-ranger--revert-target (char target-directory files) - "Revert the target buffer and mark the new files. - -CHAR is the temporary value for `dired-marker-char'. - -TARGET-DIRECTORY is the current dired directory. - -FILES is the list of files (from the `dired-ranger-copy-ring') we -operated on." - (let ((current-file (dired-utils-get-filename))) - (revert-buffer) - (let ((dired-marker-char char)) - (--each (-map 'file-name-nondirectory files) - (dired-utils-goto-line (concat target-directory it)) - (dired-mark 1))) - (dired-utils-goto-line current-file))) - -;;;###autoload -(defun dired-ranger-paste (arg) - "Copy the items from copy ring to current directory. - -With raw prefix argument \\[universal-argument], do not remove -the selection from the stack so it can be copied again. - -With numeric prefix argument, copy the n-th selection from the -copy ring." - (interactive "P") - (let* ((index (if (numberp arg) arg 0)) - (data (ring-ref dired-ranger-copy-ring index)) - (files (cdr data)) - (target-directory (dired-current-directory)) - (copied-files 0)) - (--each files (when (file-exists-p it) - (if (file-directory-p it) - (copy-directory it target-directory) - (condition-case err - (copy-file it target-directory 0) - (file-already-exists nil))) - (cl-incf copied-files))) - (dired-ranger--revert-target ?P target-directory files) - (unless arg (ring-remove dired-ranger-copy-ring 0)) - (message (format "Pasted %d/%d item%s from copy ring." - copied-files - (length files) - (if (> (length files) 1) "s" ""))))) - -;;;###autoload -(defun dired-ranger-move (arg) - "Move the items from copy ring to current directory. - -This behaves like `dired-ranger-paste' but moves the files -instead of copying them." - (interactive "P") - (let* ((index (if (numberp arg) arg 0)) - (data (ring-ref dired-ranger-copy-ring index)) - (buffers (car data)) - (files (cdr data)) - (target-directory (dired-current-directory)) - (copied-files 0)) - (--each files (when (file-exists-p it) - (condition-case err - (rename-file it target-directory 0) - (file-already-exists nil)) - (cl-incf copied-files))) - (dired-ranger--revert-target ?M target-directory files) - (--each buffers - (when (buffer-live-p it) - (with-current-buffer it (revert-buffer)))) - (unless arg (ring-remove dired-ranger-copy-ring 0)) - (message (format "Moved %d/%d item%s from copy ring." - copied-files - (length files) - (if (> (length files) 1) "s" ""))))) - - -;; bookmarks -(defcustom dired-ranger-bookmark-reopen 'ask - "Should we reopen closed dired buffer when visiting a bookmark? - -This does only correctly reopen regular dired buffers listing one -directory. Special dired buffers like the output of `find-dired' -or `ag-dired', virtual dired buffers and subdirectories can not -be recreated. - -The value 'never means never reopen the directory. - -The value 'always means always reopen the directory. - -The value 'ask will ask if we should reopen or not. Reopening a -dired buffer for a directory that is already opened in dired will -bring that up, which might be unexpected as that directory might -come from a non-standard source (i.e. not be file-system -backed)." - :type '(radio - (const :tag "Never reopen automatically." never) - (const :tag "Always reopen automatically." always) - (const :tag "Reopen automatically only in standard dired buffers, ask otherwise." ask)) - :group 'dired-ranger) - -(defcustom dired-ranger-bookmark-LRU ?` - "Bookmark representing the least recently used/visited dired buffer. - -If a dired buffer is currently active, select the one visited -before. If a non-dired buffer is active, visit the least -recently visited dired buffer." - :type 'char - :group 'dired-ranger) - -(defvar dired-ranger-bookmarks nil - "An alist mapping bookmarks to dired buffers and locations.") - -;;;###autoload -(defun dired-ranger-bookmark (char) - "Bookmark current dired buffer. - -CHAR is a single character (a-zA-Z0-9) representing the bookmark. -Reusing a bookmark replaces the content. These bookmarks are not -persistent, they are used for quick jumping back and forth -between currently used directories." - (interactive "cBookmark name: ") - (let ((dir (file-truename default-directory))) - (-if-let (value (cdr (assoc char dired-ranger-bookmarks))) - (setf (cdr (assoc char dired-ranger-bookmarks)) (cons dir (current-buffer))) - (push (-cons* char dir (current-buffer)) dired-ranger-bookmarks)) - (message "Bookmarked directory %s as `%c'" dir char))) - -;;;###autoload -(defun dired-ranger-bookmark-visit (char) - "Visit bookmark CHAR. - -If the associated dired buffer was killed, we try to reopen it -according to the setting `dired-ranger-bookmark-reopen'. - -The special bookmark `dired-ranger-bookmark-LRU' always jumps to -the least recently visited dired buffer. - -See also `dired-ranger-bookmark'." - (interactive "cBookmark name: ") - (if (eq char dired-ranger-bookmark-LRU) - (progn - (let ((buffers (buffer-list))) - (when (eq (with-current-buffer (car buffers) major-mode) 'dired-mode) - (pop buffers)) - (switch-to-buffer (--first (eq (with-current-buffer it major-mode) 'dired-mode) buffers)))) - (-if-let* ((value (cdr (assoc char dired-ranger-bookmarks))) - (dir (car value)) - (buffer (cdr value))) - (if (buffer-live-p buffer) - (switch-to-buffer buffer) - (when - ;; TODO: abstract this never/always/ask pattern. It is - ;; also used in filter. - (cond - ((eq dired-ranger-bookmark-reopen 'never) nil) - ((eq dired-ranger-bookmark-reopen 'always) t) - ((eq dired-ranger-bookmark-reopen 'ask) - (y-or-n-p (format "The dired buffer referenced by this bookmark does not exist. Should we try to reopen `%s'?" dir)))) - (find-file dir) - (setf (cdr (assoc char dired-ranger-bookmarks)) (cons dir (current-buffer))))) - (message "Bookmark `%c' does not exist." char)))) - -(provide 'dired-ranger) -;;; dired-ranger.el ends here diff --git a/code/elpa/dired-single-20211101.2319/dired-single-pkg.el b/code/elpa/dired-single-20211101.2319/dired-single-pkg.el index cc8a0b8..b70590e 100644 --- a/code/elpa/dired-single-20211101.2319/dired-single-pkg.el +++ b/code/elpa/dired-single-20211101.2319/dired-single-pkg.el @@ -1,2 +1,2 @@ -;;; Generated package description from dired-single.el -*- no-byte-compile: t -*- -(define-package "dired-single" "20211101.2319" "Reuse the current dired buffer to visit a directory" 'nil :commit "b254f9b7bfc96a5eab5760a56811f2872d2c590a" :keywords '("dired" "reuse" "buffer") :url "https://github.com/crocket/dired-single") +;;; Generated package description from dired-single.el -*- no-byte-compile: t -*- +(define-package "dired-single" "20211101.2319" "Reuse the current dired buffer to visit a directory" 'nil :commit "b254f9b7bfc96a5eab5760a56811f2872d2c590a" :keywords '("dired" "reuse" "buffer") :url "https://github.com/crocket/dired-single") diff --git a/code/elpa/git-20140128.1041/git-autoloads.el b/code/elpa/git-20140128.1041/git-autoloads.el new file mode 100644 index 0000000..219c6d3 --- /dev/null +++ b/code/elpa/git-20140128.1041/git-autoloads.el @@ -0,0 +1,22 @@ +;;; git-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "git" "git.el" (0 0 0 0)) +;;; Generated autoloads from git.el + +(register-definition-prefixes "git" '("git-")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; git-autoloads.el ends here diff --git a/code/elpa/git-20140128.1041/git-pkg.el b/code/elpa/git-20140128.1041/git-pkg.el new file mode 100644 index 0000000..6e88e5c --- /dev/null +++ b/code/elpa/git-20140128.1041/git-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from git.el -*- no-byte-compile: t -*- +(define-package "git" "20140128.1041" "An Elisp API for programmatically using Git" '((s "1.7.0") (dash "2.2.0") (f "0.10.0")) :commit "a3396a7027a7d986598c6a2d6d5599bac918f3da" :authors '(("Johan Andersson" . "johan.rejeep@gmail.com")) :maintainer '("Johan Andersson" . "johan.rejeep@gmail.com") :keywords '("git") :url "http://github.com/rejeep/git.el") diff --git a/code/elpa/git-20140128.1041/git.el b/code/elpa/git-20140128.1041/git.el new file mode 100644 index 0000000..f1569bd --- /dev/null +++ b/code/elpa/git-20140128.1041/git.el @@ -0,0 +1,280 @@ +;;; git.el --- An Elisp API for programmatically using Git + +;; Copyright (C) 2013 Johan Andersson + +;; Author: Johan Andersson +;; Maintainer: Johan Andersson +;; Version: 0.1.1 +;; Package-Version: 20140128.1041 +;; Package-Commit: a3396a7027a7d986598c6a2d6d5599bac918f3da +;; Keywords: git +;; URL: http://github.com/rejeep/git.el +;; Package-Requires: ((s "1.7.0") (dash "2.2.0") (f "0.10.0")) + +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code: + +;; Todo: no-pager + +(require 's) +(require 'dash) +(require 'f) + +(defvar git-executable + (executable-find "git") + "Git executable.") + +(defvar git-repo nil + "Path to current working repo.") + +(defvar git-args nil + "List of args to include when running git command.") + +(defconst git-stash-re "^\\(.+?\\): \\(?:WIP on\\|On\\) \\(.+\\): \\(.+\\)$" + "Regular expression matching a stash.") + +(put 'git-error 'error-conditions '(error git-error)) +(put 'git-error 'error-message "GIT Error") + +(defun git-error (string &rest args) + "Signal a GIT error. + +Signal an error with `git-error' type. + +STRING is a `format' string, and ARGS are the formatted objects." + (signal 'git-error (list (apply #'format string args)))) + +(defun git-run (command &rest args) + "Run git COMMAND with ARGS." + (let ((default-directory (f-full git-repo))) + (with-temp-buffer + (let ((exit-code + (apply + 'call-process + (append + (list git-executable nil (current-buffer) nil) + (git--args command args))))) + (if (zerop exit-code) + (buffer-string) + (git-error + "Error running command: %s %s\n%s" + git-executable + (s-join " " (git--args command args)) + (buffer-string))))))) + +(defun git-repo? (directory) + "Return true if there is a git repo in DIRECTORY, false otherwise." + (or + (f-dir? (f-expand ".git" directory)) + (and + (f-dir? (f-expand "info" directory)) + (f-dir? (f-expand "objects" directory)) + (f-dir? (f-expand "refs" directory)) + (f-file? (f-expand "HEAD" directory))))) + +(defun git-branch? (branch) + "Return true if there's a branch called BRANCH." + (-contains? (git-branches) branch)) + +(defun git-tag? (tag) + "Return true if there's a tag called TAG." + (-contains? (git-tags) tag)) + +(defun git-on-branch () + "Return currently active branch." + (condition-case err + (git--clean (git-run "rev-parse" "--abbrev-ref" "HEAD")) + (git-error + (git-error "Repository not initialized")))) + +(defun git-on-branch? (branch) + "Return true if BRANCH is currently active." + (equal branch (git-on-branch))) + +(defun git-add (&rest files) + "Add PATH or everything." + (git-run "add" (or files "."))) + +(defun git-branch (branch) + "Create BRANCH." + (if (git-branch? branch) + (git-error "Branch already exists %s" branch) + (git-run "branch" branch))) + +(defun git-branches () + "List all available branches." + (-map + (lambda (line) + (if (s-starts-with? "*" line) + (substring line 2) + line)) + (git--lines (git-run "branch")))) + +(defun git-checkout (ref) + "Checkout REF." + (git-run "checkout" ref)) + +(defun git-clone (url &optional dir) + "Clone URL to DIR (if present)." + (git-run "clone" url dir)) + +(defun git-commit (message &rest files) + "Commit FILES (or added files) with MESSAGE." + (git-run "commit" (or files "-a") "--message" message files)) + +(defun git-fetch (&optional repo) + "Fetch REPO." + (git-run "fetch" repo)) + +(defun git-init (&optional dir bare) + "Create new Git repo at DIR (or `git-repo'). + +If BARE is true, create a bare repo." + (let ((git-repo (or dir git-repo))) + (git-run "init" (and bare "--bare")))) + +;; Todo: The solution used here is not bulletproof. For example if the +;; message contains a pipe, the :message will only include everything +;; before that pipe. Figure out a good solution for this. +(defun git-log (&optional branch) + "Log history on BRANCH." + (let ((logs (git--lines (git-run "log" "--format=%h|%an|%ae|%cn|%ce|%ad|%s")))) + (-map + (lambda (log) + (let ((data (s-split "|" log))) + (list + :commit (nth 0 data) + :author-name (nth 1 data) + :author-email (nth 2 data) + :comitter-name (nth 3 data) + :comitter-email (nth 4 data) + :date (nth 5 data) + :message (nth 6 data)))) + logs))) + +(defun git-config (option &optional value) + "Set or get config OPTION. Set to VALUE if present." + (condition-case err + (git--clean (git-run "config" option value)) + (git-error))) + +(defun git-pull (&optional repo ref) + "Pull REF from REPO." + (git-run "pull" repo ref)) + +(defun git-push (&optional repo ref) + "Push REF to REPO." + (git-run "push" repo ref)) + +(defun git-remote? (name) + "Return true if remote with NAME exists, false otherwise." + (-contains? (git-remotes) name)) + +(defun git-remotes () + "Return list of all remotes." + (git--lines (git-run "remote"))) + +(defun git-remote-add (name url) + "Add remote with NAME and URL." + (git-run "remote" "add" name url)) + +(defun git-remote-remove (name) + "Remove remote with NAME." + (if (git-remote? name) + (git-run "remote" "remove" name) + (git-error "No such remote %s" name))) + +(defun git-reset (&optional commit mode) + "Reset to COMMIT with MODE." + (git-run "reset" (if mode (concat "--" (symbol-name mode))) commit)) + +(defun git-rm (path &optional recursive) + "Remove PATH. + +To remove directory, use RECURSIVE argument." + (git-run "rm" path (and recursive "-r"))) + +(defun git-stash (&optional message) + "Stash changes in a dirty tree with MESSAGE. + +If a stash was created, the name of the stash is returned, +otherwise nil is returned." + (let ((before-stashes (git-stashes)) after-stashes) + (git-run "stash" "save" message) + (setq after-stashes (git-stashes)) + (if (> (length after-stashes) (length before-stashes)) + (plist-get (car after-stashes) :name)))) + +(defun git-stashes () + "Return list of stashes." + (let ((stashes (git--lines (git-run "stash" "list")))) + (-map + (lambda (stash) + (let ((matches (s-match git-stash-re stash))) + (list :name (nth 1 matches) + :branch (nth 2 matches) + :message (nth 3 matches)))) + stashes))) + +(defun git-stash-pop (&optional name) + "Apply and remove stash with NAME (or first stash)." + (git-run "stash" "pop" name)) + +(defun git-stash-apply (&optional name) + "Apply and keep stash with NAME (or first stash)." + (git-run "stash" "apply" name)) + +(defun git-tag (tag) + "Create TAG." + (if (git-tag? tag) + (git-error "Tag already exists %s" tag) + (git-run "tag" tag))) + +(defun git-tags () + "Return list of all tags." + (git--lines (git-run "tag"))) + +(defun git-untracked-files () + "Return list of untracked files." + (git--lines + (git-run "ls-files" "--other" "--exclude-standard"))) + +(defun git-staged-files () + "Return list of staged files." + (git--lines + (git-run "diff" "--cached" "--name-only"))) + + +;;;; Helpers + +(defun git--lines (string) + (-reject 's-blank? (-map 's-trim (s-lines string)))) + +(defun git--clean (string) + (s-presence (s-trim string))) + +(defun git--args (command &rest args) + (-flatten (-reject 'null (append (list "--no-pager" command) args git-args)))) + + +(provide 'git) + +;;; git.el ends here diff --git a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-autoloads.el b/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-autoloads.el deleted file mode 100644 index 513daa9..0000000 --- a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-autoloads.el +++ /dev/null @@ -1,43 +0,0 @@ -;;; all-the-icons-dired-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "all-the-icons-dired" "all-the-icons-dired.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from all-the-icons-dired.el - -(autoload 'all-the-icons-dired-mode "all-the-icons-dired" "\ -Display all-the-icons icon for each file in a dired buffer. - -This is a minor mode. If called interactively, toggle the -`All-The-Icons-Dired mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. - -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. - -To check whether the minor mode is enabled in the current buffer, -evaluate `all-the-icons-dired-mode'. - -The mode's hook is called both when the mode is enabled and when -it is disabled. - -\(fn &optional ARG)" t nil) - -(register-definition-prefixes "all-the-icons-dired" '("all-the-icons-dired-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; all-the-icons-dired-autoloads.el ends here diff --git a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el b/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el deleted file mode 100644 index a6ce0d7..0000000 --- a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from all-the-icons-dired.el -*- no-byte-compile: t -*- -(define-package "all-the-icons-dired" "20220304.1638" "Shows icons for each file in dired mode" '((emacs "24.4") (all-the-icons "2.2.0")) :commit "147ed0dfd1034a686795a08dc63e2c293128597e" :authors '(("jtbm37")) :maintainer '("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") :keywords '("files" "icons" "dired") :url "https://github.com/wyuenho/all-the-icons-dired") diff --git a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired.el b/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired.el deleted file mode 100644 index 5c10ac4..0000000 --- a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired.el +++ /dev/null @@ -1,159 +0,0 @@ -;;; all-the-icons-dired.el --- Shows icons for each file in dired mode -*- lexical-binding: t; -*- - -;; Copyright (C) 2016-2020 jtbm37 -;; Copyright (C) 2021 Jimmy Yuen Ho Wong - -;; Author: jtbm37 -;; Maintainer: Jimmy Yuen Ho Wong -;; Version: 2.0 -;; Package-Version: 20220304.1638 -;; Package-Commit: 147ed0dfd1034a686795a08dc63e2c293128597e -;; Keywords: files icons dired -;; Package-Requires: ((emacs "24.4") (all-the-icons "2.2.0")) -;; URL: https://github.com/wyuenho/all-the-icons-dired - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: -;; To use this package, simply add this to your init.el: -;; (add-hook 'dired-mode-hook 'all-the-icons-dired-mode) - -;; To manually install, add this to your init.el before the hook mentioned above. -;; (add-to-load-path (expand-file-name "~/path/to/all-the-icons-dired")) -;; (load "all-the-icons-dired.el") - - -;;; Code: - -(require 'cl-lib) -(require 'dired) -(require 'all-the-icons) -(require 'subr-x) - -(defface all-the-icons-dired-dir-face - '((((background dark)) :foreground "white") - (((background light)) :foreground "black")) - "Face for the directory icon" - :group 'all-the-icons-faces) - -(defcustom all-the-icons-dired-v-adjust 0.01 - "The default vertical adjustment of the icon in the dired buffer." - :group 'all-the-icons - :type 'number) - -(defcustom all-the-icons-dired-monochrome t - "Whether to show the icons as the same color as the text on the same line." - :group 'all-the-icons - :type 'boolean) - -(defvar all-the-icons-dired-mode) - -(defun all-the-icons-dired--add-overlay (pos string) - "Add overlay to display STRING at POS." - (let ((ov (make-overlay (1- pos) pos))) - (overlay-put ov 'all-the-icons-dired-overlay t) - (overlay-put ov 'after-string string))) - -(defun all-the-icons-dired--overlays-in (beg end) - "Get all all-the-icons-dired overlays between BEG to END." - (cl-remove-if-not - (lambda (ov) - (overlay-get ov 'all-the-icons-dired-overlay)) - (overlays-in beg end))) - -(defun all-the-icons-dired--overlays-at (pos) - "Get all-the-icons-dired overlays at POS." - (apply #'all-the-icons-dired--overlays-in `(,pos ,pos))) - -(defun all-the-icons-dired--remove-all-overlays () - "Remove all `all-the-icons-dired' overlays." - (save-restriction - (widen) - (mapc #'delete-overlay - (all-the-icons-dired--overlays-in (point-min) (point-max))))) - -(defun all-the-icons-dired--refresh () - "Display the icons of files in a dired buffer." - (all-the-icons-dired--remove-all-overlays) - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (when (dired-move-to-filename nil) - (let ((case-fold-search t)) - (when-let* ((file (dired-get-filename 'relative 'noerror)) - (icon (if (file-directory-p file) - (all-the-icons-icon-for-dir file - :face 'all-the-icons-dired-dir-face - :v-adjust all-the-icons-dired-v-adjust) - (apply 'all-the-icons-icon-for-file file - (append - `(:v-adjust ,all-the-icons-dired-v-adjust) - (when all-the-icons-dired-monochrome - `(:face ,(face-at-point)))))))) - (if (member file '("." "..")) - (all-the-icons-dired--add-overlay (dired-move-to-filename) " \t") - (all-the-icons-dired--add-overlay (dired-move-to-filename) (concat icon "\t")))))) - (forward-line 1)))) - -(defun all-the-icons-dired--refresh-advice (fn &rest args) - "Advice function for FN with ARGS." - (prog1 (apply fn args) - (when all-the-icons-dired-mode - (all-the-icons-dired--refresh)))) - -(defvar all-the-icons-dired-advice-alist - '((dired-aux dired-do-redisplay all-the-icons-dired--refresh-advice) - (dired-aux dired-create-directory all-the-icons-dired--refresh-advice) - (dired-aux dired-do-create-files all-the-icons-dired--refresh-advice) - (dired-aux dired-do-kill-lines all-the-icons-dired--refresh-advice) - (dired-aux dired-do-rename all-the-icons-dired--refresh-advice) - (dired-aux dired-insert-subdir all-the-icons-dired--refresh-advice) - (dired-aux dired-kill-subdir all-the-icons-dired--refresh-advice) - (dired wdired-abort-changes all-the-icons-dired--refresh-advice) - (dired dired-internal-do-deletions all-the-icons-dired--refresh-advice) - (dired-narrow dired-narrow--internal all-the-icons-dired--refresh-advice) - (dired-subtree dired-subtree-insert all-the-icons-dired--refresh-advice) - (dired-subtree dired-subtree-remove all-the-icons-dired--refresh-advice) - (dired dired-readin all-the-icons-dired--refresh-advice) - (dired dired-revert all-the-icons-dired--refresh-advice) - (find-dired find-dired-sentinel all-the-icons-dired--refresh-advice)) - "A list of file, adviced function, and advice function.") - -(defun all-the-icons-dired--setup () - "Setup `all-the-icons-dired'." - (setq-local tab-width 1) - (pcase-dolist (`(,file ,sym ,fn) all-the-icons-dired-advice-alist) - (with-eval-after-load file - (advice-add sym :around fn))) - (all-the-icons-dired--refresh)) - -(defun all-the-icons-dired--teardown () - "Functions used as advice when redisplaying buffer." - (kill-local-variable 'tab-width) - (pcase-dolist (`(,file ,sym ,fn) all-the-icons-dired-advice-alist) - (with-eval-after-load file - (advice-remove sym fn))) - (all-the-icons-dired--remove-all-overlays)) - -;;;###autoload -(define-minor-mode all-the-icons-dired-mode - "Display all-the-icons icon for each file in a dired buffer." - :lighter " all-the-icons-dired-mode" - (when (derived-mode-p 'dired-mode) - (if all-the-icons-dired-mode - (all-the-icons-dired--setup) - (all-the-icons-dired--teardown)))) - -(provide 'all-the-icons-dired) -;;; all-the-icons-dired.el ends here diff --git a/org/elpa/dashboard-20220409.620/banners/1.txt b/org/elpa/dashboard-20220409.620/banners/1.txt new file mode 100644 index 0000000..8bd71a7 --- /dev/null +++ b/org/elpa/dashboard-20220409.620/banners/1.txt @@ -0,0 +1,8 @@ + +######## ## ## ### ###### ###### +## ### ### ## ## ## ## ## ## +## #### #### ## ## ## ## +###### ## ### ## ## ## ## ###### +## ## ## ######### ## ## +## ## ## ## ## ## ## ## ## +######## ## ## ## ## ###### ###### diff --git a/org/elpa/dashboard-20220409.620/banners/2.txt b/org/elpa/dashboard-20220409.620/banners/2.txt new file mode 100644 index 0000000..73b761b --- /dev/null +++ b/org/elpa/dashboard-20220409.620/banners/2.txt @@ -0,0 +1,6 @@ + _______ .___ ___. ___ ______ _______. +| ____|| \/ | / \ / | / | +| |__ | \ / | / ^ \ | ,----' | (----` +| __| | |\/| | / /_\ \ | | \ \ +| |____ | | | | / _____ \ | `----.----) | +|_______||__| |__| /__/ \__\ \______|_______/ diff --git a/org/elpa/dashboard-20220409.620/banners/3.txt b/org/elpa/dashboard-20220409.620/banners/3.txt new file mode 100644 index 0000000..3abfd82 --- /dev/null +++ b/org/elpa/dashboard-20220409.620/banners/3.txt @@ -0,0 +1,8 @@ + _______ _____ ______ ________ ________ ________ +|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\ +\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_ + \ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \ + \ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \ + \ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \ + \|_______|\|__| \|__|\|__|\|__|\|_______|\_________\ + \|_________| diff --git a/org/elpa/dashboard-20220409.620/banners/4.txt b/org/elpa/dashboard-20220409.620/banners/4.txt new file mode 100644 index 0000000..d82d67c --- /dev/null +++ b/org/elpa/dashboard-20220409.620/banners/4.txt @@ -0,0 +1,17 @@ +_ ___ _ _ +_ ___ __ ___ __ _ ___ +__ _ ___ __ ___ + _ ___ _ + _ _ __ _ + ___ __ _ + __ _ + _ _ _ + _ _ _ + _ _ _ + __ ___ + _ _ _ _ + _ _ + _ _ + _ _ + _ +__ diff --git a/org/elpa/dashboard-20220409.620/banners/emacs.png b/org/elpa/dashboard-20220409.620/banners/emacs.png new file mode 100644 index 0000000000000000000000000000000000000000..718b071189247cffc3dd1482d388dcbe35783196 GIT binary patch literal 43759 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 R@xcH9002ovPDHLkV1oEFC}RKs literal 0 HcmV?d00001 diff --git a/org/elpa/dashboard-20220409.620/banners/logo.png b/org/elpa/dashboard-20220409.620/banners/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c9de00c705e2f4f16d2dc36ba7a7952d88c865ab GIT binary patch literal 32305 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 Q_y7O^07*qoM6N<$f@+AI_y7O^ literal 0 HcmV?d00001 diff --git a/org/elpa/dashboard-20220409.620/dashboard-autoloads.el b/org/elpa/dashboard-20220409.620/dashboard-autoloads.el new file mode 100644 index 0000000..6d2d64a --- /dev/null +++ b/org/elpa/dashboard-20220409.620/dashboard-autoloads.el @@ -0,0 +1,39 @@ +;;; dashboard-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dashboard" "dashboard.el" (0 0 0 0)) +;;; Generated autoloads from dashboard.el + +(autoload 'dashboard-setup-startup-hook "dashboard" "\ +Setup post initialization hooks. +If a command line argument is provided, assume a filename and skip displaying +Dashboard." nil nil) + +(register-definition-prefixes "dashboard" '("dashboard-")) + +;;;*** + +;;;### (autoloads nil "dashboard-widgets" "dashboard-widgets.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from dashboard-widgets.el + +(register-definition-prefixes "dashboard-widgets" '("dashboard-" "org-time-less-p" "recentf-list")) + +;;;*** + +;;;### (autoloads nil nil ("dashboard-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dashboard-autoloads.el ends here diff --git a/org/elpa/dashboard-20220409.620/dashboard-pkg.el b/org/elpa/dashboard-20220409.620/dashboard-pkg.el new file mode 100644 index 0000000..6b8e0da --- /dev/null +++ b/org/elpa/dashboard-20220409.620/dashboard-pkg.el @@ -0,0 +1,12 @@ +(define-package "dashboard" "20220409.620" "A startup screen extracted from Spacemacs" + '((emacs "26.1")) + :commit "09290bf700cc269ad3c07d9518cd758b90971fcd" :authors + '(("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com")) + :maintainer + '("Jesús Martínez" . "jesusmartinez93@gmail.com") + :keywords + '("startup" "screen" "tools" "dashboard") + :url "https://github.com/emacs-dashboard/emacs-dashboard") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/org/elpa/dashboard-20220409.620/dashboard-widgets.el b/org/elpa/dashboard-20220409.620/dashboard-widgets.el new file mode 100644 index 0000000..8168afe --- /dev/null +++ b/org/elpa/dashboard-20220409.620/dashboard-widgets.el @@ -0,0 +1,1267 @@ +;;; dashboard-widgets.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2022 emacs-dashboard maintainers +;; +;; Author : Rakan Al-Hneiti +;; Maintainer : Jesús Martínez +;; Shen, Jen-Chieh +;; URL : https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "26.1")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projects (projectile or project.el), org-agenda and more. + +;;; Code: + +(require 'cl-lib) +(require 'subr-x) +(require 'image) + +;; Compiler pacifier +(declare-function all-the-icons-icon-for-dir "ext:all-the-icons.el") +(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") +(declare-function all-the-icons-fileicon "ext:data-fileicons.el") +(declare-function all-the-icons-octicon "ext:data-octicons.el") +(declare-function bookmark-get-filename "ext:bookmark.el") +(declare-function bookmark-all-names "ext:bookmark.el") +(declare-function calendar-date-compare "ext:calendar.el") +(declare-function projectile-cleanup-known-projects "ext:projectile.el") +(declare-function projectile-load-known-projects "ext:projectile.el") +(declare-function projectile-mode "ext:projectile.el") +(declare-function projectile-relevant-known-projects "ext:projectile.el") +;;; project.el in Emacs 26 does not contain this function +(declare-function project-known-project-roots "ext:project.el" nil t) +(declare-function project-forget-zombie-projects "ext:project.el" nil t) +(declare-function org-agenda-format-item "ext:org-agenda.el") +(declare-function org-compile-prefix-format "ext:org-agenda.el") +(declare-function org-entry-is-done-p "ext:org.el") +(declare-function org-in-archived-heading-p "ext:org.el") +(declare-function org-get-category "ext:org.el") +(declare-function org-get-deadline-time "ext:org.el") +(declare-function org-get-heading "ext:org.el") +(declare-function org-get-scheduled-time "ext:org.el") +(declare-function org-get-tags "ext:org.el") +(declare-function org-map-entries "ext:org.el") +(declare-function org-outline-level "ext:org.el") +(declare-function org-today "ext:org.el") +(declare-function org-get-todo-face "ext:org.el") +(declare-function org-get-todo-state "ext:org.el") +(declare-function org-entry-is-todo-p "ext:org.el") +(declare-function org-release-buffers "ext:org.el") +(declare-function recentf-cleanup "ext:recentf.el") +(defalias 'org-time-less-p 'time-less-p) +(defvar org-level-faces) +(defvar org-agenda-new-buffers) +(defvar org-agenda-prefix-format) +(defvar org-agenda-todo-keyword-format) +(defvar org-todo-keywords-1) +(defvar all-the-icons-dir-icon-alist) +(defvar package-activated-list) + +(defcustom dashboard-page-separator "\n\n" + "Separator to use between the different pages." + :type 'string + :group 'dashboard) + +(defcustom dashboard-image-banner-max-height 0 + "Maximum height of banner image. + +This setting applies only if Emacs supports image transforms or +compiled with Imagemagick support. When value is non-zero the image +banner will be resized to the specified height in pixels, with aspect +ratio preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-image-banner-max-width 0 + "Maximum width of banner image. + +This setting applies if Emacs supports image transforms or compiled +with Imagemagick support. When value is non-zero the image banner +will be resized to the specified width in pixels, with aspect ratio +preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-set-heading-icons nil + "When non nil, heading sections will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-file-icons nil + "When non nil, file lists will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-navigator nil + "When non nil, a navigator will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-init-info t + "When non nil, init info will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-footer t + "When non nil, a footer will be displayed at the bottom." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-footer-messages + '("The one true editor, Emacs!" + "Who the hell uses VIM anyway? Go Evil!" + "Free as free speech, free as free Beer" + "Happy coding!" + "Vi Vi Vi, the editor of the beast" + "Welcome to the church of Emacs" + "While any text editor can save your files, only Emacs can save your soul" + "I showed you my source code, pls respond") + "A list of messages, one of which dashboard chooses to display." + :type 'list + :group 'dashboard) + +(defcustom dashboard-show-shortcuts t + "Whether to show shortcut keys for each section." + :type 'boolean + :group 'dashboard) + +(defconst dashboard-banners-directory + (concat (file-name-directory (locate-library "dashboard")) "banners/") + "Default banner directory.") + +(defconst dashboard-banner-official-png + (concat dashboard-banners-directory "emacs.png") + "Emacs banner image.") + +(defconst dashboard-banner-logo-png + (concat dashboard-banners-directory "logo.png") + "Emacs banner image.") + +(defconst dashboard-banner-length 75 + "Width of a banner.") + +(defcustom dashboard-banner-logo-title "Welcome to Emacs!" + "Specify the startup banner." + :type 'string + :group 'dashboard) + +(defcustom dashboard-navigator-buttons nil + "Specify the navigator buttons. +The format is: 'icon title help action face prefix suffix'. + +Example: +'((\"☆\" \"Star\" \"Show stars\" (lambda (&rest _) + (show-stars)) 'warning \"[\" \"]\"))" + :type '(repeat (repeat (list string string string function symbol string string))) + :group 'dashboard) + +(defcustom dashboard-init-info + (lambda () + (let ((package-count 0) (time (emacs-init-time))) + (when (bound-and-true-p package-alist) + (setq package-count (length package-activated-list))) + (when (boundp 'straight--profile-cache) + (setq package-count (+ (hash-table-count straight--profile-cache) package-count))) + (if (zerop package-count) + (format "Emacs started in %s" time) + (format "%d packages loaded in %s" package-count time)))) + "Init info with packages loaded and init time." + :type '(function string) + :group 'dashboard) + +(defcustom dashboard-footer + (nth (random (1- (1+ (length dashboard-footer-messages)))) dashboard-footer-messages) + "A footer with some short message." + :type 'string + :group 'dashboard) + +(defcustom dashboard-footer-icon + (if (and (display-graphic-p) + (or (fboundp 'all-the-icons-fileicon) + (require 'all-the-icons nil 'noerror))) + (all-the-icons-fileicon "emacs" + :height 1.1 + :v-adjust -0.05 + :face 'font-lock-keyword-face) + (propertize ">" 'face 'dashboard-footer)) + "Footer's icon." + :type 'string + :group 'dashboard) + +(defcustom dashboard-startup-banner 'official + "Specify the startup banner. +Default value is `official', it displays the Emacs logo. `logo' displays Emacs +alternative logo. An integer value is the index of text banner. A string +value must be a path to a .PNG or .TXT file. If the value is nil then no banner +is displayed." + :type '(choice (const :tag "offical" official) + (const :tag "logo" logo) + (string :tag "a png or txt path")) + :group 'dashboard) + +(defcustom dashboard-buffer-last-width nil + "Previous width of dashboard-buffer." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-item-generators + '((recents . dashboard-insert-recents) + (bookmarks . dashboard-insert-bookmarks) + (projects . dashboard-insert-projects) + (agenda . dashboard-insert-agenda) + (registers . dashboard-insert-registers)) + "Association list of items to how to generate in the startup buffer. +Will be of the form `(list-type . list-function)'. +Possible values for list-type are: `recents', `bookmarks', `projects', +`agenda' ,`registers'." + :type '(repeat (alist :key-type symbol :value-type function)) + :group 'dashboard) + +(defcustom dashboard-projects-backend 'projectile + "The package that supplies the list of recent projects. +With the value `projectile', the projects widget uses the package +projectile (available in MELPA). With the value `project-el', +the widget uses the package project (available in GNU ELPA). + +To activate the projects widget, add e.g. `(projects . 10)' to +`dashboard-items' after making sure the necessary package is +installed." + :type '(choice (const :tag "Use projectile" projectile) + (const :tag "Use project.el" project-el)) + :group 'dashboard) + +(defcustom dashboard-items + '((recents . 5) + (bookmarks . 5) + (agenda . 5)) + "Association list of items to show in the startup buffer. +Will be of the form `(list-type . list-size)'. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'." + :type '(repeat (alist :key-type symbol :value-type integer)) + :group 'dashboard) + +(defcustom dashboard-item-shortcuts + '((recents . "r") + (bookmarks . "m") + (projects . "p") + (agenda . "a") + (registers . "e")) + "Association list of items and their corresponding shortcuts. +Will be of the form `(list-type . keys)' as understood by `(kbd keys)'. +If nil, shortcuts are disabled. If an entry's value is nil, that item's +shortcut is disbaled. See `dashboard-items' for possible values of list-type.'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defcustom dashboard-item-names nil + "Association list of item heading names. +When an item is nil or not present, the default name is used. +Will be of the form `(default-name . new-name)'." + :type '(alist :key-type string :value-type string) + :options '("Recent Files:" "Bookmarks:" "Agenda for today:" + "Agenda for the coming week:" "Registers:" "Projects:") + :group 'dashboard) + +(defcustom dashboard-items-default-length 20 + "Length used for startup lists with otherwise unspecified bounds. +Set to nil for unbounded." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-heading-icons + '((recents . "history") + (bookmarks . "bookmark") + (agenda . "calendar") + (projects . "rocket") + (registers . "database")) + "Association list for the icons of the heading sections. +Will be of the form `(list-type . icon-name-string)`. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defcustom dashboard-path-style nil + "Style to display path." + :type '(choice + (const :tag "No specify" nil) + (const :tag "Truncate the beginning part of the path" truncate-beginning) + (const :tag "Truncate the middle part of the path" truncate-middle) + (const :tag "Truncate the end part of the path" truncate-end)) + :group 'dashboard) + +(defcustom dashboard-path-max-length 70 + "Maximum length for path to display." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-path-shorten-string "..." + "String the that displays in the center of the path." + :type 'string + :group 'dashboard) + +(defvar recentf-list nil) + +(defvar dashboard-buffer-name) + +;; +;; Faces +;; +(defface dashboard-text-banner + '((t (:inherit font-lock-keyword-face))) + "Face used for text banners." + :group 'dashboard) + +(defface dashboard-banner-logo-title + '((t :inherit default)) + "Face used for the banner title." + :group 'dashboard) + +(defface dashboard-navigator + '((t (:inherit font-lock-keyword-face))) + "Face used for the navigator." + :group 'dashboard) + +(defface dashboard-heading + '((t (:inherit font-lock-keyword-face))) + "Face used for widget headings." + :group 'dashboard) + +(defface dashboard-items-face + '((t (:inherit widget-button))) + "Face used for items." + :group 'dashboard) + +(defface dashboard-no-items-face + '((t (:inherit widget-button))) + "Face used for no items." + :group 'dashboard) + +(defface dashboard-footer + '((t (:inherit font-lock-doc-face))) + "Face used for widget headings." + :group 'dashboard) + +(define-obsolete-face-alias + 'dashboard-text-banner-face 'dashboard-text-banner "1.2.6") +(define-obsolete-face-alias + 'dashboard-banner-logo-title-face 'dashboard-banner-logo-title "1.2.6") +(define-obsolete-face-alias + 'dashboard-heading-face 'dashboard-heading "1.2.6") + +;; +;; Util +;; +(defmacro dashboard-mute-apply (&rest body) + "Execute BODY without message." + (declare (indent 0) (debug t)) + `(let (message-log-max) + (with-temp-message (or (current-message) nil) + (let ((inhibit-message t)) ,@body)))) + +(defun dashboard-funcall-fboundp (fnc &rest args) + "Call FNC with ARGS if exists." + (when (fboundp fnc) (if args (funcall fnc args) (funcall fnc)))) + +;; +;; Generic widget helpers +;; +(defun dashboard-subseq (seq end) + "Return the subsequence of SEQ from 0 to END." + (let ((len (length seq))) + (butlast seq (- len (min len end))))) + +(defun dashboard-get-shortcut-name (item) + "Get the shortcut name to be used for ITEM." + (let ((elem (rassoc item dashboard-item-shortcuts))) + (and elem (car elem)))) + +(defun dashboard-get-shortcut (item) + "Get the shortcut to be used for ITEM." + (let ((elem (assq item dashboard-item-shortcuts))) + (and elem (cdr elem)))) + +(defmacro dashboard-insert-shortcut (shortcut-id + shortcut-char + search-label + &optional no-next-line) + "Insert a shortcut SHORTCUT-CHAR for a given SEARCH-LABEL. +Optionally, provide NO-NEXT-LINE to move the cursor forward a line." + (let* (;; Ensure punctuation and upper case in search string is not + ;; used to construct the `defun' + (name (downcase (replace-regexp-in-string "[[:punct:]]+" "" (format "%s" search-label)))) + ;; remove symbol quote + (sym (intern (replace-regexp-in-string "'" "" (format "dashboard-jump-to-%s" shortcut-id))))) + `(progn + (eval-when-compile (defvar dashboard-mode-map)) + (defun ,sym nil + ,(concat "Jump to " name ". This code is dynamically generated in `dashboard-insert-shortcut'.") + (interactive) + (unless (search-forward ,search-label (point-max) t) + (search-backward ,search-label (point-min) t)) + ,@(unless no-next-line '((forward-line 1))) + (back-to-indentation)) + (eval-after-load 'dashboard + (define-key dashboard-mode-map ,shortcut-char ',sym))))) + +(defun dashboard-append (msg &optional _messagebuf) + "Append MSG to dashboard buffer. +If MESSAGEBUF is not nil then MSG is also written in message buffer." + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (goto-char (point-max)) + (let (buffer-read-only) (insert msg)))) + +(defun dashboard-modify-heading-icons (alist) + "Append ALIST items to `dashboard-heading-icons' to modify icons." + (dolist (icon alist) + (add-to-list 'dashboard-heading-icons icon))) + +(defun dashboard-insert-page-break () + "Insert a page break line in dashboard buffer." + (dashboard-append dashboard-page-separator)) + +(defun dashboard-insert-heading (heading &optional shortcut) + "Insert a widget HEADING in dashboard buffer, adding SHORTCUT if provided." + (when (and (display-graphic-p) dashboard-set-heading-icons) + ;; Try loading `all-the-icons' + (unless (or (fboundp 'all-the-icons-octicon) + (require 'all-the-icons nil 'noerror)) + (error "Package `all-the-icons' isn't installed")) + + (insert (cond + ((string-equal heading "Recent Files:") + (all-the-icons-octicon (cdr (assoc 'recents dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Bookmarks:") + (all-the-icons-octicon (cdr (assoc 'bookmarks dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((or (string-equal heading "Agenda for today:") + (string-equal heading "Agenda for the coming week:")) + (all-the-icons-octicon (cdr (assoc 'agenda dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Registers:") + (all-the-icons-octicon (cdr (assoc 'registers dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Projects:") + (all-the-icons-octicon (cdr (assoc 'projects dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + (t " "))) + (insert " ")) + + (insert (propertize heading 'face 'dashboard-heading)) + + ;; Turn the inserted heading into an overlay, so that we may freely change + ;; its name without breaking any of the functions that expect the default name. + ;; If there isn't a suitable entry in `dashboard-item-names', + ;; we fallback to using HEADING. In that case we still want it to be an + ;; overlay to maintain consistent behavior (such as the point movement) + ;; between modified and default headings. + (let ((ov (make-overlay (- (point) (length heading)) (point) nil t))) + (overlay-put ov 'display (or (cdr (assoc heading dashboard-item-names)) heading)) + (overlay-put ov 'face 'dashboard-heading)) + (when shortcut (insert (format " (%s)" shortcut)))) + +(defun dashboard-center-line (string) + "Center a STRING accoring to it's size." + (insert (make-string (max 0 (floor (/ (- dashboard-banner-length + (+ (length string) 1)) 2))) ?\ ))) + +;; +;; BANNER +;; +(defun dashboard-insert-ascii-banner-centered (file) + "Insert banner from FILE." + (let ((ascii-banner + (with-temp-buffer + (insert-file-contents file) + (let ((banner-width 0)) + (while (not (eobp)) + (let ((line-length (- (line-end-position) (line-beginning-position)))) + (if (< banner-width line-length) + (setq banner-width line-length))) + (forward-line 1)) + (goto-char 0) + (let ((margin + (max 0 (floor (/ (- dashboard-banner-length banner-width) 2))))) + (while (not (eobp)) + (insert (make-string margin ?\ )) + (forward-line 1)))) + (buffer-string)))) + (put-text-property 0 (length ascii-banner) 'face 'dashboard-text-banner ascii-banner) + (insert ascii-banner))) + +(defun dashboard--type-is-gif-p (image-path) + "Return if image is a gif. +String -> bool. +Argument IMAGE-PATH path to the image." + (eq 'gif (image-type image-path))) + +(defun dashboard-insert-image-banner (banner) + "Display an image BANNER." + (when (file-exists-p banner) + (let* ((title dashboard-banner-logo-title) + (size-props + (append (when (> dashboard-image-banner-max-width 0) + (list :max-width dashboard-image-banner-max-width)) + (when (> dashboard-image-banner-max-height 0) + (list :max-height dashboard-image-banner-max-height)))) + (spec + (cond ((dashboard--type-is-gif-p banner) + (create-image banner)) + ((image-type-available-p 'imagemagick) + (apply 'create-image banner 'imagemagick nil size-props)) + (t + (apply 'create-image banner nil nil + (when (and (fboundp 'image-transforms-p) + (memq 'scale (funcall 'image-transforms-p))) + size-props))))) + ;; TODO: For some reason, `elisp-lint' is reporting error void + ;; function `image-size'. + (size (when (fboundp 'image-size) (image-size spec))) + (width (car size)) + (left-margin (max 0 (floor (- dashboard-banner-length width) 2)))) + (goto-char (point-min)) + (insert "\n") + (insert (make-string left-margin ?\ )) + (insert-image spec) + (when (dashboard--type-is-gif-p banner) (image-animate spec 0 t)) + (insert "\n\n") + (when title + (dashboard-center-line title) + (insert (format "%s\n\n" (propertize title 'face 'dashboard-banner-logo-title))))))) + +;; +;; INIT INFO +;; +(defun dashboard-insert-init-info () + "Insert init info when `dashboard-set-init-info' is t." + (when dashboard-set-init-info + (let ((init-info (if (functionp dashboard-init-info) + (funcall dashboard-init-info) + dashboard-init-info))) + (dashboard-center-line init-info) + (insert (propertize init-info 'face 'font-lock-comment-face))))) + +(defun dashboard-get-banner-path (index) + "Return the full path to banner with index INDEX." + (concat dashboard-banners-directory (format "%d.txt" index))) + +(defun dashboard-choose-banner () + "Return the full path of a banner based on the dotfile value." + (when dashboard-startup-banner + (cond ((eq 'official dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-official-png + (dashboard-get-banner-path 1))) + ((eq 'logo dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-logo-png + (dashboard-get-banner-path 1))) + ((integerp dashboard-startup-banner) + (dashboard-get-banner-path dashboard-startup-banner)) + ((stringp dashboard-startup-banner) + (if (and (file-exists-p dashboard-startup-banner) + (or (string-suffix-p ".txt" dashboard-startup-banner) + (and (display-graphic-p) + (image-type-available-p (intern (file-name-extension + dashboard-startup-banner)))))) + dashboard-startup-banner + (message "could not find banner %s, use default instead" dashboard-startup-banner) + (dashboard-get-banner-path 1))) + (t (dashboard-get-banner-path 1))))) + +(defun dashboard-insert-banner () + "Insert Banner at the top of the dashboard." + (goto-char (point-max)) + (let ((banner (dashboard-choose-banner)) buffer-read-only) + (when banner + (if (image-type-available-p (intern (file-name-extension banner))) + (dashboard-insert-image-banner banner) + (dashboard-insert-ascii-banner-centered banner)) + (dashboard-insert-navigator) + (dashboard-insert-init-info)))) + +(defun dashboard-insert-navigator () + "Insert Navigator of the dashboard." + (when (and dashboard-set-navigator dashboard-navigator-buttons) + (dolist (line dashboard-navigator-buttons) + (dolist (btn line) + (let* ((icon (car btn)) + (title (cadr btn)) + (help (or (cadr (cdr btn)) "")) + (action (or (cadr (cddr btn)) #'ignore)) + (face (or (cadr (cddr (cdr btn))) 'dashboard-navigator)) + (prefix (or (cadr (cddr (cddr btn))) (propertize "[" 'face face))) + (suffix (or (cadr (cddr (cddr (cdr btn)))) (propertize "]" 'face face)))) + (widget-create 'item + :tag (concat + (when icon + (propertize icon 'face + (let ((prop-face (get-text-property 0 'face icon))) + (if prop-face + `(:inherit ,prop-face :inherit ,face) + `(:inherit ,face))))) + (when (and icon title + (not (string-equal icon "")) + (not (string-equal title ""))) + (propertize " " 'face 'variable-pitch)) + (when title (propertize title 'face face))) + :help-echo help + :action action + :button-face 'dashboard-items-face + :mouse-face 'highlight + :button-prefix prefix + :button-suffix suffix + :format "%[%t%]") + (insert " "))) + (let* ((width (current-column))) + (beginning-of-line) + (dashboard-center-line (make-string width ?\s)) + (end-of-line)) + (insert "\n")) + (insert "\n"))) + +(defmacro dashboard-insert-section (section-name list list-size shortcut-id shortcut-char action &rest widget-params) + "Add a section with SECTION-NAME and LIST of LIST-SIZE items to the dashboard. +SHORTCUT-CHAR is the keyboard shortcut used to access the section. +ACTION is theaction taken when the user activates the widget button. +WIDGET-PARAMS are passed to the \"widget-create\" function." + `(progn + (dashboard-insert-heading ,section-name + (if (and ,list ,shortcut-char dashboard-show-shortcuts) ,shortcut-char)) + (if ,list + (when (and (dashboard-insert-section-list + ,section-name + (dashboard-subseq ,list ,list-size) + ,action + ,@widget-params) + ,shortcut-id ,shortcut-char) + (dashboard-insert-shortcut ,shortcut-id ,shortcut-char ,section-name)) + (insert (propertize "\n --- No items ---" 'face 'dashboard-no-items-face))))) + +;; +;; Section list +;; +(defmacro dashboard-insert-section-list (section-name list action &rest rest) + "Insert into SECTION-NAME a LIST of items, expanding ACTION and passing REST +to widget creation." + `(when (car ,list) + (mapc + (lambda (el) + (let ((tag ,@rest)) + (insert "\n ") + + (when (and (display-graphic-p) + dashboard-set-file-icons + (or (fboundp 'all-the-icons-icon-for-dir) + (require 'all-the-icons nil 'noerror))) + (let* ((path (car (last (split-string ,@rest " - ")))) + (icon (if (and (not (file-remote-p path)) + (file-directory-p path)) + (all-the-icons-icon-for-dir path nil "") + (cond + ((or (string-equal ,section-name "Agenda for today:") + (string-equal ,section-name "Agenda for the coming week:")) + (all-the-icons-octicon "primitive-dot" :height 1.0 :v-adjust 0.01)) + ((file-remote-p path) + (all-the-icons-octicon "radio-tower" :height 1.0 :v-adjust 0.01)) + (t (all-the-icons-icon-for-file (file-name-nondirectory path) + :v-adjust -0.05)))))) + (setq tag (concat icon " " ,@rest)))) + + (widget-create 'item + :tag tag + :action ,action + :button-face 'dashboard-items-face + :mouse-face 'highlight + :button-prefix "" + :button-suffix "" + :format "%[%t%]"))) + ,list))) + +;; Footer +(defun dashboard-random-footer () + "Return a random footer from `dashboard-footer-messages'." + (nth (random (length dashboard-footer-messages)) dashboard-footer-messages)) + +(defun dashboard-insert-footer () + "Insert footer of dashboard." + (when-let ((footer (and dashboard-set-footer (dashboard-random-footer)))) + (insert "\n") + (dashboard-center-line footer) + (insert dashboard-footer-icon) + (insert " ") + (insert (propertize footer 'face 'dashboard-footer)) + (insert "\n"))) + +;; +;; Truncate +;; +(defcustom dashboard-shorten-by-window-width nil + "Shorten path by window edges." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-shorten-path-offset 0 + "Shorten path offset on the edges." + :type 'integer + :group 'dashboard) + +(defun dashboard-f-filename (path) + "Return file name from PATH." + (file-name-nondirectory path)) + +(defun dashboard-f-base (path) + "Return directory name from PATH." + (file-name-nondirectory (directory-file-name (file-name-directory path)))) + +(defun dashboard-shorten-path-beginning (path) + "Shorten PATH from beginning if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + front) + (if (<= len-path dashboard-path-max-length) path + (setq front (ignore-errors (substring path (- len-path len-total) len-path))) + (if front (concat dashboard-path-shorten-string front) "")))) + +(defun dashboard-shorten-path-middle (path) + "Shorten PATH from middle if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + (center (/ len-total 2)) + (end-back center) + (start-front (- len-path center)) + back front) + (if (<= len-path dashboard-path-max-length) path + (setq back (substring path 0 end-back) + front (ignore-errors (substring path start-front len-path))) + (if front (concat back dashboard-path-shorten-string front) "")))) + +(defun dashboard-shorten-path-end (path) + "Shorten PATH from end if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + back) + (if (<= len-path dashboard-path-max-length) path + (setq back (ignore-errors (substring path 0 len-total))) + (if (and back (< 0 dashboard-path-max-length)) + (concat back dashboard-path-shorten-string) "")))) + +(defun dashboard--get-base-length (path type) + "Return the length of the base from the PATH by TYPE." + (let* ((is-dir (file-directory-p path)) + (base (if is-dir (dashboard-f-base path) (dashboard-f-filename path))) + (option (cl-case type + (recents 'dashboard-recentf-show-base) + (bookmarks 'dashboard-bookmarks-show-base) + (projects 'dashboard-projects-show-base))) + (option-val (symbol-value option)) + base-len) + (cl-case option-val + (`align (setq base-len (dashboard--align-length-by-type type))) + (`nil (setq base-len 0)) + (t (setq base-len (length base)))) + base-len)) + +(defun dashboard-shorten-path (path type) + "Shorten the PATH by TYPE." + (setq path (abbreviate-file-name path)) + (let ((dashboard-path-max-length + (if (and dashboard-path-style dashboard-shorten-by-window-width) + (- (window-width) (dashboard--get-base-length path type) + dashboard-shorten-path-offset) + dashboard-path-max-length))) + (cl-case dashboard-path-style + (truncate-beginning (dashboard-shorten-path-beginning path)) + (truncate-middle (dashboard-shorten-path-middle path)) + (truncate-end (dashboard-shorten-path-end path)) + (t path)))) + +(defun dashboard-shorten-paths (paths alist type) + "Shorten all path from PATHS by TYPE and store it to ALIST." + (let (lst-display abbrev (index 0)) + (setf (symbol-value alist) nil) ; reset + (dolist (item paths) + (setq abbrev (dashboard-shorten-path item type) + ;; Add salt here, and use for extraction. + ;; See function `dashboard-extract-key-path-alist'. + abbrev (format "%s|%s" index abbrev)) + ;; store `abbrev' as id; and `item' with value + (push (cons abbrev item) (symbol-value alist)) + (push abbrev lst-display) + (cl-incf index)) + (reverse lst-display))) + +(defun dashboard-extract-key-path-alist (key alist) + "Remove salt from KEY, and return true shorten path from ALIST." + (let* ((key (car (assoc key alist))) (split (split-string key "|"))) + (nth 1 split))) + +(defun dashboard-expand-path-alist (key alist) + "Get the full path (un-shorten) using KEY from ALIST." + (cdr (assoc key alist))) + +(defun dashboard--generate-align-format (fmt len) + "Return FMT after inserting align LEN." + (let ((pos (1+ (string-match-p "%s" fmt)))) + (concat (substring fmt 0 pos) + (concat "-" (number-to-string len)) + (substring fmt pos (length fmt))))) + +(defun dashboard--align-length-by-type (type) + "Return the align length by TYPE of the section." + (let ((len-item (cdr (assoc type dashboard-items))) (count 0) (align-length -1) + len-list base) + (cl-case type + (`recents + (require 'recentf) + (setq len-list (length recentf-list)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count recentf-list) + align-length (max align-length (length (dashboard-f-filename base)))) + (cl-incf count))) + (`bookmarks + (let ((bookmarks-lst (bookmark-all-names))) + (setq len-list (length bookmarks-lst)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count bookmarks-lst) + align-length (max align-length (length base))) + (cl-incf count)))) + (`projects + (let ((projects-lst (dashboard-projects-backend-load-projects))) + (setq len-list (length projects-lst)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count projects-lst) + align-length (max align-length (length (dashboard-f-base base)))) + (cl-incf count)))) + (t (error "Unknown type for align length: %s" type))) + align-length)) + +;; +;; Recentf +;; +(defcustom dashboard-recentf-show-base nil + "Show the base file name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-recentf-item-format "%s %s" + "Format to use when showing the base of the file name." + :type 'string + :group 'dashboard) + +(defvar dashboard-recentf-alist nil + "Alist records shorten's recent files and it's full paths.") + +(defvar dashboard--recentf-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-recents (list-size) + "Add the list of LIST-SIZE items from recently edited files." + (setq dashboard--recentf-cache-item-format nil) + (recentf-mode) + (dashboard-mute-apply (recentf-cleanup)) + (dashboard-insert-section + "Recent Files:" + (dashboard-shorten-paths recentf-list 'dashboard-recentf-alist 'recents) + list-size + 'recents + (dashboard-get-shortcut 'recents) + `(lambda (&rest _) + (find-file-existing (dashboard-expand-path-alist ,el dashboard-recentf-alist))) + (let* ((file (dashboard-expand-path-alist el dashboard-recentf-alist)) + (filename (dashboard-f-filename file)) + (path (dashboard-extract-key-path-alist el dashboard-recentf-alist))) + (cl-case dashboard-recentf-show-base + (`align + (unless dashboard--recentf-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'recents)) + (new-fmt (dashboard--generate-align-format + dashboard-recentf-item-format len-align))) + (setq dashboard--recentf-cache-item-format new-fmt))) + (format dashboard--recentf-cache-item-format filename path)) + (`nil path) + (t (format dashboard-recentf-item-format filename path)))))) + +;; +;; Bookmarks +;; +(defcustom dashboard-bookmarks-show-base t + "Show the base file name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-bookmarks-item-format "%s - %s" + "Format to use when showing the base of the file name." + :type 'string + :group 'dashboard) + +(defvar dashboard--bookmarks-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-bookmarks (list-size) + "Add the list of LIST-SIZE items of bookmarks." + (require 'bookmark) + (dashboard-insert-section + "Bookmarks:" + (dashboard-subseq (bookmark-all-names) list-size) + list-size + 'bookmarks + (dashboard-get-shortcut 'bookmarks) + `(lambda (&rest _) (bookmark-jump ,el)) + (if-let* ((filename el) + (path (bookmark-get-filename el)) + (path-shorten (dashboard-shorten-path path 'bookmarks))) + (cl-case dashboard-bookmarks-show-base + (`align + (unless dashboard--bookmarks-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'bookmarks)) + (new-fmt (dashboard--generate-align-format + dashboard-bookmarks-item-format len-align))) + (setq dashboard--bookmarks-cache-item-format new-fmt))) + (format dashboard--bookmarks-cache-item-format filename path-shorten)) + (`nil path-shorten) + (t (format dashboard-bookmarks-item-format filename path-shorten))) + el))) + +;; +;; Projects +;; +(defcustom dashboard-projects-switch-function + nil + "Custom function to switch to projects from dashboard. +If non-NIL, should be bound to a function with one argument. The function will +be called with the root directory of the project to switch to." + :type '(choice (const :tag "Default" nil) function) + :group 'dashboard) + +(defcustom dashboard-projects-show-base nil + "Show the project name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-projects-item-format "%s %s" + "Format to use when showing the base of the project name." + :type 'string + :group 'dashboard) + +(defvar dashboard-projects-alist nil + "Alist records the shorten's project paths and it's full paths.") + +(defvar dashboard--projects-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-projects (list-size) + "Add the list of LIST-SIZE items of projects." + (setq dashboard--projects-cache-item-format nil) + (dashboard-insert-section + "Projects:" + (dashboard-shorten-paths + (dashboard-subseq (dashboard-projects-backend-load-projects) list-size) + 'dashboard-projects-alist 'projects) + list-size + 'projects + (dashboard-get-shortcut 'projects) + `(lambda (&rest _) + (funcall (dashboard-projects-backend-switch-function) + (dashboard-expand-path-alist ,el dashboard-projects-alist))) + (let* ((file (dashboard-expand-path-alist el dashboard-projects-alist)) + (filename (dashboard-f-base file)) + (path (dashboard-extract-key-path-alist el dashboard-projects-alist))) + (cl-case dashboard-projects-show-base + (`align + (unless dashboard--projects-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'projects)) + (new-fmt (dashboard--generate-align-format + dashboard-projects-item-format len-align))) + (setq dashboard--projects-cache-item-format new-fmt))) + (format dashboard--projects-cache-item-format filename path)) + (`nil path) + (t (format dashboard-projects-item-format filename path)))))) + +(defun dashboard-projects-backend-load-projects () + "Depending on `dashboard-projects-backend' load corresponding backend. +Return function that returns a list of projects." + (cl-case dashboard-projects-backend + (`projectile + (require 'projectile) + (dashboard-mute-apply (projectile-cleanup-known-projects)) + (projectile-load-known-projects)) + (`project-el + (require 'project) + (dashboard-mute-apply (dashboard-funcall-fboundp #'project-forget-zombie-projects)) + (project-known-project-roots)) + (t + (display-warning '(dashboard) + "Invalid value for `dashboard-projects-backend'" + :error)))) + +(defun dashboard-projects-backend-switch-function () + "Return the function to switch to a project. +Custom variable `dashboard-projects-switch-function' variable takes preference +over custom backends." + (or dashboard-projects-switch-function + (cl-case dashboard-projects-backend + (`projectile 'projectile-switch-project-by-name) + (`project-el + (lambda (project) + "This function is used to switch to `PROJECT'." + (let ((default-directory project)) + (project-find-file)))) + (t + (display-warning '(dashboard) + "Invalid value for `dashboard-projects-backend'" + :error))))) + +;; +;; Org Agenda +;; +(defcustom dashboard-week-agenda t + "Show agenda weekly if its not nil." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-agenda-time-string-format "%Y-%m-%d" + "Format time of agenda entries." + :type 'string + :group 'dashboard) + +(defcustom dashboard-match-agenda-entry nil + "Match agenda to extra filter. +It is the MATCH attribute for `org-map-entries'" + :type 'string + :group 'dashboard) + +(defcustom dashboard-agenda-release-buffers nil + "If not nil use `org-release-buffers' after getting the entries." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-filter-agenda-entry 'dashboard-filter-agenda-by-time + "Function to filter `org-agenda' entries." + :type '(choice + (const :tag "No filter" dashboard-no-filter-agenda) + (const :tag "Filter by time" dashboard-filter-agenda-by-time) + (const :tag "Filter by todo" dashboard-filter-agenda-by-todo) + (function :tag "Custom function")) + :group 'dashboard) + +(defcustom dashboard-agenda-sort-strategy nil + "A list of strategies to sort the agenda. If nil agenda is not sorted." + :type '(repeat (choice (const time-up) (const time-down) + (const todo-state-up) (const todo-state-down))) + :group 'dashboard) + +(defcustom dashboard-agenda-prefix-format " %i %-12:c %s " + "Format for each entry in the agenda. +When the dashboard-agenda is created this format is inserted into +`org-agenda-prefix-format' as `dashboard-agenda' and compiled with +`org-compile-prefix-format' previous calling `dashboard-agenda-entry-format' for +each agenda entry." + :type 'string + :group 'dashboard) + +(defun dashboard-agenda-entry-format () + "Format agenda entry to show it on dashboard." + (let* ((scheduled-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (entry-time (or scheduled-time deadline-time)) + (item (org-agenda-format-item + (dashboard-agenda--formatted-time) + (dashboard-agenda--formatted-headline) + (org-outline-level) + (org-get-category) + (org-get-tags))) + (todo-state (org-get-todo-state)) + (todo-index (and todo-state + (length (member todo-state org-todo-keywords-1)))) + (entry-data (list 'dashboard-agenda-time entry-time + 'dashboard-agenda-todo-index todo-index + 'dashboard-agenda-file (buffer-file-name) + 'dashboard-agenda-loc (point)))) + (add-text-properties 0 (length item) entry-data item) + item)) + +(defun dashboard-agenda--formatted-headline () + "Set agenda faces to `HEADLINE' when face text property is nil." + (let* ((headline (org-get-heading t t t t)) + (todo (or (org-get-todo-state) "")) + (org-level-face (nth (- (org-outline-level) 1) org-level-faces)) + (todo-state (format org-agenda-todo-keyword-format todo))) + (when (null (get-text-property 0 'face headline)) + (add-face-text-property 0 (length headline) org-level-face t headline)) + (when (null (get-text-property 0 'face todo-state)) + (add-face-text-property 0 (length todo-state) (org-get-todo-face todo) t todo-state)) + (concat todo-state " " headline))) + +(defun dashboard-agenda--formatted-time () + "Get the scheduled or dead time of an entry. If no time is found return nil." + (when-let ((time (or (org-get-scheduled-time (point)) (org-get-deadline-time (point))))) + (format-time-string dashboard-agenda-time-string-format time))) + +(defun dashboard-due-date-for-agenda () + "Return due-date for agenda period." + (if dashboard-week-agenda + (time-add (current-time) (* 86400 8)) + (time-add (current-time) 86400))) + +(defun dashboard-filter-agenda-by-time () + "Include entry if it has a scheduled-time or deadline-time in the future. +An entry is included if this function returns nil and excluded if returns a +point." + (let ((scheduled-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (due-date (dashboard-due-date-for-agenda))) + (unless (and (not (org-entry-is-done-p)) + (not (org-in-archived-heading-p)) + (or (and scheduled-time + (org-time-less-p scheduled-time due-date)) + (and deadline-time + (org-time-less-p deadline-time due-date)))) + (point)))) + +(defun dashboard-filter-agenda-by-todo () + "Include entry if it is todo and not done. +An entry is included if this function returns nil and excluded +if returns a point." + (unless (and (org-entry-is-todo-p) + (not (org-entry-is-done-p)) + (not (org-in-archived-heading-p))) + (point))) + +(defun dashboard-no-filter-agenda () + "No filter agenda entries." + (when (org-entry-is-done-p) (point))) + +(defun dashboard-get-agenda () + "Get agenda items for today or for a week from now." + (if-let ((prefix-format (assoc 'dashboard-agenda org-agenda-prefix-format))) + (setcdr prefix-format dashboard-agenda-prefix-format) + (push (cons 'dashboard-agenda dashboard-agenda-prefix-format) org-agenda-prefix-format)) + (org-compile-prefix-format 'dashboard-agenda) + (prog1 (org-map-entries 'dashboard-agenda-entry-format + dashboard-match-agenda-entry + 'agenda + dashboard-filter-agenda-entry) + (dashboard-agenda--release-buffers))) + +(defun dashboard-agenda--release-buffers () + "Release agenda buffers buffers. +This is what `org-agenda-exit' do." + (when dashboard-agenda-release-buffers + (org-release-buffers org-agenda-new-buffers) + (setq org-agenda-new-buffers nil))) + +(defun dashboard-agenda--sorted-agenda () + "Return agenda sorted by time. +For now, it only works when dashboard-agenda has been filter by time +and dashboard-agenda-sort is not nil." + (let ((agenda (dashboard-get-agenda)) + (sort-function (dashboard-agenda--sort-function))) + (sort agenda sort-function))) + +(defun dashboard-agenda--sort-function () + "Get the function use to sorted the agenda. +Depending on the list `dashboard-agenda-sorting-strategy' use this strategies to +build a predicate to compare each enty. +This is similar as `org-entries-lessp' but with a different aproach." + (dashboard-agenda--build-sort-function dashboard-agenda-sort-strategy)) + +(defun dashboard-agenda--build-sort-function (strategies) + "Build a predicate to sort the dashboard agenda. +If `STRATEGIES' is nil then sort using the nil predicate. Look for the strategy +predicate, the attributes of the entry and compare entries. If no predicate is +found for the strategy it uses nil predicate." + (if (null strategies) (lambda (_dont _care) nil) + (let ((predicate (dashboard-agenda--build-sort-function-predicate + (car strategies))) + (attribute (dashboard-agenda--build-sort-function-attribute + (car strategies)))) + (if (null predicate) (lambda (_dont _care) nil) + (lambda (entry1 entry2) + (dashboard-agenda--compare-entries entry1 entry2 (cdr strategies) + predicate attribute)))))) + +(defun dashboard-agenda--build-sort-function-predicate (strategy) + "Return the predicate to compare two entryes depending on the `STRATEGY'." + (cl-case strategy + (`time-up 'org-time-less-p) + (`time-down (lambda (a b) (org-time-less-p b a))) + (`todo-state-up '>) + (`todo-state-down '<))) + +(defun dashboard-agenda--build-sort-function-attribute (strategy) + "Return the argument to compare two entries depending to the `STRATEGY'." + (cond + ((memq strategy '(time-up time-down)) 'dashboard-agenda-time) + ((memq strategy '(todo-state-up todo-state-down)) 'dashboard-agenda-todo-index) + (t nil))) + +(defun dashboard-agenda--compare-entries (entry1 entry2 strategies predicate attribute) + "Compare `ENTRY1' and `ENTRY2' by `ATTRIBUTE' using `PREDICATE'. +If both attributes are nil or equals the next strategy in `STRATEGIES' is used +to compare." + (let ((arg1 (get-text-property 0 attribute entry1)) + (arg2 (get-text-property 0 attribute entry2))) + (cond + ((or (and (null arg1) (null arg2)) (equal arg1 arg2)) + (apply (dashboard-agenda--build-sort-function strategies) (list entry1 entry2))) + ((null arg1) nil) + ((null arg2) t) + (t (apply predicate (list arg1 arg2)))))) + +(defun dashboard-insert-agenda (list-size) + "Add the list of LIST-SIZE items of agenda." + (require 'org-agenda) + (dashboard-insert-section + (if dashboard-week-agenda + "Agenda for the coming week:" + "Agenda for today:") + (dashboard-agenda--sorted-agenda) + list-size + 'agenda + (dashboard-get-shortcut 'agenda) + `(lambda (&rest _) + (let ((buffer (find-file-other-window (get-text-property 0 'dashboard-agenda-file ,el)))) + (with-current-buffer buffer + (goto-char (get-text-property 0 'dashboard-agenda-loc ,el)) + (switch-to-buffer buffer)))) + (format "%s" el))) + +;; +;; Registers +;; +(defun dashboard-insert-registers (list-size) + "Add the list of LIST-SIZE items of registers." + (require 'register) + (dashboard-insert-section + "Registers:" + register-alist + list-size + 'registers + (dashboard-get-shortcut 'registers) + (lambda (&rest _) (jump-to-register (car el))) + (format "%c - %s" (car el) (register-describe-oneline (car el))))) + +(provide 'dashboard-widgets) +;;; dashboard-widgets.el ends here diff --git a/org/elpa/dashboard-20220409.620/dashboard.el b/org/elpa/dashboard-20220409.620/dashboard.el new file mode 100644 index 0000000..9c8b80e --- /dev/null +++ b/org/elpa/dashboard-20220409.620/dashboard.el @@ -0,0 +1,472 @@ +;;; dashboard.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2022 emacs-dashboard maintainers +;; +;; Author : Rakan Al-Hneiti +;; Maintainer : Jesús Martínez +;; Shen, Jen-Chieh +;; URL : https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "26.1")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projects (projectile or project.el), org-agenda and more. + +;;; Code: + +(require 'ffap) +(require 'recentf) + +(require 'dashboard-widgets) + +(declare-function bookmark-get-filename "ext:bookmark.el") +(declare-function bookmark-all-names "ext:bookmark.el") +(declare-function dashboard-ls--dirs "ext:dashboard-ls.el") +(declare-function dashboard-ls--files "ext:dashboard-ls.el") +(declare-function page-break-lines-mode "ext:page-break-lines.el") +(declare-function project-forget-projects-under "ext:project.el") + +(defgroup dashboard nil + "Extensible startup screen." + :group 'applications) + +;; Custom splash screen +(defvar dashboard-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-p") 'dashboard-previous-line) + (define-key map (kbd "C-n") 'dashboard-next-line) + (define-key map (kbd "") 'dashboard-previous-line) + (define-key map (kbd "") 'dashboard-next-line) + (define-key map (kbd "k") 'dashboard-previous-line) + (define-key map (kbd "j") 'dashboard-next-line) + (define-key map [tab] 'widget-forward) + (define-key map (kbd "C-i") 'widget-forward) + (define-key map [backtab] 'widget-backward) + (define-key map (kbd "RET") 'dashboard-return) + (define-key map [mouse-1] 'dashboard-mouse-1) + (define-key map (kbd "}") #'dashboard-next-section) + (define-key map (kbd "{") #'dashboard-previous-section) + + (define-key map (kbd "") #'dashboard-remove-item-under) + (define-key map (kbd "") #'dashboard-remove-item-under) + (define-key map (kbd "DEL") #'dashboard-remove-item-under) + + (define-key map (kbd "1") #'dashboard-section-1) + (define-key map (kbd "2") #'dashboard-section-2) + (define-key map (kbd "3") #'dashboard-section-3) + (define-key map (kbd "4") #'dashboard-section-4) + (define-key map (kbd "5") #'dashboard-section-5) + (define-key map (kbd "6") #'dashboard-section-6) + (define-key map (kbd "7") #'dashboard-section-7) + (define-key map (kbd "8") #'dashboard-section-8) + (define-key map (kbd "9") #'dashboard-section-9) + map) + "Keymap for dashboard mode.") + +(defcustom dashboard-after-initialize-hook nil + "Hook that is run after dashboard buffer is initialized." + :group 'dashboard + :type 'hook) + +(define-derived-mode dashboard-mode special-mode "Dashboard" + "Dashboard major mode for startup screen." + :group 'dashboard + :syntax-table nil + :abbrev-table nil + (buffer-disable-undo) + (when (featurep 'whitespace) (whitespace-mode -1)) + (when (featurep 'linum) (linum-mode -1)) + (when (featurep 'display-line-numbers) (display-line-numbers-mode -1)) + (when (featurep 'page-break-lines) (page-break-lines-mode 1)) + (setq-local revert-buffer-function #'dashboard-refresh-buffer) + (setq inhibit-startup-screen t + buffer-read-only t + truncate-lines t)) + +(defcustom dashboard-center-content nil + "Whether to center content within the window." + :type 'boolean + :group 'dashboard) + +(defconst dashboard-buffer-name "*dashboard*" + "Dashboard's buffer name.") + +(defvar dashboard-force-refresh nil + "If non-nil, force refresh dashboard buffer.") + +(defvar dashboard--section-starts nil + "List of section starting positions.") + +;; +;; Util +;; +(defun dashboard--goto-line (line) + "Goto LINE." + (goto-char (point-min)) (forward-line (1- line))) + +(defmacro dashboard--save-excursion (&rest body) + "Execute BODY save window point." + (declare (indent 0) (debug t)) + `(let ((line (line-number-at-pos nil t)) + (column (current-column))) + ,@body + (dashboard--goto-line line) + (move-to-column column))) + +;; +;; Core +;; +(defun dashboard--current-section () + "Return section symbol in dashboard." + (save-excursion + (if (and (search-backward dashboard-page-separator nil t) + (search-forward dashboard-page-separator nil t)) + (let ((ln (thing-at-point 'line))) + (cond ((string-match-p "Recent Files:" ln) 'recents) + ((string-match-p "Bookmarks:" ln) 'bookmarks) + ((string-match-p "Projects:" ln) 'projects) + ((string-match-p "Agenda for " ln) 'agenda) + ((string-match-p "Registers:" ln) 'registers) + ((string-match-p "List Directories:" ln) 'ls-directories) + ((string-match-p "List Files:" ln) 'ls-files) + (t (user-error "Unknown section from dashboard")))) + (user-error "Failed searching dashboard section")))) + +;; +;; Navigation +;; +(defun dashboard-previous-section () + "Navigate back to previous section." + (interactive) + (let ((current-position (point)) current-section-start previous-section-start) + (dolist (elt dashboard--section-starts) + (when (and current-section-start (not previous-section-start)) + (setq previous-section-start elt)) + (when (and (not current-section-start) (< elt current-position)) + (setq current-section-start elt))) + (goto-char (if (eq current-position current-section-start) + previous-section-start + current-section-start)))) + +(defun dashboard-next-section () + "Navigate forward to next section." + (interactive) + (let ((current-position (point)) next-section-start + (section-starts (reverse dashboard--section-starts))) + (dolist (elt section-starts) + (when (and (not next-section-start) + (> elt current-position)) + (setq next-section-start elt))) + (when next-section-start + (goto-char next-section-start)))) + +(defun dashboard--section-lines () + "Return a list of integer represent the starting line number of each section." + (let (pb-lst) + (save-excursion + (goto-char (point-min)) + (while (search-forward dashboard-page-separator nil t) + (when (ignore-errors (dashboard--current-section)) + (push (line-number-at-pos) pb-lst)))) + (setq pb-lst (reverse pb-lst)) + pb-lst)) + +(defun dashboard--goto-section-by-index (index) + "Navigate to item section by INDEX." + (let* ((pg-lst (dashboard--section-lines)) + (items-id (1- index)) + (items-pg (nth items-id pg-lst)) + (items-len (length pg-lst))) + (when (and items-pg (< items-id items-len)) + (dashboard--goto-line items-pg)))) + +(defun dashboard-section-1 () + "Navigate to section 1." (interactive) (dashboard--goto-section-by-index 1)) +(defun dashboard-section-2 () + "Navigate to section 2." (interactive) (dashboard--goto-section-by-index 2)) +(defun dashboard-section-3 () + "Navigate to section 3." (interactive) (dashboard--goto-section-by-index 3)) +(defun dashboard-section-4 () + "Navigate to section 4." (interactive) (dashboard--goto-section-by-index 4)) +(defun dashboard-section-5 () + "Navigate to section 5." (interactive) (dashboard--goto-section-by-index 5)) +(defun dashboard-section-6 () + "Navigate to section 6." (interactive) (dashboard--goto-section-by-index 6)) +(defun dashboard-section-7 () + "Navigate to section 7." (interactive) (dashboard--goto-section-by-index 7)) +(defun dashboard-section-8 () + "Navigate to section 8." (interactive) (dashboard--goto-section-by-index 8)) +(defun dashboard-section-9 () + "Navigate to section 9." (interactive) (dashboard--goto-section-by-index 9)) + +(defun dashboard-previous-line (arg) + "Move point up and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + (interactive "^p") + (dashboard-next-line (- arg))) + +(defun dashboard-next-line (arg) + "Move point down and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + ;; code heavily inspired by `dired-next-line' + (interactive "^p") + (let (line-move-visual goal-column) + (line-move arg t)) + ;; We never want to move point into an invisible line. Dashboard doesn’t + ;; use invisible text currently but when it does we’re ready! + (while (and (invisible-p (point)) + (not (if (and arg (< arg 0)) (bobp) (eobp)))) + (forward-char (if (and arg (< arg 0)) -1 1))) + (beginning-of-line-text)) + +;; +;; ffap +;; +(defun dashboard--goto-section (section) + "Move to SECTION declares in variable `dashboard-item-shortcuts'." + (let ((fnc (intern (format "dashboard-jump-to-%s" section)))) + (dashboard-funcall-fboundp fnc))) + +(defun dashboard--current-index (section &optional pos) + "Return the idex by SECTION from POS." + (let (target-ln section-line) + (save-excursion + (when pos (goto-char pos)) + (setq target-ln (line-number-at-pos)) + (dashboard--goto-section section) + (setq section-line (line-number-at-pos))) + (- target-ln section-line))) + +(defun dashboard--section-list (section) + "Return the list from SECTION." + (cl-case section + (`recents recentf-list) + (`bookmarks (bookmark-all-names)) + (`projects (dashboard-projects-backend-load-projects)) + (`ls-directories (dashboard-ls--dirs)) + (`ls-files (dashboard-ls--files)) + (t (user-error "Unknown section for search: %s" section)))) + +(defun dashboard--current-item-in-path () + "Return the path from current dashboard section in path." + (let ((section (dashboard--current-section)) path) + (cl-case section + (`bookmarks (setq path (bookmark-get-filename path))) + (t + (let ((lst (dashboard--section-list section)) + (index (dashboard--current-index section))) + (setq path (nth index lst))))) + path)) + +(defun dashboard--on-path-item-p () + "Return non-nil if current point is on the item path from dashboard." + (save-excursion + (when (= (point) (line-end-position)) (ignore-errors (forward-char -1))) + (eq (get-char-property (point) 'face) 'dashboard-items-face))) + +(defun dashboard--ffap-guesser--adv (fnc &rest args) + "Advice execution around function `ffap-guesser'. + +Argument FNC is the adviced function. +Optional argument ARGS adviced function arguments." + (cl-case major-mode + (`dashboard-mode + (or (and (dashboard--on-path-item-p) + (dashboard--current-item-in-path)) + (apply fnc args))) ; fallback + (t (apply fnc args)))) +(advice-add 'ffap-guesser :around #'dashboard--ffap-guesser--adv) + +;; +;; Removal +;; +(defun dashboard-remove-item-under () + "Remove a item from the current item section." + (interactive) + (cl-case (dashboard--current-section) + (`recents (dashboard-remove-item-recentf)) + (`bookmarks (dashboard-remove-item-bookmarks)) + (`projects (dashboard-remove-item-projects)) + (`agenda (dashboard-remove-item-agenda)) + (`registers (dashboard-remove-item-registers))) + (dashboard--save-excursion (dashboard-refresh-buffer))) + +(defun dashboard-remove-item-recentf () + "Remove a file from `recentf-list'." + (interactive) + (let ((path (save-excursion (end-of-line) (ffap-guesser)))) + (setq recentf-list (delete path recentf-list))) + (dashboard-mute-apply (recentf-save-list))) + +(defun dashboard-remove-item-projects () + "Remove a path from `project--list'." + (interactive) + (let ((path (save-excursion (end-of-line) (ffap-guesser)))) + (dashboard-mute-apply + (cl-case dashboard-projects-backend + (`projectile ) ; TODO: .. + (`project-el (project-forget-projects-under path)))))) + +(defun dashboard-remove-item-bookmarks () + "Remove a bookmarks from `bookmark-alist'." + (interactive)) ; TODO: .. + +(defun dashboard-remove-item-agenda () + "Remove an agenda from `org-agenda-files'." + (interactive "P") + (let ((agenda-file (get-text-property (point) 'dashboard-agenda-file)) + (agenda-loc (get-text-property (point) 'dashboard-agenda-loc))) + (with-current-buffer (find-file-noselect agenda-file) + (goto-char agenda-loc) + (call-interactively 'org-todo)))) + +(defun dashboard-remove-item-registers () + "Remove a registers from `register-alist'." + (interactive)) ; TODO: .. + +;; +;; Confirmation +;; +(defun dashboard-return () + "Hit return key in dashboard buffer." + (interactive) + (let ((start-ln (line-number-at-pos)) (fd-cnt 0) diff-line entry-pt) + (save-excursion + (while (and (not diff-line) + (not (= (point) (point-min))) + (not (get-char-property (point) 'button)) + (not (= (point) (point-max)))) + (forward-char 1) + (setq fd-cnt (1+ fd-cnt)) + (unless (= start-ln (line-number-at-pos)) + (setq diff-line t))) + (unless (= (point) (point-max)) + (setq entry-pt (point)))) + (when (= fd-cnt 1) + (setq entry-pt (1- (point)))) + (if entry-pt + (widget-button-press entry-pt) + (call-interactively #'widget-button-press)))) + +(defun dashboard-mouse-1 () + "Key for keymap `mouse-1'." + (interactive) + (let ((old-track-mouse track-mouse)) + (when (call-interactively #'widget-button-click) + (setq track-mouse old-track-mouse)))) + +;; +;; Insertion +;; +(defun dashboard-maximum-section-length () + "For the just-inserted section, calculate the length of the longest line." + (let ((max-line-length 0)) + (save-excursion + (dashboard-previous-section) + (while (not (eobp)) + (setq max-line-length + (max max-line-length + (- (line-end-position) (line-beginning-position)))) + (forward-line 1))) + max-line-length)) + +(defun dashboard-insert-startupify-lists () + "Insert the list of widgets into the buffer." + (interactive) + (let ((buffer-exists (buffer-live-p (get-buffer dashboard-buffer-name))) + (recentf-is-on (recentf-enabled-p)) + (origial-recentf-list recentf-list) + (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0)) + (max-line-length 0)) + ;; disable recentf mode, so we don't flood the recent files list with org + ;; mode files do this by making a copy of the part of the list we'll use + ;; let dashboard widgets change that then restore the orginal list afterwards + ;; (this avoids many saves/loads that would result from disabling/enabling + ;; recentf-mode) + (when recentf-is-on + (setq recentf-list (dashboard-subseq recentf-list dashboard-num-recents))) + (when (or dashboard-force-refresh + (not (eq dashboard-buffer-last-width (window-width))) + (not buffer-exists)) + (setq dashboard-banner-length (window-width) + dashboard-buffer-last-width dashboard-banner-length) + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (let (buffer-read-only) + (erase-buffer) + (dashboard-insert-banner) + (dashboard-insert-page-break) + (setq dashboard--section-starts nil) + (mapc (lambda (els) + (let* ((el (or (car-safe els) els)) + (list-size + (or (cdr-safe els) + dashboard-items-default-length)) + (item-generator + (cdr-safe (assoc el dashboard-item-generators)))) + (add-to-list 'dashboard--section-starts (point)) + (funcall item-generator list-size) + (when recentf-is-on + (setq recentf-list origial-recentf-list)) + (setq max-line-length + (max max-line-length (dashboard-maximum-section-length))) + (dashboard-insert-page-break))) + dashboard-items) + (when dashboard-center-content + (when dashboard--section-starts + (goto-char (car (last dashboard--section-starts)))) + (let ((margin (floor (/ (max (- (window-width) max-line-length) 0) 2)))) + (while (not (eobp)) + (unless (string-suffix-p (thing-at-point 'line) dashboard-page-separator) + (insert (make-string margin ?\ ))) + (forward-line 1)))) + (dashboard-insert-footer)) + (goto-char (point-min)) + (dashboard-mode))) + (when recentf-is-on + (setq recentf-list origial-recentf-list)))) + +(add-hook 'window-setup-hook + (lambda () + (add-hook 'window-size-change-functions 'dashboard-resize-on-hook) + (dashboard-resize-on-hook))) + +(defun dashboard-refresh-buffer (&rest _) + "Refresh buffer." + (interactive) + (let ((dashboard-force-refresh t)) (dashboard-insert-startupify-lists)) + (switch-to-buffer dashboard-buffer-name)) + +(defun dashboard-resize-on-hook (&optional _) + "Re-render dashboard on window size change." + (let ((space-win (get-buffer-window dashboard-buffer-name)) + (frame-win (frame-selected-window))) + (when (and space-win + (not (window-minibuffer-p frame-win))) + (with-selected-window space-win + (dashboard-insert-startupify-lists))))) + +;;;###autoload +(defun dashboard-setup-startup-hook () + "Setup post initialization hooks. +If a command line argument is provided, assume a filename and skip displaying +Dashboard." + (when (< (length command-line-args) 2) + (add-hook 'after-init-hook (lambda () + ;; Display useful lists of items + (dashboard-insert-startupify-lists))) + (add-hook 'emacs-startup-hook (lambda () + (switch-to-buffer dashboard-buffer-name) + (goto-char (point-min)) + (redisplay) + (run-hooks 'dashboard-after-initialize-hook))))) + +(provide 'dashboard) +;;; dashboard.el ends here diff --git a/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el new file mode 100644 index 0000000..b45e7c2 --- /dev/null +++ b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el @@ -0,0 +1,23 @@ +;;; dashboard-project-status-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dashboard-project-status" "dashboard-project-status.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from dashboard-project-status.el + +(register-definition-prefixes "dashboard-project-status" '("dashboard-project-status")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dashboard-project-status-autoloads.el ends here diff --git a/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el new file mode 100644 index 0000000..9e680da --- /dev/null +++ b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from dashboard-project-status.el -*- no-byte-compile: t -*- +(define-package "dashboard-project-status" "20190202.1354" "Display a git project status in a dashboard widget." '((emacs "24") (git "0.1.1") (dashboard "1.2.5")) :commit "7675c138e9df8fe2c626e7ba9bbb8b6717671a41" :authors '(("Jason Duncan" . "jasond496@msn.com")) :maintainer '("Jason Duncan" . "jasond496@msn.com") :url "https://github.com/functionreturnfunction/dashboard-project-status") diff --git a/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el new file mode 100644 index 0000000..370f230 --- /dev/null +++ b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el @@ -0,0 +1,99 @@ +;;; dashboard-project-status.el --- Display a git project status in a dashboard widget. -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Jason Duncan, all rights reserved + +;; Author: Jason Duncan +;; Version: 0.0.1 +;; Package-Version: 20190202.1354 +;; Package-Commit: 7675c138e9df8fe2c626e7ba9bbb8b6717671a41 +;; URL: https://github.com/functionreturnfunction/dashboard-project-status +;; Package-Requires: ((emacs "24") (git "0.1.1") (dashboard "1.2.5")) + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; Display a git project status in a dashboard widget. + +;; See README.org for installation and usage. + +;;; Code: + +(require 'git) +(require 'dashboard) + +(defun dashboard-project-status-git-local-is-behind? () + "Return non-nil if current `git-repo' is behind its remote." + (numberp + (string-match-p + (regexp-quote "Your branch is behind") + (git-run "status" "-uno")))) + +(defun dashboard-project-status-git-unstaged-files () + "Return list of unstaged files." + (git--lines + (git-run "diff" "--name-only"))) + +(defun dashboard-project-status-insert-heading () + "Insert a heading with project path and whether or not it is behind." + (dashboard-insert-heading "Project ") + (if (functionp 'magit-status) + (widget-create 'push-button + :action `(lambda (&rest ignore) (magit-status ,git-repo)) + :mouse-face 'highlight + :follow-link "\C-m" + :button-prefix "" + :button-suffix "" + :format "%[%t%]" + (abbreviate-file-name git-repo)) + (dashboard-insert-heading git-repo)) + (dashboard-insert-heading + (if (dashboard-project-status-git-local-is-behind?) + " is behind the remote. (use \"git pull\" to update)" + " is up-to-date."))) + +(defun dashboard-project-status-insert-body (limit) + "Insert lists of untracked, unstaged, and staged files LIMIT -ed as specified." + (let ((count 0)) + (dolist (section `(("Untracked Files:" . ,(git-untracked-files)) + ("Unstaged Files:" . ,(dashboard-project-status-git-unstaged-files)) + ("Staged Files:" . ,(git-staged-files)))) + (when (cdr section) + (let* ((items (cdr section)) + (items (if (> (+ count (length items)) limit) + (dashboard-subseq items 0 (- limit count)) + items))) + (when items + (setq count (+ count (length items))) + (insert hard-newline) + (dashboard-insert-recentf-list + (car section) + (reverse + (let (ret) + (dolist (cur items ret) + (setq ret (cons (expand-file-name + (concat (file-name-as-directory git-repo) cur)) + ret)))))))))))) + +(defun dashboard-project-status (project-dir &optional update) + "Return a function which will insert git status for PROJECT-DIR. +If UPDATE is non-nil, update the remote first with 'git remote update'." + `(lambda (list-size) + (let ((git-repo ,project-dir)) + (when ,update (git-run "remote" "update")) + (dashboard-project-status-insert-heading) + (dashboard-project-status-insert-body list-size)))) + +(provide 'dashboard-project-status) +;;; dashboard-project-status.el ends here diff --git a/org/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el b/org/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el deleted file mode 100644 index e441fc8..0000000 --- a/org/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el +++ /dev/null @@ -1,42 +0,0 @@ -;;; dired-collapse-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-collapse" "dired-collapse.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from dired-collapse.el - -(autoload 'dired-collapse-mode "dired-collapse" "\ -Toggle collapsing of unique nested paths in Dired. - -This is a minor mode. If called interactively, toggle the -`Dired-Collapse mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. - -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. - -To check whether the minor mode is enabled in the current buffer, -evaluate `dired-collapse-mode'. - -The mode's hook is called both when the mode is enabled and when -it is disabled. - -\(fn &optional ARG)" t nil) - -(register-definition-prefixes "dired-collapse" '("dired-collapse")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-collapse-autoloads.el ends here diff --git a/org/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el b/org/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el deleted file mode 100644 index 46cd3a8..0000000 --- a/org/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-collapse.el -*- no-byte-compile: t -*- -(define-package "dired-collapse" "20210403.1230" "Collapse unique nested paths in dired listing" '((dash "2.10.0") (f "0.19.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/org/elpa/dired-collapse-20210403.1230/dired-collapse.el b/org/elpa/dired-collapse-20210403.1230/dired-collapse.el deleted file mode 100644 index bb19891..0000000 --- a/org/elpa/dired-collapse-20210403.1230/dired-collapse.el +++ /dev/null @@ -1,162 +0,0 @@ -;;; dired-collapse.el --- Collapse unique nested paths in dired listing -*- lexical-binding: t -*- - -;; Copyright (C) 2017 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Version: 1.1.0 -;; Package-Version: 20210403.1230 -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Created: 15th July 2017 -;; Package-requires: ((dash "2.10.0") (f "0.19.0") (dired-hacks-utils "0.0.1")) -;; Keywords: files - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; Often times we find ourselves in a situation where a single file -;; or directory is nested in a chain of nested directories with no -;; other content. This is sometimes due to various mandatory -;; layouts demanded by packaging tools or tools generating these -;; deeply-nested "unique" paths to disambiguate architectures or -;; versions (but we often use only one anyway). If the user wants -;; to access these directories they have to quite needlessly -;; drill-down through varying number of "uninteresting" directories -;; to get to the content. - -;; This minor mode is in main inspired by how GitHub renders these -;; paths: if there is a chain of directories where each one only has -;; one child, they are concatenated together and shown on the first -;; level in this collapsed form. When the user clicks this -;; collapsed directory they are immediately brought to the deepest -;; directory with some actual content. - -;; To enable or disable this functionality use `dired-collapse-mode' -;; to toggle it for the current dired buffer. - -;; If the deepest directory contains only a single file this file is -;; displayed instead of the last directory. This way we can get -;; directly to the file itself. This is often helpful with config -;; files which are stored in their own directories, for example in -;; `~/.config/foo/config' and similar situations. - -;; The files or directories re-inserted in this manner will also -;; have updated permissions, file sizes and modification dates so -;; they truly correspond to the properties of the file being shown. - -;; The path to the deepest file is dimmed with the `shadow' face so -;; that it does not distract but at the same time is still available -;; for inspection. - -;; The mode is integrated with `dired-rainbow' so the nested files -;; are properly colored according to user's rules. - -;;; Code: - -(require 'dash) -(require 'dired) -(require 'f) -(require 'dired-hacks-utils) - -(defgroup dired-collapse () - "Collapse unique nested paths in dired listing." - :group 'dired-hacks - :prefix "dired-collapse-") - -(defcustom dired-collapse-remote nil - "If non-nil, enable `dired-collapse' in remote (TRAMP) buffers." - :type 'boolean - :group 'dired-collapse) - -;;;###autoload -(define-minor-mode dired-collapse-mode - "Toggle collapsing of unique nested paths in Dired." - :group 'dired-collapse - :lighter "" - (if dired-collapse-mode - (progn - (add-hook 'dired-after-readin-hook 'dired-collapse 'append 'local) - (add-hook 'dired-subtree-after-insert-hook 'dired-collapse 'append 'local) - ;; collapse the buffer only if it is not empty (= we haven't - ;; yet read in the current directory) - (unless (= (buffer-size) 0) - (dired-collapse))) - (remove-hook 'dired-after-readin-hook 'dired-collapse 'local) - (remove-hook 'dired-subtree-after-insert-hook 'dired-collapse 'local) - (revert-buffer))) - -(defun dired-collapse--replace-file (file) - "Replace file on the current line with FILE." - (delete-region (line-beginning-position) (1+ (line-end-position))) - (insert " ") - (insert-directory file dired-listing-switches nil nil) - (forward-line -1) - (dired-align-file (line-beginning-position) (1+ (line-end-position))) - (-when-let (replaced-file (dired-utils-get-filename)) - (when (file-remote-p replaced-file) - (while (search-forward (dired-current-directory) (line-end-position) t) - (replace-match ""))))) - -(defun dired-collapse--create-ov (&optional to-eol) - "Create the shadow overlay which marks the collapsed path. - -If TO-EOL is non-nil, extend the overlay over the whole -filename (for example when the final directory is empty)." - (save-excursion - (dired-move-to-filename) - (let* ((beg (point)) - (end (save-excursion - (dired-move-to-end-of-filename) - (if to-eol - (point) - (1+ (search-backward "/"))))) - (ov (make-overlay beg end))) - (overlay-put ov 'face 'shadow) - ov))) - -(defun dired-collapse () - "Collapse unique nested paths in dired listing." - (when (or (not (file-remote-p default-directory)) dired-collapse-remote) - (-let* (;; dired-hide-details-mode hides details by assigning a special invisibility text property - ;; to them, while dired-collapse requires all the details. So we disable invisibility here - ;; temporarily. - (buffer-invisibility-spec nil) - (inhibit-read-only t)) - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (when (and (looking-at-p dired-re-dir) - (not (member (dired-utils-get-filename 'no-dir) (list "." ".."))) - (not (eolp))) - (let ((path (dired-utils-get-filename)) - files) - (while (and (file-directory-p path) - (file-accessible-directory-p path) - (setq files (f-entries path)) - (= 1 (length files))) - (setq path (car files))) - (if (and (not files) - (equal path (dired-utils-get-filename))) - (dired-collapse--create-ov 'to-eol) - (setq path (s-chop-prefix (dired-current-directory) path)) - (when (string-match-p "/" path) - (let ((default-directory (dired-current-directory))) - (dired-collapse--replace-file path)) - (dired-insert-set-properties (line-beginning-position) (line-end-position)) - (dired-collapse--create-ov (= 0 (length files))))))) - (forward-line 1)))))) - -(provide 'dired-collapse) -;;; dired-collapse.el ends here diff --git a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-autoloads.el b/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-autoloads.el deleted file mode 100644 index 120f7f6..0000000 --- a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-autoloads.el +++ /dev/null @@ -1,23 +0,0 @@ -;;; dired-hacks-utils-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-hacks-utils" "dired-hacks-utils.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from dired-hacks-utils.el - -(register-definition-prefixes "dired-hacks-utils" '("dired-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-hacks-utils-autoloads.el ends here diff --git a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el b/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el deleted file mode 100644 index 0c1de1a..0000000 --- a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-hacks-utils.el -*- no-byte-compile: t -*- -(define-package "dired-hacks-utils" "20201005.2318" "Utilities and helpers for dired-hacks collection" '((dash "2.5.0")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils.el b/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils.el deleted file mode 100644 index d02449c..0000000 --- a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils.el +++ /dev/null @@ -1,275 +0,0 @@ -;;; dired-hacks-utils.el --- Utilities and helpers for dired-hacks collection - -;; Copyright (C) 2014-2015 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Keywords: files -;; Package-Version: 20201005.2318 -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Version: 0.0.1 -;; Created: 14th February 2014 -;; Package-requires: ((dash "2.5.0")) - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; Utilities and helpers for `dired-hacks' collection of dired -;; improvements. - -;; This package also provides these interactive functions: -;; * `dired-hacks-next-file' - go to next file, skipping empty and non-file lines -;; * `dired-hacks-previous-file' - go to previous file, skipping empty -;; and non-file lines -;; * `dired-utils-format-information-line-mode' - Format the information -;; (summary) line file sizes to be human readable (e.g. 1GB instead of 1048576). - - -;; See https://github.com/Fuco1/dired-hacks for the entire collection - -;;; Code: - -(require 'dash) -(require 'dired) - -(defgroup dired-hacks () - "Collection of useful dired additions." - :group 'dired - :prefix "dired-hacks-") - -(defcustom dired-hacks-file-size-formatter 'file-size-human-readable - "The function used to format file sizes. - -See `dired-utils-format-file-sizes'." - :type 'symbol - :group 'dired-hacks) - -(defcustom dired-hacks-datetime-regexp - "\\sw\\sw\\sw....\\(?:[0-9][0-9]:[0-9][0-9]\\|.[0-9]\\{4\\}\\)" - "A regexp matching the date/time in the dired listing. - -It is used to determine where the filename starts. It should -*not* match any characters after the last character of the -timestamp. It is assumed that the timestamp is preceded and -followed by at least one space character. You should only use -shy groups (prefixed with ?:) because the first group is used by -the font-lock to determine what portion of the name should be -colored." - :type 'string - :group 'dired-hacks) - -(defalias 'dired-utils--string-trim - (if (and (require 'subr-x nil t) - (fboundp 'string-trim)) - #'string-trim - (lambda (string) - (let ((s string)) - (when (string-match "\\`[ \t\n\r]+" s) - (setq s (replace-match "" t t s))) - (when (string-match "[ \t\n\r]+\\'" s) - (setq s (replace-match "" t t s))) - s))) - "Trim STRING of trailing whitespace. - -\(fn STRING)") - -(defun dired-utils-get-filename (&optional localp) - "Like `dired-get-filename' but never signal an error. - -Optional arg LOCALP with value `no-dir' means don't include -directory name in result." - (dired-get-filename localp t)) - -(defun dired-utils-get-all-files (&optional localp) - "Return all files in this dired buffer as a list. - -LOCALP has same semantics as in `dired-get-filename'." - (save-excursion - (goto-char (point-min)) - (let (r) - (while (= 0 (forward-line)) - (--when-let (dired-utils-get-filename localp) - (push it r))) - (nreverse r)))) - -(defconst dired-utils-file-attributes-keywords - '(:isdir :nlinks :uid :gid :atime :mtime :ctime :size :modes :gidchg :inode :devnum) - "List of keywords to map with `file-attributes'.") - -(defconst dired-utils-info-keywords - `(:name :issym :target ,@dired-utils-file-attributes-keywords) - "List of keywords available for `dired-utils-get-info'.") - -(defun dired-utils--get-keyword-info (keyword) - "Get file information about KEYWORD." - (let ((filename (dired-utils-get-filename))) - (cl-case keyword - (:name filename) - (:isdir (file-directory-p filename)) - (:issym (and (file-symlink-p filename) t)) - (:target (file-symlink-p filename)) - (t - (nth (-elem-index keyword dired-utils-file-attributes-keywords) - (file-attributes filename)))))) - -(defun dired-utils-get-info (&rest keywords) - "Query for info about the file at point. - -KEYWORDS is a list of attributes to query. - -When querying for one attribute, its value is returned. When -querying for more than one, a list of results is returned. - -The available keywords are listed in -`dired-utils-info-keywords'." - (let ((attributes (mapcar 'dired-utils--get-keyword-info keywords))) - (if (> (length attributes) 1) - attributes - (car attributes)))) - -(defun dired-utils-goto-line (filename) - "Go to line describing FILENAME in listing. - -Should be absolute file name matched against -`dired-get-filename'." - (goto-char (point-min)) - (let (stop) - (while (and (not stop) - (= (forward-line) 0)) - (when (equal filename (dired-utils-get-filename)) - (setq stop t) - (dired-move-to-filename))) - stop)) - -(defun dired-utils-match-filename-regexp (filename alist) - "Match FILENAME against each car in ALIST and return first matched cons. - -Each car in ALIST is a regular expression. - -The matching is done using `string-match-p'." - (let (match) - (--each-while alist (not match) - (when (string-match-p (car it) filename) - (setq match it))) - match)) - -(defun dired-utils-match-filename-extension (filename alist) - "Match FILENAME against each car in ALIST and return first matched cons. - -Each car in ALIST is a string representing file extension -*without* the delimiting dot." - (let (done) - (--each-while alist (not done) - (when (string-match-p (concat "\\." (regexp-quote (car it)) "\\'") filename) - (setq done it))) - done)) - -(defun dired-utils-format-information-line () - "Format the disk space on the Dired information line." - (save-excursion - (goto-char (point-min)) - (forward-line) - (let ((inhibit-read-only t) - (limit (line-end-position))) - (while (re-search-forward "\\(?:directory\\|available\\) \\(\\<[0-9]+$\\>\\)" nil t) - (replace-match - (save-match-data - (propertize (dired-utils--string-trim - (funcall dired-hacks-file-size-formatter - (* 1024 (string-to-number (match-string 1))) t)) - 'invisible 'dired-hide-details-information)) - t nil nil 1))))) - - -;;; Predicates -(defun dired-utils-is-file-p () - "Return non-nil if the line at point is a file or a directory." - (dired-utils-get-filename 'no-dir)) - -(defun dired-utils-is-dir-p () - "Return non-nil if the line at point is a directory." - (--when-let (dired-utils-get-filename) - (file-directory-p it))) - - -;;; Interactive -;; TODO: add wrap-around option -(defun dired-hacks-next-file (&optional arg) - "Move point to the next file. - -Optional prefix ARG says how many lines to move; default is one -line." - (interactive "p") - (unless arg (setq arg 1)) - (if (< arg 0) - (dired-hacks-previous-file (- arg)) - (--dotimes arg - (forward-line) - (while (and (or (not (dired-utils-is-file-p)) - (get-text-property (point) 'invisible)) - (= (forward-line) 0)))) - (if (not (= (point) (point-max))) - (dired-move-to-filename) - (forward-line -1) - (dired-move-to-filename) - nil))) - -(defun dired-hacks-previous-file (&optional arg) - "Move point to the previous file. - -Optional prefix ARG says how many lines to move; default is one -line." - (interactive "p") - (unless arg (setq arg 1)) - (if (< arg 0) - (dired-hacks-next-file (- arg)) - (--dotimes arg - (forward-line -1) - (while (and (or (not (dired-utils-is-file-p)) - (get-text-property (point) 'invisible)) - (= (forward-line -1) 0)))) - (if (not (= (point) (point-min))) - (dired-move-to-filename) - (dired-hacks-next-file) - nil))) - -(defun dired-hacks-compare-files (file-a file-b) - "Test if two files FILE-A and FILE-B are the (probably) the same." - (interactive (let ((other-dir (dired-dwim-target-directory))) - (list (read-file-name "File A: " default-directory (car (dired-get-marked-files)) t) - (read-file-name "File B: " other-dir (with-current-buffer (cdr (assoc other-dir dired-buffers)) - (car (dired-get-marked-files))) t)))) - (let ((md5-a (with-temp-buffer - (shell-command (format "md5sum %s" file-a) (current-buffer)) - (buffer-string))) - (md5-b (with-temp-buffer - (shell-command (format "md5sum %s" file-b) (current-buffer)) - (buffer-string)))) - (message "%s%sFiles are %s." md5-a md5-b - (if (equal (car (split-string md5-a)) - (car (split-string md5-b))) - "probably the same" "different")))) - -(define-minor-mode dired-utils-format-information-line-mode - "Toggle formatting of disk space in the Dired information line." - :group 'dired-utils - :lighter "" - (if dired-utils-format-information-line-mode - (add-hook 'dired-after-readin-hook #'dired-utils-format-information-line) - (remove-hook 'dired-after-readin-hook #'dired-utils-format-information-line))) - -(provide 'dired-hacks-utils) - -;;; dired-hacks-utils.el ends here diff --git a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-autoloads.el b/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-autoloads.el deleted file mode 100644 index 3c63913..0000000 --- a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-autoloads.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; dired-rainbow-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-rainbow" "dired-rainbow.el" (0 0 0 0)) -;;; Generated autoloads from dired-rainbow.el - -(register-definition-prefixes "dired-rainbow" '("dired-rainbow-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-rainbow-autoloads.el ends here diff --git a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el b/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el deleted file mode 100644 index 648e6bb..0000000 --- a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-rainbow.el -*- no-byte-compile: t -*- -(define-package "dired-rainbow" "20190722.1109" "Extended file highlighting according to its type" '((dash "2.5.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matus Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matus Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow.el b/org/elpa/dired-rainbow-20190722.1109/dired-rainbow.el deleted file mode 100644 index 96ca264..0000000 --- a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow.el +++ /dev/null @@ -1,181 +0,0 @@ -;;; dired-rainbow.el --- Extended file highlighting according to its type - -;; Copyright (C) 2014-2017 Matus Goljer - -;; Author: Matus Goljer -;; Maintainer: Matus Goljer -;; Keywords: files -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Package-Version: 20190722.1109 -;; Package-X-Original-Version: 20170922.817 -;; Version: 0.0.3 -;; Created: 16th February 2014 -;; Package-requires: ((dash "2.5.0") (dired-hacks-utils "0.0.1")) - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This package adds more customizable highlighting for files in dired -;; listings. The group `dired-faces' provides only nine faces and -;; isn't very fine-grained. -;; -;; The definitions are added by several macros, currently available -;; are: -;; -;; * `dired-rainbow-define` - add face by file extension -;; * `dired-rainbow-define-chmod` - add face by file permissions -;; -;; You can display their documentation by calling (substituting the -;; desired macro name): -;; -;; M-x describe-function RET dired-rainbow-define RET -;; -;; Here are some example uses: -;; -;; (defconst my-dired-media-files-extensions -;; '("mp3" "mp4" "MP3" "MP4" "avi" "mpg" "flv" "ogg") -;; "Media files.") -;; -;; (dired-rainbow-define html "#4e9a06" ("htm" "html" "xhtml")) -;; (dired-rainbow-define media "#ce5c00" my-dired-media-files-extensions) -;; -;; ; boring regexp due to lack of imagination -;; (dired-rainbow-define log (:inherit default -;; :italic t) ".*\\.log") -;; -;; ; highlight executable files, but not directories -;; (dired-rainbow-define-chmod executable-unix "Green" "-.*x.*") -;; -;; See https://github.com/Fuco1/dired-hacks for the entire collection. - -;;; Code: - -(require 'dired-hacks-utils) -(require 'dash) - -(defgroup dired-rainbow () - "Extended file highlighting according to its type." - :group 'dired-hacks - :prefix "dired-rainbow-") - -(defvar dired-rainbow-ext-to-face nil - "An alist mapping extension groups to face and compiled regexp. - -This alist is constructed in `dired-rainbow-define' for the case -when the user wants to reuse the associations outside of dired.") - -(defun dired-rainbow--get-face (face-props) - "Return face specification according to FACE-PROPS. - -See `dired-rainbow-define'." - (cond - ((stringp face-props) - `(:foreground ,face-props)) - ((symbolp face-props) - `(:inherit ,face-props)) - (t face-props))) - -(defmacro dired-rainbow-define (symbol face-props extensions &optional how) - "Define a custom dired face highlighting files by extension. - -SYMBOL is the identifier of the face. The macro will define a face named - - dired-rainbow-SYMBOL-face. - -FACE-PROPS is a string, a list or a symbol. If a string, it is -assumed to be either a color name or a hexadecimal code (#......) -describing a color. If a list, it is assumed to be a property -list describing the face. See `defface' for list of possible -attributes. If a symbol it is taken as the name of an existing -face which is used. - -EXTENSIONS is either a list or a symbol evaluating to a list of -extensions that should be highlighted with this face. Note that -if you specify a symbol, its value *must* be known during -compilation and must be defined before this macro is processed. - -Additionally, EXTENSIONS can be a single string or a symbol -evaluating to a string that is interpreted as a regexp matching -the entire file name. - -HOW is a parameter that is passed directly to `font-lock-add-keywords' -to control the order." - (declare (debug (symbolp [&or stringp listp symbolp] [&or symbolp listp stringp]))) - (let* ((matcher (if (or (listp extensions) - (stringp extensions)) - extensions - (symbol-value extensions))) - (regexp (concat - "^[^!].[^d].*[ ]" - dired-hacks-datetime-regexp - "[ ]\\(" - (if (listp matcher) - (concat ".*\\." (regexp-opt matcher)) - matcher) - "\\)$")) - (face-name (intern (concat "dired-rainbow-" (symbol-name symbol) "-face")))) - `(progn - (defface ,face-name - '((t ,(dired-rainbow--get-face face-props))) - ,(concat "dired-rainbow face matching " (symbol-name symbol) " files.") - :group 'dired-rainbow) - (font-lock-add-keywords 'dired-mode '((,regexp 1 ',face-name prepend)) ,how) - (font-lock-add-keywords 'wdired-mode '((,regexp 1 ',face-name prepend)) ,how) - ,(if (listp matcher) `(push - '(,matcher ,face-name ,(concat "\\." (regexp-opt matcher))) - dired-rainbow-ext-to-face))))) - -(defmacro dired-rainbow-define-chmod (symbol face-props chmod &optional how) - "Define a custom dired face highlighting files by chmod permissions. - -SYMBOL is the identifier of the face. The macro will define a face named - - dired-rainbow-SYMBOL-face. - -FACE-PROPS is a string, a list or a symbol. If a string, it is -assumed to be either a color name or a hexadecimal code (#......) -describing a color. If a list, it is assumed to be a property -list describing the face. See `defface' for list of possible -attributes. If a symbol it is taken as the name of an existing -face which is used. - -CHMOD is a regexp matching \"ls -l\" style permissions string. -For example, the pattern - - \"-.*x.*\" - -matches any file with executable flag set for user, group or everyone. - -HOW is a parameter that is passed directly to `font-lock-add-keywords' -to control the order." - (declare (debug (symbolp [&or stringp listp symbolp] stringp))) - (let* ((regexp (concat - "^[^!]." - chmod - ".*[ ]" - dired-hacks-datetime-regexp - "[ ]\\(.*?\\)$")) - (face-name (intern (concat "dired-rainbow-" (symbol-name symbol) "-face")))) - `(progn - (defface ,face-name - '((t ,(dired-rainbow--get-face face-props))) - ,(concat "dired-rainbow face matching " (symbol-name symbol) " files.") - :group 'dired-rainbow) - (font-lock-add-keywords 'dired-mode '((,regexp 1 ',face-name prepend)) ,how) - (font-lock-add-keywords 'wdired-mode '((,regexp 1 ',face-name prepend)) ,how)))) - -(provide 'dired-rainbow) - -;;; dired-rainbow.el ends here diff --git a/org/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el b/org/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el deleted file mode 100644 index f128edd..0000000 --- a/org/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el +++ /dev/null @@ -1,73 +0,0 @@ -;;; dired-ranger-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-ranger" "dired-ranger.el" (0 0 0 0)) -;;; Generated autoloads from dired-ranger.el - -(autoload 'dired-ranger-copy "dired-ranger" "\ -Place the marked items in the copy ring. - -With non-nil prefix argument, add the marked items to the current -selection. This allows you to gather files from multiple dired -buffers for a single paste. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-paste "dired-ranger" "\ -Copy the items from copy ring to current directory. - -With raw prefix argument \\[universal-argument], do not remove -the selection from the stack so it can be copied again. - -With numeric prefix argument, copy the n-th selection from the -copy ring. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-move "dired-ranger" "\ -Move the items from copy ring to current directory. - -This behaves like `dired-ranger-paste' but moves the files -instead of copying them. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-bookmark "dired-ranger" "\ -Bookmark current dired buffer. - -CHAR is a single character (a-zA-Z0-9) representing the bookmark. -Reusing a bookmark replaces the content. These bookmarks are not -persistent, they are used for quick jumping back and forth -between currently used directories. - -\(fn CHAR)" t nil) - -(autoload 'dired-ranger-bookmark-visit "dired-ranger" "\ -Visit bookmark CHAR. - -If the associated dired buffer was killed, we try to reopen it -according to the setting `dired-ranger-bookmark-reopen'. - -The special bookmark `dired-ranger-bookmark-LRU' always jumps to -the least recently visited dired buffer. - -See also `dired-ranger-bookmark'. - -\(fn CHAR)" t nil) - -(register-definition-prefixes "dired-ranger" '("dired-ranger-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-ranger-autoloads.el ends here diff --git a/org/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el b/org/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el deleted file mode 100644 index 634fa93..0000000 --- a/org/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-ranger.el -*- no-byte-compile: t -*- -(define-package "dired-ranger" "20180401.2206" "Implementation of useful ranger features for dired" '((dash "2.7.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/org/elpa/dired-ranger-20180401.2206/dired-ranger.el b/org/elpa/dired-ranger-20180401.2206/dired-ranger.el deleted file mode 100644 index a36b218..0000000 --- a/org/elpa/dired-ranger-20180401.2206/dired-ranger.el +++ /dev/null @@ -1,299 +0,0 @@ -;;; dired-ranger.el --- Implementation of useful ranger features for dired - -;; Copyright (C) 2014-2015 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Version: 0.0.1 -;; Package-Version: 20180401.2206 -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Created: 17th June 2014 -;; Package-requires: ((dash "2.7.0") (dired-hacks-utils "0.0.1")) -;; Keywords: files - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This package implements useful features present in the -;; [ranger](http://ranger.github.io/) file manager which are missing -;; in dired. - -;; Multi-stage copy/pasting of files -;; --------------------------------- - -;; A feature present in most orthodox file managers is a "two-stage" -;; copy/paste process. Roughly, the user first selects some files, -;; "copies" them into a clipboard and then pastes them to the target -;; location. This workflow is missing in dired. - -;; In dired, user first marks the files, then issues the -;; `dired-do-copy' command which prompts for the destination. The -;; files are then copied there. The `dired-dwim-target' option makes -;; this a bit friendlier---if two dired windows are opened, the other -;; one is automatically the default target. - -;; With the multi-stage operations, you can gather files from -;; *multiple* dired buffers into a single "clipboard", then copy or -;; move all of them to the target location. Another huge advantage is -;; that if the target dired buffer is already opened, switching to it -;; via ido or ibuffer is often faster than selecting the path. - -;; Call `dired-ranger-copy' to add marked files (or the file under -;; point if no files are marked) to the "clipboard". With non-nil -;; prefix argument, add the marked files to the current clipboard. - -;; Past clipboards are stored in `dired-ranger-copy-ring' so you can -;; repeat the past pastes. - -;; Call `dired-ranger-paste' or `dired-ranger-move' to copy or move -;; the files in the current clipboard to the current dired buffer. -;; With raw prefix argument (usually C-u), the clipboard is not -;; cleared, so you can repeat the copy operation in another dired -;; buffer. - -;; Bookmarks -;; --------- - -;; Use `dired-ranger-bookmark' to bookmark current dired buffer. You -;; can later quickly revisit it by calling -;; `dired-ranger-bookmark-visit'. - -;; A bookmark name is any single character, letter, digit or a symbol. - -;; A special bookmark with name `dired-ranger-bookmark-LRU' represents -;; the least recently used dired buffer. Its default value is `. If -;; you bind `dired-ranger-bookmark-visit' to the same keybinding, -;; hitting `` will instantly bring you to the previously used dired -;; buffer. This can be used to toggle between two dired buffers in a -;; very fast way. - -;; These bookmarks are not persistent. If you want persistent -;; bookmarks use the bookmarks provided by emacs, see (info "(emacs) -;; Bookmarks"). - -;;; Code: - -(require 'dired-hacks-utils) -(require 'dash) -(require 'ring) - -(defgroup dired-ranger () - "Implementation of useful ranger features for dired." - :group 'dired-hacks - :prefix "dired-ranger-") - - -;; multi-stage copy/paste operations -(defcustom dired-ranger-copy-ring-size 10 - "Specifies how many filesets for copy/paste operations should be stored." - :type 'integer - :group 'dired-ranger) - -(defvar dired-ranger-copy-ring (make-ring dired-ranger-copy-ring-size)) - -;;;###autoload -(defun dired-ranger-copy (arg) - "Place the marked items in the copy ring. - -With non-nil prefix argument, add the marked items to the current -selection. This allows you to gather files from multiple dired -buffers for a single paste." - (interactive "P") - ;; TODO: add dired+ `dired-get-marked-files' support? - (let ((marked (dired-get-marked-files))) - (if (or (not arg) - (ring-empty-p dired-ranger-copy-ring)) - (progn - (ring-insert - dired-ranger-copy-ring - (cons (list (current-buffer)) marked)) - ;; TODO: abstract the message/plural detection somewhere - ;; (e.g. give it a verb and number to produce the correct - ;; string.) - (message (format "Copied %d item%s into copy ring." - (length marked) - (if (> (length marked) 1) "s" "")))) - (let ((current (ring-remove dired-ranger-copy-ring 0))) - (ring-insert - dired-ranger-copy-ring - (cons (-distinct (cons (current-buffer) (car current))) - (-distinct (-concat (dired-get-marked-files) (cdr current))))) - (message (format "Added %d item%s into copy ring." - (length marked) - (if (> (length marked) 1) "s" ""))))))) - -(defun dired-ranger--revert-target (char target-directory files) - "Revert the target buffer and mark the new files. - -CHAR is the temporary value for `dired-marker-char'. - -TARGET-DIRECTORY is the current dired directory. - -FILES is the list of files (from the `dired-ranger-copy-ring') we -operated on." - (let ((current-file (dired-utils-get-filename))) - (revert-buffer) - (let ((dired-marker-char char)) - (--each (-map 'file-name-nondirectory files) - (dired-utils-goto-line (concat target-directory it)) - (dired-mark 1))) - (dired-utils-goto-line current-file))) - -;;;###autoload -(defun dired-ranger-paste (arg) - "Copy the items from copy ring to current directory. - -With raw prefix argument \\[universal-argument], do not remove -the selection from the stack so it can be copied again. - -With numeric prefix argument, copy the n-th selection from the -copy ring." - (interactive "P") - (let* ((index (if (numberp arg) arg 0)) - (data (ring-ref dired-ranger-copy-ring index)) - (files (cdr data)) - (target-directory (dired-current-directory)) - (copied-files 0)) - (--each files (when (file-exists-p it) - (if (file-directory-p it) - (copy-directory it target-directory) - (condition-case err - (copy-file it target-directory 0) - (file-already-exists nil))) - (cl-incf copied-files))) - (dired-ranger--revert-target ?P target-directory files) - (unless arg (ring-remove dired-ranger-copy-ring 0)) - (message (format "Pasted %d/%d item%s from copy ring." - copied-files - (length files) - (if (> (length files) 1) "s" ""))))) - -;;;###autoload -(defun dired-ranger-move (arg) - "Move the items from copy ring to current directory. - -This behaves like `dired-ranger-paste' but moves the files -instead of copying them." - (interactive "P") - (let* ((index (if (numberp arg) arg 0)) - (data (ring-ref dired-ranger-copy-ring index)) - (buffers (car data)) - (files (cdr data)) - (target-directory (dired-current-directory)) - (copied-files 0)) - (--each files (when (file-exists-p it) - (condition-case err - (rename-file it target-directory 0) - (file-already-exists nil)) - (cl-incf copied-files))) - (dired-ranger--revert-target ?M target-directory files) - (--each buffers - (when (buffer-live-p it) - (with-current-buffer it (revert-buffer)))) - (unless arg (ring-remove dired-ranger-copy-ring 0)) - (message (format "Moved %d/%d item%s from copy ring." - copied-files - (length files) - (if (> (length files) 1) "s" ""))))) - - -;; bookmarks -(defcustom dired-ranger-bookmark-reopen 'ask - "Should we reopen closed dired buffer when visiting a bookmark? - -This does only correctly reopen regular dired buffers listing one -directory. Special dired buffers like the output of `find-dired' -or `ag-dired', virtual dired buffers and subdirectories can not -be recreated. - -The value 'never means never reopen the directory. - -The value 'always means always reopen the directory. - -The value 'ask will ask if we should reopen or not. Reopening a -dired buffer for a directory that is already opened in dired will -bring that up, which might be unexpected as that directory might -come from a non-standard source (i.e. not be file-system -backed)." - :type '(radio - (const :tag "Never reopen automatically." never) - (const :tag "Always reopen automatically." always) - (const :tag "Reopen automatically only in standard dired buffers, ask otherwise." ask)) - :group 'dired-ranger) - -(defcustom dired-ranger-bookmark-LRU ?` - "Bookmark representing the least recently used/visited dired buffer. - -If a dired buffer is currently active, select the one visited -before. If a non-dired buffer is active, visit the least -recently visited dired buffer." - :type 'char - :group 'dired-ranger) - -(defvar dired-ranger-bookmarks nil - "An alist mapping bookmarks to dired buffers and locations.") - -;;;###autoload -(defun dired-ranger-bookmark (char) - "Bookmark current dired buffer. - -CHAR is a single character (a-zA-Z0-9) representing the bookmark. -Reusing a bookmark replaces the content. These bookmarks are not -persistent, they are used for quick jumping back and forth -between currently used directories." - (interactive "cBookmark name: ") - (let ((dir (file-truename default-directory))) - (-if-let (value (cdr (assoc char dired-ranger-bookmarks))) - (setf (cdr (assoc char dired-ranger-bookmarks)) (cons dir (current-buffer))) - (push (-cons* char dir (current-buffer)) dired-ranger-bookmarks)) - (message "Bookmarked directory %s as `%c'" dir char))) - -;;;###autoload -(defun dired-ranger-bookmark-visit (char) - "Visit bookmark CHAR. - -If the associated dired buffer was killed, we try to reopen it -according to the setting `dired-ranger-bookmark-reopen'. - -The special bookmark `dired-ranger-bookmark-LRU' always jumps to -the least recently visited dired buffer. - -See also `dired-ranger-bookmark'." - (interactive "cBookmark name: ") - (if (eq char dired-ranger-bookmark-LRU) - (progn - (let ((buffers (buffer-list))) - (when (eq (with-current-buffer (car buffers) major-mode) 'dired-mode) - (pop buffers)) - (switch-to-buffer (--first (eq (with-current-buffer it major-mode) 'dired-mode) buffers)))) - (-if-let* ((value (cdr (assoc char dired-ranger-bookmarks))) - (dir (car value)) - (buffer (cdr value))) - (if (buffer-live-p buffer) - (switch-to-buffer buffer) - (when - ;; TODO: abstract this never/always/ask pattern. It is - ;; also used in filter. - (cond - ((eq dired-ranger-bookmark-reopen 'never) nil) - ((eq dired-ranger-bookmark-reopen 'always) t) - ((eq dired-ranger-bookmark-reopen 'ask) - (y-or-n-p (format "The dired buffer referenced by this bookmark does not exist. Should we try to reopen `%s'?" dir)))) - (find-file dir) - (setf (cdr (assoc char dired-ranger-bookmarks)) (cons dir (current-buffer))))) - (message "Bookmark `%c' does not exist." char)))) - -(provide 'dired-ranger) -;;; dired-ranger.el ends here diff --git a/org/elpa/dired-single-20211101.2319/dired-single-autoloads.el b/org/elpa/dired-single-20211101.2319/dired-single-autoloads.el deleted file mode 100644 index b89f7ff..0000000 --- a/org/elpa/dired-single-20211101.2319/dired-single-autoloads.el +++ /dev/null @@ -1,73 +0,0 @@ -;;; dired-single-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-single" "dired-single.el" (0 0 0 0)) -;;; Generated autoloads from dired-single.el - -(autoload 'dired-single-buffer "dired-single" "\ -Visit selected directory in current buffer. - -Visits the selected directory in the current buffer, replacing the - current contents with the contents of the new directory. This doesn't - prevent you from having more than one dired buffer. The main difference - is that a given dired buffer will not spawn off a new buffer every time - a new directory is visited. - -If the variable `dired-single-use-magic-buffer' is non-nil, and the current - buffer's name is the same as that specified by the variable -`dired-single-magic-buffer-name', then the new directory's buffer will retain - that same name (i.e. not only will dired only use a single buffer, but -its name will not change every time a new directory is entered). - -Optional argument DEFAULT-DIRNAME specifies the directory to visit; if not -specified, the directory or file on the current line is used (assuming it's -a dired buffer). If the current line represents a file, the file is visited -in another window. - -\(fn &optional DEFAULT-DIRNAME)" t nil) - -(autoload 'dired-single-buffer-mouse "dired-single" "\ -Mouse-initiated version of `dired-single-buffer' (which see). - -Argument CLICK is the mouse-click event. - -\(fn CLICK)" t nil) - -(autoload 'dired-single-magic-buffer "dired-single" "\ -Switch to buffer whose name is the value of `dired-single-magic-buffer-name'. - -If no such buffer exists, launch dired in a new buffer and rename that buffer -to the value of `dired-single-magic-buffer-name'. If the current buffer is the -magic buffer, it will prompt for a new directory to visit. - -Optional argument DEFAULT-DIRNAME specifies the directory to visit (defaults to -the currently displayed directory). - -\(fn &optional DEFAULT-DIRNAME)" t nil) - -(autoload 'dired-single-toggle-buffer-name "dired-single" "\ -Toggle between the 'magic' buffer name and the 'real' dired buffer name. - -Will also seek to uniquify the 'real' buffer name." t nil) - -(autoload 'dired-single-up-directory "dired-single" "\ -Like `dired-up-directory' but with `dired-single-buffer'. - -\(fn &optional OTHER-WINDOW)" t nil) - -(register-definition-prefixes "dired-single" '("dired-single-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-single-autoloads.el ends here diff --git a/org/elpa/dired-single-20211101.2319/dired-single-pkg.el b/org/elpa/dired-single-20211101.2319/dired-single-pkg.el deleted file mode 100644 index cc8a0b8..0000000 --- a/org/elpa/dired-single-20211101.2319/dired-single-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-single.el -*- no-byte-compile: t -*- -(define-package "dired-single" "20211101.2319" "Reuse the current dired buffer to visit a directory" 'nil :commit "b254f9b7bfc96a5eab5760a56811f2872d2c590a" :keywords '("dired" "reuse" "buffer") :url "https://github.com/crocket/dired-single") diff --git a/org/elpa/dired-single-20211101.2319/dired-single.el b/org/elpa/dired-single-20211101.2319/dired-single.el deleted file mode 100644 index 20e6dd2..0000000 --- a/org/elpa/dired-single-20211101.2319/dired-single.el +++ /dev/null @@ -1,215 +0,0 @@ -;;; dired-single.el --- Reuse the current dired buffer to visit a directory - -;; Version: 0.3.0 -;; Package-Version: 20211101.2319 -;; Package-Commit: b254f9b7bfc96a5eab5760a56811f2872d2c590a -;; Keywords: dired, reuse, buffer -;; URL: https://github.com/crocket/dired-single -;; License: public-domain - -;;; Code: -(eval-when-compile - (defvar byte-compile-dynamic nil) ; silence the old byte-compiler - (set (make-local-variable 'byte-compile-dynamic) t)) - -(eval-and-compile - (require 'cl-lib) - (require 'dired) - (autoload 'dired-get-filename "dired")) - -;;; ************************************************************************** -;;; ***** customization routines -;;; ************************************************************************** -(defgroup dired-single nil - "dired-single package customization" - :group 'tools) - -;; --------------------------------------------------------------------------- -(defun dired-single-customize () - "Customization of the group `dired-single'." - (interactive) - (customize-group "dired-single")) - -;; --------------------------------------------------------------------------- -(defcustom dired-single-use-magic-buffer t - "Boolean that indicates the use of a single dired buffer name. - -It is used to determine if the dired-single functions should look for and -retain a specific buffer name. The buffer name to look for is specified -with `dired-single-magic-buffer-name'." - :group 'dired-single - :type 'boolean) - -;; --------------------------------------------------------------------------- -(defcustom dired-single-magic-buffer-name "*dired*" - "Name of buffer to use if `dired-single-use-magic-buffer' is true. - -Once a dired buffer has this name, it will always keep this name (unless it's - explicitly renamed by you)." - :group 'dired-single - :type 'string) - -;; --------------------------------------------------------------------------- -(defcustom dired-single-load-hook nil - "Hook to run when package is loaded." - :type 'hook - :group 'dired-single) - -;;; ************************************************************************** -;;; ***** version related routines -;;; ************************************************************************** -(defconst dired-single-version - "$Revision: 1.7 $" - "Version number for dired-single package.") - -;; --------------------------------------------------------------------------- -(defun dired-single-version-number () - "Return dired-single version number." - (string-match "[0123456789.]+" dired-single-version) - (match-string 0 dired-single-version)) - -;; --------------------------------------------------------------------------- -(defun dired-single-display-version () - "Display dired-single version." - (interactive) - (message "dired-single version <%s>." (dired-single-version-number))) - -;;; ************************************************************************** -;;; ***** interactive functions -;;; ************************************************************************** -;;;###autoload -(defun dired-single-buffer (&optional default-dirname) - "Visit selected directory in current buffer. - -Visits the selected directory in the current buffer, replacing the - current contents with the contents of the new directory. This doesn't - prevent you from having more than one dired buffer. The main difference - is that a given dired buffer will not spawn off a new buffer every time - a new directory is visited. - -If the variable `dired-single-use-magic-buffer' is non-nil, and the current - buffer's name is the same as that specified by the variable -`dired-single-magic-buffer-name', then the new directory's buffer will retain - that same name (i.e. not only will dired only use a single buffer, but -its name will not change every time a new directory is entered). - -Optional argument DEFAULT-DIRNAME specifies the directory to visit; if not -specified, the directory or file on the current line is used (assuming it's -a dired buffer). If the current line represents a file, the file is visited -in another window." - (interactive) - ;; use arg passed in or find name of current line - (let ((name (or default-dirname (dired-get-filename nil t)))) - (save-excursion - (save-match-data - ;; See if the selection is a directory or not. - (end-of-line) - (let ((eol (point))) - (beginning-of-line) - ;; assume directory if arg passed in - (if (or default-dirname (re-search-forward "^ d" eol t)) - ;; save current buffer's name - (let ((current-buffer-name (buffer-name))) - ;; go ahead and read in the directory - (find-alternate-file name) - ;; if the saved buffer's name was the magic name, rename this buffer - (if (and dired-single-use-magic-buffer - (string= current-buffer-name dired-single-magic-buffer-name)) - (rename-buffer dired-single-magic-buffer-name))) - ;; it's just a file - (find-file name))))))) - -;;;; ------------------------------------------------------------------------ -;;;###autoload -(defun dired-single-buffer-mouse (click) - "Mouse-initiated version of `dired-single-buffer' (which see). - -Argument CLICK is the mouse-click event." - (interactive "e") - (let* ( (start (event-start click)) - (window (car start)) - (pos (car (cdr start))) ) - (select-window window) - (goto-char pos)) - (dired-single-buffer)) - -;;;; ------------------------------------------------------------------------ -;;;###autoload -(defun dired-single-magic-buffer (&optional default-dirname) - "Switch to buffer whose name is the value of `dired-single-magic-buffer-name'. - -If no such buffer exists, launch dired in a new buffer and rename that buffer -to the value of `dired-single-magic-buffer-name'. If the current buffer is the -magic buffer, it will prompt for a new directory to visit. - -Optional argument DEFAULT-DIRNAME specifies the directory to visit (defaults to -the currently displayed directory)." - (interactive) - ;; do we not have one or are we already in it? - (let ((magic-dired-buffer (get-buffer dired-single-magic-buffer-name))) - (if (or (eq magic-dired-buffer nil) - (eq magic-dired-buffer (current-buffer))) - ;; nothing to switch to - ;; get directory name to start in - (let ((dirname (or default-dirname - (read-file-name (format "Dired %s(directory): " "") - nil default-directory t)))) - - ;; make sure it's really a directory - (if (not (file-directory-p dirname)) - (error "Error: <%s> is not a directory" dirname)) - - ;; do we need a new buffer? - (if (eq magic-dired-buffer nil) - ;; find the file in new buffer, current window - (find-file dirname) - ;; just find in place of current buffer - (find-alternate-file dirname)) - ;; rename the buffer, where ever we found it - (rename-buffer dired-single-magic-buffer-name)) - ;; we're not there (we have one already), so simply switch to it - (switch-to-buffer magic-dired-buffer) - ;; if called with a default, try it again - (if default-dirname - (dired-single-magic-buffer default-dirname))))) - -;;;; ------------------------------------------------------------------------ -;;;###autoload -(defun dired-single-toggle-buffer-name () - "Toggle between the 'magic' buffer name and the 'real' dired buffer name. - -Will also seek to uniquify the 'real' buffer name." - (interactive) - - ;; make sure it's a dired buffer - (if (not (string= major-mode "dired-mode")) - (error "Error: not a dired buffer")) - - ;; do we have magic name currently? - (if (string= (buffer-name) dired-single-magic-buffer-name) - (rename-buffer - (abbreviate-file-name - (expand-file-name (directory-file-name default-directory))) t) - - ;; make sure the buffer doesn't currently exist - (let ((existing-buffer (get-buffer dired-single-magic-buffer-name))) - (if existing-buffer - (kill-buffer existing-buffer)) - (rename-buffer dired-single-magic-buffer-name)))) - -;;;; ------------------------------------------------------------------------ -;;;###autoload -(defun dired-single-up-directory (&optional other-window) - "Like `dired-up-directory' but with `dired-single-buffer'." - (interactive) - ;; replace dired with dired-single-buffer - (cl-letf (((symbol-function 'dired) (symbol-function 'dired-single-buffer))) - (dired-up-directory other-window))) - -;;; ************************************************************************** -;;; ***** we're done -;;; ************************************************************************** -(provide 'dired-single) -(run-hooks 'dired-single-load-hook) - -;;; dired-single.el ends here diff --git a/org/elpa/git-20140128.1041/git-autoloads.el b/org/elpa/git-20140128.1041/git-autoloads.el new file mode 100644 index 0000000..219c6d3 --- /dev/null +++ b/org/elpa/git-20140128.1041/git-autoloads.el @@ -0,0 +1,22 @@ +;;; git-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "git" "git.el" (0 0 0 0)) +;;; Generated autoloads from git.el + +(register-definition-prefixes "git" '("git-")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; git-autoloads.el ends here diff --git a/org/elpa/git-20140128.1041/git-pkg.el b/org/elpa/git-20140128.1041/git-pkg.el new file mode 100644 index 0000000..6e88e5c --- /dev/null +++ b/org/elpa/git-20140128.1041/git-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from git.el -*- no-byte-compile: t -*- +(define-package "git" "20140128.1041" "An Elisp API for programmatically using Git" '((s "1.7.0") (dash "2.2.0") (f "0.10.0")) :commit "a3396a7027a7d986598c6a2d6d5599bac918f3da" :authors '(("Johan Andersson" . "johan.rejeep@gmail.com")) :maintainer '("Johan Andersson" . "johan.rejeep@gmail.com") :keywords '("git") :url "http://github.com/rejeep/git.el") diff --git a/org/elpa/git-20140128.1041/git.el b/org/elpa/git-20140128.1041/git.el new file mode 100644 index 0000000..f1569bd --- /dev/null +++ b/org/elpa/git-20140128.1041/git.el @@ -0,0 +1,280 @@ +;;; git.el --- An Elisp API for programmatically using Git + +;; Copyright (C) 2013 Johan Andersson + +;; Author: Johan Andersson +;; Maintainer: Johan Andersson +;; Version: 0.1.1 +;; Package-Version: 20140128.1041 +;; Package-Commit: a3396a7027a7d986598c6a2d6d5599bac918f3da +;; Keywords: git +;; URL: http://github.com/rejeep/git.el +;; Package-Requires: ((s "1.7.0") (dash "2.2.0") (f "0.10.0")) + +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code: + +;; Todo: no-pager + +(require 's) +(require 'dash) +(require 'f) + +(defvar git-executable + (executable-find "git") + "Git executable.") + +(defvar git-repo nil + "Path to current working repo.") + +(defvar git-args nil + "List of args to include when running git command.") + +(defconst git-stash-re "^\\(.+?\\): \\(?:WIP on\\|On\\) \\(.+\\): \\(.+\\)$" + "Regular expression matching a stash.") + +(put 'git-error 'error-conditions '(error git-error)) +(put 'git-error 'error-message "GIT Error") + +(defun git-error (string &rest args) + "Signal a GIT error. + +Signal an error with `git-error' type. + +STRING is a `format' string, and ARGS are the formatted objects." + (signal 'git-error (list (apply #'format string args)))) + +(defun git-run (command &rest args) + "Run git COMMAND with ARGS." + (let ((default-directory (f-full git-repo))) + (with-temp-buffer + (let ((exit-code + (apply + 'call-process + (append + (list git-executable nil (current-buffer) nil) + (git--args command args))))) + (if (zerop exit-code) + (buffer-string) + (git-error + "Error running command: %s %s\n%s" + git-executable + (s-join " " (git--args command args)) + (buffer-string))))))) + +(defun git-repo? (directory) + "Return true if there is a git repo in DIRECTORY, false otherwise." + (or + (f-dir? (f-expand ".git" directory)) + (and + (f-dir? (f-expand "info" directory)) + (f-dir? (f-expand "objects" directory)) + (f-dir? (f-expand "refs" directory)) + (f-file? (f-expand "HEAD" directory))))) + +(defun git-branch? (branch) + "Return true if there's a branch called BRANCH." + (-contains? (git-branches) branch)) + +(defun git-tag? (tag) + "Return true if there's a tag called TAG." + (-contains? (git-tags) tag)) + +(defun git-on-branch () + "Return currently active branch." + (condition-case err + (git--clean (git-run "rev-parse" "--abbrev-ref" "HEAD")) + (git-error + (git-error "Repository not initialized")))) + +(defun git-on-branch? (branch) + "Return true if BRANCH is currently active." + (equal branch (git-on-branch))) + +(defun git-add (&rest files) + "Add PATH or everything." + (git-run "add" (or files "."))) + +(defun git-branch (branch) + "Create BRANCH." + (if (git-branch? branch) + (git-error "Branch already exists %s" branch) + (git-run "branch" branch))) + +(defun git-branches () + "List all available branches." + (-map + (lambda (line) + (if (s-starts-with? "*" line) + (substring line 2) + line)) + (git--lines (git-run "branch")))) + +(defun git-checkout (ref) + "Checkout REF." + (git-run "checkout" ref)) + +(defun git-clone (url &optional dir) + "Clone URL to DIR (if present)." + (git-run "clone" url dir)) + +(defun git-commit (message &rest files) + "Commit FILES (or added files) with MESSAGE." + (git-run "commit" (or files "-a") "--message" message files)) + +(defun git-fetch (&optional repo) + "Fetch REPO." + (git-run "fetch" repo)) + +(defun git-init (&optional dir bare) + "Create new Git repo at DIR (or `git-repo'). + +If BARE is true, create a bare repo." + (let ((git-repo (or dir git-repo))) + (git-run "init" (and bare "--bare")))) + +;; Todo: The solution used here is not bulletproof. For example if the +;; message contains a pipe, the :message will only include everything +;; before that pipe. Figure out a good solution for this. +(defun git-log (&optional branch) + "Log history on BRANCH." + (let ((logs (git--lines (git-run "log" "--format=%h|%an|%ae|%cn|%ce|%ad|%s")))) + (-map + (lambda (log) + (let ((data (s-split "|" log))) + (list + :commit (nth 0 data) + :author-name (nth 1 data) + :author-email (nth 2 data) + :comitter-name (nth 3 data) + :comitter-email (nth 4 data) + :date (nth 5 data) + :message (nth 6 data)))) + logs))) + +(defun git-config (option &optional value) + "Set or get config OPTION. Set to VALUE if present." + (condition-case err + (git--clean (git-run "config" option value)) + (git-error))) + +(defun git-pull (&optional repo ref) + "Pull REF from REPO." + (git-run "pull" repo ref)) + +(defun git-push (&optional repo ref) + "Push REF to REPO." + (git-run "push" repo ref)) + +(defun git-remote? (name) + "Return true if remote with NAME exists, false otherwise." + (-contains? (git-remotes) name)) + +(defun git-remotes () + "Return list of all remotes." + (git--lines (git-run "remote"))) + +(defun git-remote-add (name url) + "Add remote with NAME and URL." + (git-run "remote" "add" name url)) + +(defun git-remote-remove (name) + "Remove remote with NAME." + (if (git-remote? name) + (git-run "remote" "remove" name) + (git-error "No such remote %s" name))) + +(defun git-reset (&optional commit mode) + "Reset to COMMIT with MODE." + (git-run "reset" (if mode (concat "--" (symbol-name mode))) commit)) + +(defun git-rm (path &optional recursive) + "Remove PATH. + +To remove directory, use RECURSIVE argument." + (git-run "rm" path (and recursive "-r"))) + +(defun git-stash (&optional message) + "Stash changes in a dirty tree with MESSAGE. + +If a stash was created, the name of the stash is returned, +otherwise nil is returned." + (let ((before-stashes (git-stashes)) after-stashes) + (git-run "stash" "save" message) + (setq after-stashes (git-stashes)) + (if (> (length after-stashes) (length before-stashes)) + (plist-get (car after-stashes) :name)))) + +(defun git-stashes () + "Return list of stashes." + (let ((stashes (git--lines (git-run "stash" "list")))) + (-map + (lambda (stash) + (let ((matches (s-match git-stash-re stash))) + (list :name (nth 1 matches) + :branch (nth 2 matches) + :message (nth 3 matches)))) + stashes))) + +(defun git-stash-pop (&optional name) + "Apply and remove stash with NAME (or first stash)." + (git-run "stash" "pop" name)) + +(defun git-stash-apply (&optional name) + "Apply and keep stash with NAME (or first stash)." + (git-run "stash" "apply" name)) + +(defun git-tag (tag) + "Create TAG." + (if (git-tag? tag) + (git-error "Tag already exists %s" tag) + (git-run "tag" tag))) + +(defun git-tags () + "Return list of all tags." + (git--lines (git-run "tag"))) + +(defun git-untracked-files () + "Return list of untracked files." + (git--lines + (git-run "ls-files" "--other" "--exclude-standard"))) + +(defun git-staged-files () + "Return list of staged files." + (git--lines + (git-run "diff" "--cached" "--name-only"))) + + +;;;; Helpers + +(defun git--lines (string) + (-reject 's-blank? (-map 's-trim (s-lines string)))) + +(defun git--clean (string) + (s-presence (s-trim string))) + +(defun git--args (command &rest args) + (-flatten (-reject 'null (append (list "--no-pager" command) args git-args)))) + + +(provide 'git) + +;;; git.el ends here diff --git a/org/elpa/origami-20200331.1019/origami-autoloads.el b/org/elpa/origami-20200331.1019/origami-autoloads.el new file mode 100644 index 0000000..60a3561 --- /dev/null +++ b/org/elpa/origami-20200331.1019/origami-autoloads.el @@ -0,0 +1,76 @@ +;;; origami-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "origami" "origami.el" (0 0 0 0)) +;;; Generated autoloads from origami.el + +(autoload 'origami-mode "origami" "\ +Minor mode to selectively hide/show text in the current buffer. +With a prefix argument ARG, enable the mode if ARG is positive, +and disable it otherwise. If called from Lisp, enable the mode +if ARG is omitted or nil. + +Lastly, the normal hook `origami-mode-hook' is run using +`run-hooks'. + +Key bindings: +\\{origami-mode-map} + +\(fn &optional ARG)" t nil) + +(put 'global-origami-mode 'globalized-minor-mode t) + +(defvar global-origami-mode nil "\ +Non-nil if Global Origami mode is enabled. +See the `global-origami-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `global-origami-mode'.") + +(custom-autoload 'global-origami-mode "origami" nil) + +(autoload 'global-origami-mode "origami" "\ +Toggle Origami mode in all buffers. +With prefix ARG, enable Global Origami mode if ARG is positive; +otherwise, disable it. + +If called from Lisp, toggle the mode if ARG is `toggle'. +Enable the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +Origami mode is enabled in all buffers where `(lambda nil +\(origami-mode 1))' would do it. + +See `origami-mode' for more information on Origami mode. + +\(fn &optional ARG)" t nil) + +(register-definition-prefixes "origami" '("origami-")) + +;;;*** + +;;;### (autoloads nil "origami-parsers" "origami-parsers.el" (0 0 +;;;;;; 0 0)) +;;; Generated autoloads from origami-parsers.el + +(register-definition-prefixes "origami-parsers" '("origami-")) + +;;;*** + +;;;### (autoloads nil nil ("origami-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; origami-autoloads.el ends here diff --git a/org/elpa/origami-20200331.1019/origami-parsers.el b/org/elpa/origami-20200331.1019/origami-parsers.el new file mode 100644 index 0000000..78bee8f --- /dev/null +++ b/org/elpa/origami-20200331.1019/origami-parsers.el @@ -0,0 +1,266 @@ +;;; origami-parsers.el --- Collection of parsers -*- lexical-binding: t -*- + +;; Author: Greg Sexton +;; Version: 1.0 +;; Keywords: parsers +;; URL: https://github.com/gregsexton/ + +;; The MIT License (MIT) + +;; Copyright (c) 2014 Greg Sexton + +;; Permission is hereby granted, free of charge, to any person obtaining a copy +;; of this software and associated documentation files (the "Software"), to deal +;; in the Software without restriction, including without limitation the rights +;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +;; copies of the Software, and to permit persons to whom the Software is +;; furnished to do so, subject to the following conditions: + +;; The above copyright notice and this permission notice shall be included in +;; all copies or substantial portions of the Software. + +;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +;; THE SOFTWARE. + +;;; Commentary: + +;;; Code: +(require 'cl) +(require 'dash) + +(defun origami-get-positions (content regex) + "Returns a list of positions where REGEX matches in CONTENT. A +position is a cons cell of the character and the numerical +position in the CONTENT." + (with-temp-buffer + (insert content) + (goto-char (point-min)) + (let (acc) + (while (re-search-forward regex nil t) + (let ((match (match-string 0))) + (setq acc (cons (cons match (- (point) (length match))) + acc)))) + (reverse acc)))) + +(defun origami-indent-parser (create) + (cl-labels ((lines (string) (origami-get-positions string ".*?\r?\n")) + (annotate-levels (lines) + (-map (lambda (line) + ;; TODO: support tabs + (let ((indent (length (car (s-match "^ *" (car line))))) + (beg (cdr line)) + (end (+ (cdr line) (length (car line)) -1))) + (if (s-blank? (s-trim (car line))) + 'newline ;sentinel representing line break + (vector indent beg end (- end beg))))) + lines)) + (indent (line) (if (eq line 'newline) -1 (aref line 0))) + (beg (line) (aref line 1)) + (end (line) (aref line 2)) + (offset (line) (aref line 3)) + (collapse-same-level (lines) + (->> + (cdr lines) + (-reduce-from (lambda (acc line) + (cond ((and (eq line 'newline) (eq (car acc) 'newline)) acc) + ((= (indent line) (indent (car acc))) + (cons (vector (indent (car acc)) + (beg (car acc)) + (end line) + (offset (car acc))) + (cdr acc))) + (t (cons line acc)))) + (list (car lines))) + (remove 'newline) + reverse)) + (create-tree (levels) + (if (null levels) + levels + (let ((curr-indent (indent (car levels)))) + (->> levels + (-partition-by (lambda (l) (= (indent l) curr-indent))) + (-partition-all 2) + (-mapcat (lambda (x) + ;takes care of multiple identical levels, introduced when there are newlines + (-concat + (-map 'list (butlast (car x))) + (list (cons (-last-item (car x)) (create-tree (cadr x))))))))))) + (build-nodes (tree) + (if (null tree) (cons 0 nil) + ;; complexity here is due to having to find the end of the children so that the + ;; parent encompasses them + (-reduce-r-from (lambda (nodes acc) + (destructuring-bind (children-end . children) (build-nodes (cdr nodes)) + (let ((this-end (max children-end (end (car nodes))))) + (cons (max this-end (car acc)) + (cons (funcall create + (beg (car nodes)) + this-end + (offset (car nodes)) + children) + (cdr acc)))))) + '(0 . nil) + tree)))) + (lambda (content) + (-> content + lines + annotate-levels + collapse-same-level + create-tree + build-nodes + cdr)))) + +(defun origami-build-pair-tree (create open close positions) + (cl-labels ((build (positions) + ;; this is so horrible, but fast + (let (acc beg (should-continue t)) + (while (and should-continue positions) + (cond ((equal (caar positions) open) + (if beg ;go down a level + (let* ((res (build positions)) + (new-pos (car res)) + (children (cdr res))) + (setq positions (cdr new-pos)) + (setq acc (cons (funcall create beg (cdar new-pos) (length open) children) + acc)) + (setq beg nil)) + ;; begin a new pair + (setq beg (cdar positions)) + (setq positions (cdr positions)))) + ((equal (caar positions) close) + (if beg + (progn ;close with no children + (setq acc (cons (funcall create beg (cdar positions) (length close) nil) + acc)) + (setq positions (cdr positions)) + (setq beg nil)) + (setq should-continue nil))))) + (cons positions (reverse acc))))) + (cdr (build positions)))) + +;;; TODO: tag these nodes? have ability to manipulate nodes that are +;;; tagged? in a scoped fashion? +(defun origami-javadoc-parser (create) + (lambda (content) + (let ((positions (->> (origami-get-positions content "/\\*\\*\\|\\*/") + (-filter (lambda (position) + (eq (get-text-property 0 'face (car position)) + 'font-lock-doc-face)))))) + (origami-build-pair-tree create "/**" "*/" positions)))) + +(defun origami-c-style-parser (create) + (lambda (content) + (let ((positions (->> (origami-get-positions content "[{}]") + (remove-if (lambda (position) + (let ((face (get-text-property 0 'face (car position)))) + (-any? (lambda (f) + (memq f '(font-lock-doc-face + font-lock-comment-face + font-lock-string-face))) + (if (listp face) face (list face))))))))) + (origami-build-pair-tree create "{" "}" positions)))) + +(defun origami-c-macro-parser (create) + (lambda (content) + (let ((positions (origami-get-positions content "#if\\|#endif"))) + (origami-build-pair-tree create "#if" "#endif" positions)))) + +(defun origami-c-parser (create) + (let ((c-style (origami-c-style-parser create)) + (macros (origami-c-macro-parser create))) + (lambda (content) + (origami-fold-children + (origami-fold-shallow-merge + (origami-fold-root-node (funcall c-style content)) + (origami-fold-root-node (funcall macros content))))))) + +(defun origami-java-parser (create) + (let ((c-style (origami-c-style-parser create)) + (javadoc (origami-javadoc-parser create))) + (lambda (content) + (origami-fold-children + (origami-fold-shallow-merge (origami-fold-root-node (funcall c-style content)) + (origami-fold-root-node (funcall javadoc content))))))) + +(defun origami-python-parser (create) + (lambda (content) + (with-temp-buffer + (insert content) + (python-mode) + (defun python-subparser (beg end) + "find all fold block between beg and end." + (goto-char beg) + (let (acc) + ;; iterate all same level children. + (while (and (beginning-of-defun -1) (<= (point) end)) ;; have children between beg and end? + (let* ((new-beg (point)) + (new-offset (progn (search-forward-regexp ":" nil t) (- (point) new-beg))) + (new-end (progn (end-of-defun) (point)))) + (setq acc (cons (funcall create new-beg new-end new-offset + (python-subparser new-beg new-end)) + acc)) + (goto-char new-end))) + acc)) + (python-subparser (point-min) (point-max))))) + +(defun origami-lisp-parser (create regex) + (lambda (content) + (with-temp-buffer + (insert content) + (goto-char (point-min)) + (beginning-of-defun -1) + (let (beg end offset acc) + (while (< (point) (point-max)) + (setq beg (point)) + (search-forward-regexp regex nil t) + (setq offset (- (point) beg)) + (end-of-defun) + (backward-char) ;move point to one after the last paren + (setq end (1- (point))) ;don't include the last paren in the fold + (when (> offset 0) + (setq acc (cons (funcall create beg end offset nil) acc))) + (beginning-of-defun -1)) + (reverse acc))))) + +(defun origami-elisp-parser (create) + (origami-lisp-parser create "(def\\w*\\s-*\\(\\s_\\|\\w\\|[:?!]\\)*\\([ \\t]*(.*?)\\)?")) + +(defun origami-clj-parser (create) + (origami-lisp-parser create "(def\\(\\w\\|-\\)*\\s-*\\(\\s_\\|\\w\\|[?!]\\)*\\([ \\t]*\\[.*?\\]\\)?")) + +(defun origami-markers-parser (start-marker end-marker) + "Create a parser for simple start and end markers." + (let ((regex (rx-to-string `(or ,start-marker ,end-marker)))) + (lambda (create) + (lambda (content) + (let ((positions (origami-get-positions content regex))) + (origami-build-pair-tree create start-marker end-marker positions)))))) + +(defcustom origami-parser-alist + `((java-mode . origami-java-parser) + (c-mode . origami-c-parser) + (c++-mode . origami-c-style-parser) + (perl-mode . origami-c-style-parser) + (cperl-mode . origami-c-style-parser) + (js-mode . origami-c-style-parser) + (js2-mode . origami-c-style-parser) + (js3-mode . origami-c-style-parser) + (go-mode . origami-c-style-parser) + (php-mode . origami-c-style-parser) + (python-mode . origami-python-parser) + (emacs-lisp-mode . origami-elisp-parser) + (lisp-interaction-mode . origami-elisp-parser) + (clojure-mode . origami-clj-parser) + (triple-braces . ,(origami-markers-parser "{{{" "}}}"))) + "alist mapping major-mode to parser function." + :type 'hook + :group 'origami) + +(provide 'origami-parsers) + +;;; origami-parsers.el ends here diff --git a/org/elpa/origami-20200331.1019/origami-pkg.el b/org/elpa/origami-20200331.1019/origami-pkg.el new file mode 100644 index 0000000..430657b --- /dev/null +++ b/org/elpa/origami-20200331.1019/origami-pkg.el @@ -0,0 +1,15 @@ +(define-package "origami" "20200331.1019" "Flexible text folding" + '((s "1.9.0") + (dash "2.5.0") + (emacs "24") + (cl-lib "0.5")) + :commit "e558710a975e8511b9386edc81cd6bdd0a5bda74" :authors + '(("Greg Sexton" . "gregsexton@gmail.com")) + :maintainer + '("Greg Sexton" . "gregsexton@gmail.com") + :keywords + '("folding") + :url "https://github.com/gregsexton/origami.el") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/org/elpa/origami-20200331.1019/origami.el b/org/elpa/origami-20200331.1019/origami.el new file mode 100644 index 0000000..b9667fd --- /dev/null +++ b/org/elpa/origami-20200331.1019/origami.el @@ -0,0 +1,828 @@ +;;; origami.el --- Flexible text folding -*- lexical-binding: t -*- + +;; Author: Greg Sexton +;; Version: 1.0 +;; Keywords: folding +;; URL: https://github.com/gregsexton/origami.el +;; Package-Requires: ((s "1.9.0") (dash "2.5.0") (emacs "24") (cl-lib "0.5")) + +;; The MIT License (MIT) + +;; Copyright (c) 2014 Greg Sexton + +;; Permission is hereby granted, free of charge, to any person obtaining a copy +;; of this software and associated documentation files (the "Software"), to deal +;; in the Software without restriction, including without limitation the rights +;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +;; copies of the Software, and to permit persons to whom the Software is +;; furnished to do so, subject to the following conditions: + +;; The above copyright notice and this permission notice shall be included in +;; all copies or substantial portions of the Software. + +;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +;; THE SOFTWARE. + +;;; Commentary: + +;;; Code: + +(require 'dash) +(require 's) +(require 'cl-lib) +(require 'origami-parsers) + +;;; fold display mode and faces + +(defgroup origami nil + "Flexible text folding" + :prefix "origami-" + :group 'convenience) + +(defcustom origami-fold-replacement "..." + ;; TODO: this should also be specifiable as a function: folded text -> string + "Show this string instead of the folded text." + :type 'string + :group 'origami) + +(defcustom origami-show-fold-header nil + "Highlight the line the fold start on." + :type 'boolean + :group 'origami) + +(defface origami-fold-header-face + `((t (:box (:line-width 1 :color ,(face-attribute 'highlight :background)) + :background ,(face-attribute 'highlight :background)))) + "Face used to display fold headers.") + +(defface origami-fold-fringe-face + '((t ())) + "Face used to display fringe contents.") + +(defface origami-fold-replacement-face + '((t :inherit 'font-lock-comment-face)) + "Face used to display the fold replacement text.") + +;;; overlay manipulation + +(defun origami-header-overlay-range (fold-overlay) + "Given a `fold-overlay', return the range that the corresponding +header overlay should cover. Result is a cons cell of (begin . end)." + (with-current-buffer (overlay-buffer fold-overlay) + (let ((fold-begin + (save-excursion + (goto-char (overlay-start fold-overlay)) + (line-beginning-position))) + (fold-end + ;; Find the end of the folded region -- include the following + ;; newline if possible. The header will span the entire fold. + (save-excursion + (goto-char (overlay-end fold-overlay)) + (when (looking-at ".") + (forward-char 1) + (when (looking-at "\n") + (forward-char 1))) + (point)))) + (cons fold-begin fold-end)))) + +(defun origami-header-overlay-reset-position (header-overlay) + (-when-let (fold-ov (overlay-get header-overlay 'fold-overlay)) + (let ((range (origami-header-overlay-range fold-ov))) + (move-overlay header-overlay (car range) (cdr range))))) + +(defun origami-header-modify-hook (header-overlay after-p b e &optional l) + (if after-p (origami-header-overlay-reset-position header-overlay))) + +(defun origami-create-overlay (beg end offset buffer) + (when (> (- end beg) 0) + (let ((ov (make-overlay (+ beg offset) end buffer))) + (overlay-put ov 'creator 'origami) + (overlay-put ov 'isearch-open-invisible 'origami-isearch-show) + (overlay-put ov 'isearch-open-invisible-temporary + (lambda (ov hide-p) (if hide-p (origami-hide-overlay ov) + (origami-show-overlay ov)))) + ;; We create a header overlay even when disabled; this could be avoided, + ;; especially if we called origami-reset for each buffer if customizations + ;; changed. + (let* ((range (origami-header-overlay-range ov)) + (header-ov (make-overlay (car range) (cdr range) buffer + nil))) ;; no front advance + (overlay-put header-ov 'creator 'origami) + (overlay-put header-ov 'fold-overlay ov) + (overlay-put header-ov 'modification-hooks '(origami-header-modify-hook)) + (overlay-put ov 'header-ov header-ov)) + ov))) + +(defun origami-hide-overlay (ov) + (overlay-put ov 'invisible 'origami) + (overlay-put ov 'display origami-fold-replacement) + (overlay-put ov 'face 'origami-fold-replacement-face) + (if origami-show-fold-header + (origami-activate-header (overlay-get ov 'header-ov)))) + +(defun origami-show-overlay (ov) + (overlay-put ov 'invisible nil) + (overlay-put ov 'display nil) + (overlay-put ov 'face nil) + (origami-deactivate-header (overlay-get ov 'header-ov))) + +(defun origami-hide-node-overlay (node) + (-when-let (ov (origami-fold-data node)) + (origami-hide-overlay ov))) + +(defun origami-show-node-overlay (node) + (-when-let (ov (origami-fold-data node)) + (origami-show-overlay ov))) + +(defun origami-activate-header (ov) + ;; Reposition the header overlay. Since it extends before the folded area, it + ;; may no longer cover the appropriate locations. + (origami-header-overlay-reset-position ov) + (overlay-put ov 'origami-header-active t) + (overlay-put ov 'face 'origami-fold-header-face) + (overlay-put ov 'before-string + (propertize + "…" + 'display + '(left-fringe empty-line origami-fold-fringe-face)))) + +(defun origami-deactivate-header (ov) + (overlay-put ov 'origami-header-active nil) + (overlay-put ov 'face nil) + (overlay-put ov 'before-string nil) + (overlay-put ov 'after-string nil)) + +(defun origami-isearch-show (ov) + (origami-show-node (current-buffer) (point))) + +(defun origami-hide-overlay-from-fold-tree-fn (node) + (origami-fold-postorder-each node 'origami-hide-node-overlay)) + +(defun origami-show-overlay-from-fold-tree-fn (node) + (origami-fold-postorder-each node 'origami-show-node-overlay)) + +(defun origami-change-overlay-from-fold-node-fn (old new) + (if (origami-fold-open? new) + (origami-show-node-overlay old) + (origami-hide-node-overlay new))) + +(defun origami-remove-all-overlays (buffer) + (with-current-buffer buffer + (remove-overlays (point-min) (point-max) 'creator 'origami))) + +;;; fold structure + +(defun origami-fold-node (beg end offset open &optional children data) + (let ((sorted-children (-sort (lambda (a b) + (or (< (origami-fold-beg a) (origami-fold-beg b)) + (and (= (origami-fold-beg a) (origami-fold-beg b)) + (< (origami-fold-end a) (origami-fold-end b))))) + (remove nil children)))) + ;; ensure invariant: no children overlap + (when (-some? (lambda (pair) + (let ((a (car pair)) + (b (cadr pair))) + (when b ;for the odd numbered case - there may be a single item + ;; the < function doesn't support varargs + (or (>= (origami-fold-beg a) (origami-fold-end a)) + (>= (origami-fold-end a) (origami-fold-beg b)) + (>= (origami-fold-beg b) (origami-fold-end b)))))) + (-partition-all-in-steps 2 1 sorted-children)) + (error "Tried to construct a node where the children overlap or are not distinct regions: %s" + sorted-children)) + ;; ensure invariant: parent encompases children + (let ((beg-children (origami-fold-beg (car sorted-children))) + (end-children (origami-fold-end (-last-item sorted-children)))) + (if (and beg-children (or (> beg beg-children) (< end end-children))) + (error "Node does not overlap children in range. beg=%s end=%s beg-children=%s end-children=%s" + beg end beg-children end-children) + (if (> (+ beg offset) end) + (error "Offset is not within the range of the node: beg=%s end=%s offset=%s" beg end offset) + (vector beg end offset open sorted-children data)))))) + +(defun origami-fold-root-node (&optional children) + "Create a root container node." + (origami-fold-node 1 most-positive-fixnum 0 t children 'root)) + +(defun origami-fold-is-root-node? (node) (eq (origami-fold-data node) 'root)) + +(defun origami-fold-beg (node) + (when node + (if (origami-fold-is-root-node? node) + (aref node 0) + (- (overlay-start (origami-fold-data node)) (origami-fold-offset node))))) + +(defun origami-fold-end (node) + (when node + (if (origami-fold-is-root-node? node) + (aref node 1) + (overlay-end (origami-fold-data node))))) + +(defun origami-fold-offset (node) (when node (aref node 2))) + +(defun origami-fold-open? (node) (when node (aref node 3))) + +(defun origami-fold-open-set (node value) + (when node + (if (origami-fold-is-root-node? node) + node + (origami-fold-node (origami-fold-beg node) + (origami-fold-end node) + (origami-fold-offset node) + value + (origami-fold-children node) + (origami-fold-data node))))) + +(defun origami-fold-children (node) (when node (aref node 4))) + +(defun origami-fold-children-set (node children) + (when node + (origami-fold-node (origami-fold-beg node) + (origami-fold-end node) + (origami-fold-offset node) + (origami-fold-open? node) + children + (origami-fold-data node)))) + +(defun origami-fold-data (node) (when node (aref node 5))) + +;;; fold structure utils + +(defun origami-fold-range-equal (a b) + (and (equal (origami-fold-beg a) (origami-fold-beg b)) + (equal (origami-fold-end a) (origami-fold-end b)))) + +(defun origami-fold-state-equal (a b) + (equal (origami-fold-open? a) (origami-fold-open? b))) + +(defun origami-fold-add-child (node new) + (origami-fold-children-set node + (cons new (origami-fold-children node)))) + +(defun origami-fold-replace-child (node old new) + (origami-fold-children-set node + (cons new (remove old (origami-fold-children node))))) + +(defun origami-fold-assoc (path f) + "Rewrite the tree, replacing the node referenced by PATH with +F applied to the leaf." + (cdr + (-reduce-r-from (lambda (node acc) + (destructuring-bind (old-node . new-node) acc + (cons node (origami-fold-replace-child node old-node new-node)))) + (let ((leaf (-last-item path))) (cons leaf (funcall f leaf))) + (butlast path)))) + +(defun origami-fold-diff (old new on-add on-remove on-change) + (cl-labels ((diff-children (old-children new-children) + (let ((old (car old-children)) + (new (car new-children))) + (cond ((null old) (-each new-children on-add)) + ((null new) (-each old-children on-remove)) + ((and (null old) (null new)) nil) + ((origami-fold-range-equal old new) + (origami-fold-diff old new on-add on-remove on-change) + (diff-children (cdr old-children) (cdr new-children))) + ((<= (origami-fold-beg old) (origami-fold-beg new)) + (funcall on-remove old) + (diff-children (cdr old-children) new-children)) + (t (funcall on-add new) + (diff-children old-children (cdr new-children))))))) + (unless (origami-fold-range-equal old new) + (error "Precondition invalid: old must have the same range as new.")) + (unless (origami-fold-state-equal old new) + (funcall on-change old new)) + (diff-children (origami-fold-children old) + (origami-fold-children new)))) + +(defun origami-fold-postorder-each (node f) + (-each (origami-fold-children node) f) + (funcall f node)) + +(defun origami-fold-map (f tree) + "Map F over the tree. Replacing each node with the result of (f +node). The children cannot be manipulated using f as the map will +replace them. This cannot change the structure of the tree, just +the state of each node." + (origami-fold-children-set + (funcall f tree) + (-map (lambda (node) (origami-fold-map f node)) + (origami-fold-children tree)))) + +(defun origami-fold-path-map (f path) + "Map F over the nodes in path. As with `origami-fold-map', +children cannot be manipulated." + (cond ((null path) nil) + ((cdr path) (funcall f (origami-fold-replace-child (car path) + (cadr path) + (origami-fold-path-map f (cdr path))))) + (t (funcall f (car path))))) + +(defun origami-fold-find-deepest (tree pred) + (when tree + (when (funcall pred tree) + (-if-let (child (-first pred (origami-fold-children tree))) + (cons tree (origami-fold-find-deepest child pred)) + (list tree))))) + +(defun origami-fold-find-path-containing-range (tree beg end) + (origami-fold-find-deepest tree + (lambda (node) + (and (>= beg (origami-fold-beg node)) + (<= end (origami-fold-end node)))))) + +(defun origami-fold-find-path-with-range (tree beg end) + "Return the path to the most specific (deepest) node that has +exactly the range BEG-END, or null." + (-when-let (path (origami-fold-find-path-containing-range tree beg end)) + (let ((last (-last-item path))) + (when (and (= beg (origami-fold-beg last)) + (= end (origami-fold-end last))) + path)))) + +(defun origami-fold-find-path-containing (tree point) + "Return the path to the most specific (deepest) node that +contains point, or null." + (origami-fold-find-deepest tree + (lambda (node) + (and (<= (origami-fold-beg node) point) + (>= (origami-fold-end node) point))))) + +(defun origami-fold-preorder-reduce (tree f initial-state) + "Reduce the tree by doing a preorder traversal. F is applied +with the current state and the current node at each iteration." + (-reduce-from (lambda (state node) (origami-fold-preorder-reduce node f state)) + (funcall f initial-state tree) + (origami-fold-children tree))) + +(defun origami-fold-postorder-reduce (tree f initial-state) + "Reduce the tree by doing a postorder traversal. F is applied +with the current state and the current node at each iteration." + (funcall f (-reduce-from (lambda (state node) (origami-fold-postorder-reduce node f state)) + initial-state + (origami-fold-children tree)) + tree)) + +(defun origami-fold-node-recursively-closed? (node) + (origami-fold-postorder-reduce node (lambda (acc node) + (and acc (not (origami-fold-open? node)))) t)) + +(defun origami-fold-node-recursively-open? (node) + (origami-fold-postorder-reduce node (lambda (acc node) + (and acc (origami-fold-open? node))) t)) + +(defun origami-fold-shallow-merge (tree1 tree2) + "Shallow merge the children of TREE2 in to TREE1." + (-reduce-from (lambda (tree node) + (origami-fold-assoc (origami-fold-find-path-containing-range tree + (origami-fold-beg node) + (origami-fold-end node)) + (lambda (leaf) + (origami-fold-add-child leaf node)))) + tree1 (origami-fold-children tree2))) + +(defun origami-fold-parent (path) + (-last-item (-butlast path))) + +(defun origami-fold-prev-sibling (siblings node) + (->> siblings + (-partition-in-steps 2 1) + (-drop-while (lambda (pair) (not (equal (cadr pair) node)))) + caar)) + +(defun origami-fold-next-sibling (siblings node) + (->> siblings + (-drop-while (lambda (n) (not (equal n node)))) + cadr)) + +;;; linear history structure + +(defun origami-h-new (present) + "Create a new history structure." + (vector nil present nil)) + +(defun origami-h-push (h new) + "Create a new history structure with new as the present value." + (when new + (let ((past (aref h 0)) + (present (aref h 1))) + (vector (cons present (-take 19 past)) new nil)))) + +(defun origami-h-undo (h) + (let ((past (aref h 0)) + (present (aref h 1)) + (future (aref h 2))) + (if (null past) h + (vector (cdr past) (car past) (cons present future))))) + +(defun origami-h-redo (h) + (let ((past (aref h 0)) + (present (aref h 1)) + (future (aref h 2))) + (if (null future) h + (vector (cons present past) (car future) (cdr future))))) + +(defun origami-h-present (h) + (when h (aref h 1))) + +;;; interactive utils + +(defun origami-setup-local-vars (buffer) + (with-current-buffer buffer + (set (make-local-variable 'origami-history) + (origami-h-new (origami-fold-root-node))) + (set (make-local-variable 'origami-tree-tick) 0))) + +(defun origami-get-cached-tree (buffer) + (or (local-variable-p 'origami-history buffer) + (error "Necessary local variables were not available")) + (origami-h-present (buffer-local-value 'origami-history buffer))) + +(defun origami-store-cached-tree (buffer tree) + (or (and (local-variable-p 'origami-history buffer) + (local-variable-p 'origami-tree-tick buffer)) + (error "Necessary local variables were not available")) + (with-current-buffer buffer + (setq origami-tree-tick (buffer-modified-tick)) + (setq origami-history (origami-h-push origami-history tree))) + tree) + +(defun origami-update-history (buffer f) + (or (local-variable-p 'origami-history buffer) + (error "Necessary local variables were not available")) + (with-current-buffer buffer + (setq origami-history (funcall f origami-history)))) + +(defun origami-rebuild-tree? (buffer) + "Determines if the tree needs to be rebuilt for BUFFER since it +was last built." + (not (= (buffer-local-value 'origami-tree-tick buffer) + (buffer-modified-tick buffer)))) + +(defun origami-build-tree (buffer parser) + (when parser + (with-current-buffer buffer + (let ((contents (buffer-string))) + (-> parser + (funcall contents) + origami-fold-root-node))))) + +(defun origami-get-parser (buffer) + (let* ((cached-tree (origami-get-cached-tree buffer)) + (create (lambda (beg end offset children) + (let ((previous-fold (-last-item (origami-fold-find-path-with-range cached-tree beg end)))) + (origami-fold-node beg end offset + (if previous-fold (origami-fold-open? previous-fold) t) + children + (or (-> (origami-fold-find-path-with-range + (origami-get-cached-tree buffer) beg end) + -last-item + origami-fold-data) + (origami-create-overlay beg end offset buffer))))))) + (-when-let (parser-gen (or (cdr (assoc (if (local-variable-p 'origami-fold-style) + (buffer-local-value 'origami-fold-style buffer) + (buffer-local-value 'major-mode buffer)) + origami-parser-alist)) + 'origami-indent-parser)) + (funcall parser-gen create)))) + +(defun origami-get-fold-tree (buffer) + "Facade. Build the tree if it hasn't already been built +otherwise fetch cached tree." + (when origami-mode + (if (origami-rebuild-tree? buffer) + (origami-build-tree buffer (origami-get-parser buffer)) + (origami-get-cached-tree buffer)))) + +(defun origami-apply-new-tree (buffer old-tree new-tree) + (when new-tree + (origami-fold-diff old-tree new-tree + 'origami-hide-overlay-from-fold-tree-fn + 'origami-show-overlay-from-fold-tree-fn + 'origami-change-overlay-from-fold-node-fn))) + +(defun origami-search-forward-for-path (buffer point) + (let (end) + (with-current-buffer buffer + (save-excursion + (goto-char point) + (setq end (line-end-position)))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (let ((forward-node (-first (lambda (node) + (and (>= (origami-fold-beg node) point) + (<= (origami-fold-beg node) end))) + (origami-fold-children (-last-item path))))) + (if forward-node (append path (list forward-node)) path)))))) + +;;; commands + +(defun origami-open-node (buffer point) + "Open the fold node at POINT in BUFFER. The fold node opened +will be the deepest nested at POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc path (lambda (node) + (origami-fold-open-set node t)))))))) + +(defun origami-open-node-recursively (buffer point) + "Open the fold node and all of its children at POINT in BUFFER. +The fold node opened will be the deepest nested at POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree + buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc path + (lambda (node) + (origami-fold-map (lambda (node) + (origami-fold-open-set node t)) + node)))))))) + +(defun origami-show-node (buffer point) + "Like `origami-open-node' but also opens parent fold nodes +recursively so as to ensure the position where POINT is is +visible." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-path-map + (lambda (node) + (origami-fold-open-set node t)) + path)))))) + +(defun origami-close-node (buffer point) + "Close the fold node at POINT in BUFFER. The fold node closed +will be the deepest nested at POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc + path (lambda (node) + (origami-fold-open-set node nil)))))))) + +(defun origami-close-node-recursively (buffer point) + "Close the fold node and all of its children at POINT in BUFFER. +The fold node closed will be the deepest nested at POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree + buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc path + (lambda (node) + (origami-fold-map (lambda (node) + (origami-fold-open-set node nil)) + node)))))))) + +(defun origami-toggle-node (buffer point) + "Toggle the fold node at POINT in BUFFER open or closed. The +fold node opened or closed will be the deepest nested at POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc + path (lambda (node) + (origami-fold-open-set + node (not (origami-fold-open? + (-last-item path))))))))))) + +(defun origami-forward-toggle-node (buffer point) + "Like `origami-toggle-node' but search forward in BUFFER for a +fold node. If a fold node is found after POINT and before the +next line break, this will be toggled. Otherwise, behave exactly +as `origami-toggle-node'." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-search-forward-for-path buffer point)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc + path (lambda (node) + (origami-fold-open-set + node (not (origami-fold-open? + (-last-item path))))))))))) + +(defun origami-recursively-toggle-node (buffer point) + "Cycle a fold node between recursively closed, open and +recursively open depending on its current state. The fold node +acted upon is searched for forward in BUFFER from POINT. If a +fold node is found after POINT and before the next line break, +this will be toggled otherwise the fold node nested deepest at +POINT will be acted upon. + +This command will only work if bound to a key. For those familiar +with org-mode heading opening and collapsing, this will feel +familiar. It's easiest to grasp this just by giving it a go." + (interactive (list (current-buffer) (point))) + (-when-let (path (origami-search-forward-for-path buffer point)) + (let ((node (-last-item path))) + (if (eq last-command 'origami-recursively-toggle-node) + (cond ((origami-fold-node-recursively-open? node) + (origami-close-node-recursively buffer (origami-fold-beg node))) + ((origami-fold-node-recursively-closed? node) + (origami-toggle-node buffer (origami-fold-beg node))) + (t (origami-open-node-recursively buffer (origami-fold-beg node)))) + (origami-forward-toggle-node buffer point))))) + +(defun origami-open-all-nodes (buffer) + "Recursively open every fold node in BUFFER." + (interactive (list (current-buffer))) + (-when-let (tree (origami-get-fold-tree buffer)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-map + (lambda (node) + (origami-fold-open-set node t)) + tree))))) + +(defun origami-close-all-nodes (buffer) + "Recursively close every fold node in BUFFER." + (interactive (list (current-buffer))) + (-when-let (tree (origami-get-fold-tree buffer)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-map + (lambda (node) + (origami-fold-open-set node nil)) + tree))))) + +(defun origami-toggle-all-nodes (buffer) + "Toggle all fold nodes in the buffer recursively open or +recursively closed." + (interactive (list (current-buffer))) + (-when-let (tree (origami-get-fold-tree buffer)) + ;; use the first child as root is always open + (if (-> tree origami-fold-children car origami-fold-open?) + (origami-close-all-nodes buffer) + (origami-open-all-nodes buffer)))) + +(defun origami-show-only-node (buffer point) + "Close all fold nodes in BUFFER except for those necessary to +make POINT visible. Very useful for quickly collapsing everything +in the buffer other than what you are looking at." + (interactive (list (current-buffer) (point))) + (origami-close-all-nodes buffer) + (origami-show-node buffer point)) + +(defun origami-previous-fold (buffer point) + "Move point to the beginning of the fold before POINT. If POINT +is in a fold, move to the beginning of the fold that POINT is +in." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (push-mark) + (-> tree + (origami-fold-preorder-reduce (lambda (state n) + (cons (origami-fold-beg n) state)) nil) + (->> (-reduce (lambda (state pos) + (if (< state point) state pos)))) + goto-char))) + +(defun origami-next-fold (buffer point) + "Move point to the end of the fold after POINT. If POINT is in +a fold, move to the end of the fold that POINT is in." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (push-mark) + (-> tree + (origami-fold-postorder-reduce (lambda (state n) + (cons (origami-fold-end n) state)) nil) + (->> (-last (lambda (pos) (> pos point)))) + goto-char))) + +(defun origami-forward-fold (buffer point) + "Move point to the beginning of the first fold in the BUFFER +after POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (push-mark) + (-> tree + (origami-fold-preorder-reduce (lambda (state n) + (cons (origami-fold-beg n) state)) nil) + (->> (-last (lambda (pos) (> pos point)))) + goto-char))) + +(defun origami-forward-fold-same-level (buffer point) + "Move point to the beginning of the next fold in the buffer +that is a sibling of the fold the point is currently in." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (push-mark) + (-when-let (c (-> (origami-fold-next-sibling (origami-fold-children + (origami-fold-parent path)) + (-last-item path)) + origami-fold-beg)) + (goto-char c))))) + +(defun origami-backward-fold-same-level (buffer point) + "Move point to the beginning of the previous fold in the buffer +that is a sibling of the fold the point is currently in." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (push-mark) + (-when-let (c (-> (origami-fold-prev-sibling (origami-fold-children + (origami-fold-parent path)) + (-last-item path)) + origami-fold-beg)) + (goto-char c))))) + +(defun origami-undo (buffer) + "Undo the last folding operation applied to BUFFER. Undo +history is linear. If you undo some fold operations and then +perform a new fold operation you will lose the history of +operations undone." + (interactive (list (current-buffer))) + (let ((current-tree (origami-get-cached-tree buffer))) + (origami-update-history buffer (lambda (h) (origami-h-undo h))) + (let ((old-tree (origami-get-cached-tree buffer))) + (origami-apply-new-tree buffer current-tree old-tree)))) + +(defun origami-redo (buffer) + "Redo the last folding operation applied to BUFFER. You can +only redo undone operations while a new folding operation hasn't +been performed to BUFFER." + (interactive (list (current-buffer))) + (let ((current-tree (origami-get-cached-tree buffer))) + (origami-update-history buffer (lambda (h) (origami-h-redo h))) + (let ((new-tree (origami-get-cached-tree buffer))) + (origami-apply-new-tree buffer current-tree new-tree)))) + +(defun origami-reset (buffer) + "Remove all folds from BUFFER and reset all origami state +associated with this buffer. Useful during development or if you +uncover any bugs." + (interactive (list (current-buffer))) + (origami-setup-local-vars buffer) + (origami-remove-all-overlays buffer)) + +;;; minor mode + +(defvar origami-mode-map + (let ((map (make-sparse-keymap))) + map) + "Keymap for `origami-mode'.") + +(defcustom origami-mode-hook nil + "Hook called when origami minor mode is activated or deactivated." + :type 'hook + :group 'origami) + +(defun origami-find-occurrence-show-node () + (call-interactively 'origami-show-node)) + +;;;###autoload +(define-minor-mode origami-mode + "Minor mode to selectively hide/show text in the current buffer. +With a prefix argument ARG, enable the mode if ARG is positive, +and disable it otherwise. If called from Lisp, enable the mode +if ARG is omitted or nil. + +Lastly, the normal hook `origami-mode-hook' is run using +`run-hooks'. + +Key bindings: +\\{origami-mode-map}" + :group 'origami + :lighter nil + :keymap origami-mode-map + :init-value nil + (if origami-mode + (progn + (add-hook 'occur-mode-find-occurrence-hook + 'origami-find-occurrence-show-node nil t) + (setq next-error-move-function (lambda (ignored pos) + (goto-char pos) + (call-interactively 'origami-show-node))) + (add-hook 'clone-indirect-buffer-hook + (lambda () (origami-reset (current-buffer))))) + (remove-hook 'occur-mode-find-occurrence-hook + 'origami-find-occurrence-show-node t) + (setq next-error-move-function nil)) + (origami-reset (current-buffer))) + +;;;###autoload +(define-global-minor-mode global-origami-mode origami-mode + (lambda () (origami-mode 1))) + +(provide 'origami) + +;;; origami.el ends here