elpa changes
This commit is contained in:
parent
31d060de46
commit
b99c6c0f53
|
@ -1606,7 +1606,7 @@
|
||||||
("Stefan Monnier" . "monnier@iro.umontreal.ca"))
|
("Stefan Monnier" . "monnier@iro.umontreal.ca"))
|
||||||
(:url . "http://elpa.gnu.org/packages/lex.html"))])
|
(:url . "http://elpa.gnu.org/packages/lex.html"))])
|
||||||
(lin .
|
(lin .
|
||||||
[(0 3 0)
|
[(0 3 1)
|
||||||
((emacs
|
((emacs
|
||||||
(27 1)))
|
(27 1)))
|
||||||
"Make `hl-line-mode' more suitable for selection UIs" tar
|
"Make `hl-line-mode' more suitable for selection UIs" tar
|
||||||
|
@ -1615,7 +1615,7 @@
|
||||||
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
|
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
|
||||||
(:authors
|
(:authors
|
||||||
("Protesilaos Stavrou" . "info@protesilaos.com"))
|
("Protesilaos Stavrou" . "info@protesilaos.com"))
|
||||||
(:commit . "edc29c2afe98ecd120108b7d3561aff938cc22c3"))])
|
(:commit . "520621e51a6f6882beda4420fa5ccee6682748dd"))])
|
||||||
(lmc .
|
(lmc .
|
||||||
[(1 4)
|
[(1 4)
|
||||||
((emacs
|
((emacs
|
||||||
|
@ -1661,7 +1661,7 @@
|
||||||
(:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com")
|
(:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com")
|
||||||
(:url . "https://github.com/fourier/loccur"))])
|
(:url . "https://github.com/fourier/loccur"))])
|
||||||
(logos .
|
(logos .
|
||||||
[(0 3 1)
|
[(0 3 2)
|
||||||
((emacs
|
((emacs
|
||||||
(27 1)))
|
(27 1)))
|
||||||
"Simple focus mode and extras" tar
|
"Simple focus mode and extras" tar
|
||||||
|
@ -1670,7 +1670,7 @@
|
||||||
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
|
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
|
||||||
(:authors
|
(:authors
|
||||||
("Protesilaos Stavrou" . "info@protesilaos.com"))
|
("Protesilaos Stavrou" . "info@protesilaos.com"))
|
||||||
(:commit . "9e6824b8fa67c6c96e46eeb410cbca2f88193a2d"))])
|
(:commit . "dd25e36b64320f2ba9400a3929443aa81085e697"))])
|
||||||
(map .
|
(map .
|
||||||
[(3 2 1)
|
[(3 2 1)
|
||||||
((emacs
|
((emacs
|
||||||
|
@ -2269,7 +2269,7 @@
|
||||||
("Scott Andrew Borton" . "scott@pp.htv.fi"))
|
("Scott Andrew Borton" . "scott@pp.htv.fi"))
|
||||||
(:maintainer "John Darrington" . "john@darrington.wattle.id.au"))])
|
(:maintainer "John Darrington" . "john@darrington.wattle.id.au"))])
|
||||||
(pulsar .
|
(pulsar .
|
||||||
[(0 3 0)
|
[(0 3 1)
|
||||||
((emacs
|
((emacs
|
||||||
(27 1)))
|
(27 1)))
|
||||||
"Pulse highlight on demand or after select functions" tar
|
"Pulse highlight on demand or after select functions" tar
|
||||||
|
@ -2278,7 +2278,7 @@
|
||||||
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
|
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
|
||||||
(:authors
|
(:authors
|
||||||
("Protesilaos Stavrou" . "info@protesilaos.com"))
|
("Protesilaos Stavrou" . "info@protesilaos.com"))
|
||||||
(:commit . "cdb7892a2b7e8e7cc644b8e24e5ab6bf0c51584d"))])
|
(:commit . "86a7c429c6878287c068106b318889824cad3210"))])
|
||||||
(pyim .
|
(pyim .
|
||||||
[(4 1 1)
|
[(4 1 1)
|
||||||
((emacs
|
((emacs
|
||||||
|
@ -2949,15 +2949,16 @@
|
||||||
("Oleh Krehel" . "ohwoeowho@gmail.com"))
|
("Oleh Krehel" . "ohwoeowho@gmail.com"))
|
||||||
(:keywords "convenience"))])
|
(:keywords "convenience"))])
|
||||||
(tmr .
|
(tmr .
|
||||||
[(0 2 1)
|
[(0 2 2)
|
||||||
((emacs
|
((emacs
|
||||||
(27 1)))
|
(27 1)))
|
||||||
"TMR Must Recur" tar
|
"Set timers using a convenient notation" tar
|
||||||
((:url . "https://git.sr.ht/~protesilaos/tmr")
|
((:url . "https://git.sr.ht/~protesilaos/tmr")
|
||||||
|
(:keywords "convenience" "timer")
|
||||||
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
|
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
|
||||||
(:authors
|
(:authors
|
||||||
("Protesilaos Stavrou" . "info@protesilaos.com"))
|
("Protesilaos Stavrou" . "info@protesilaos.com"))
|
||||||
(:commit . "30784cbe2eb036e58e99cd9b9e44909e7db93cdc"))])
|
(:commit . "bf13ea973126ea5a1a8f6d4216959d9da4ade979"))])
|
||||||
(tramp .
|
(tramp .
|
||||||
[(2 5 2 3)
|
[(2 5 2 3)
|
||||||
((emacs
|
((emacs
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) <elpasign@elpa.gnu.org> (trust undefined) created at 2022-04-21T17:15:02-0400 using RSA
|
Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) <elpasign@elpa.gnu.org> (trust undefined) created at 2022-04-22T05:05:03-0400 using RSA
|
|
@ -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 <https://github.com/iyefrat>")) (:maintainer "Itai Y. Efrat" . "itai3397@gmail.com") (:keywords "convenient" "lisp") (:url . "https://github.com/iyefrat/all-the-icons-completion"))])
|
(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 <https://github.com/iyefrat>")) (: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-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-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 . [(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"))])
|
(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"))])
|
(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"))])
|
(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-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-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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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-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-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"))])
|
(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 <lee _AT_ writequit.org>")) (:maintainer "Lee Hinman <lee _AT_ writequit.org>") (:keywords "color" "themes") (:url . "https://github.com/dakrone/dakrone-theme"))])
|
(dakrone-theme . [(20170801 1933) nil "dakrone's custom dark theme" single ((:commit . "232ad1be5f3572dcbdf528f1655109aa355a6937") (:authors ("Lee Hinman <lee _AT_ writequit.org>")) (:maintainer "Lee Hinman <lee _AT_ writequit.org>") (: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/"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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-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"))])
|
(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"))])
|
(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"))])
|
(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 . [(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"))])
|
(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 <https://github.com/alexluigit>")) (:maintainer "Alex Lu <https://github.com/alexluigit>") (: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 <https://github.com/alexluigit>")) (:maintainer "Alex Lu <https://github.com/alexluigit>") (: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"))])
|
(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"))])
|
(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"))])
|
(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-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"))])
|
(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 <sergei.nosov [at] gmail.com>")) (:maintainer "Sergei Nosov <sergei.nosov [at] gmail.com>") (:keywords "dummyparens" "auto-pair" "wrapping") (:url . "https://github.com/snosov1/dummyparens"))])
|
(dummyparens . [(20141009 1024) nil "parenthesis auto-pairing and wrapping" single ((:commit . "9798ef1d0eaa24e4fe66f8aa6022a8c62714cc89") (:authors ("Sergei Nosov <sergei.nosov [at] gmail.com>")) (:maintainer "Sergei Nosov <sergei.nosov [at] gmail.com>") (: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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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-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-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"))])
|
(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-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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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 <timcharper at gmail dot com>") ("Vegard Øye <vegard_oye at hotmail dot com>")) (:maintainer "Tim Harper <timcharper at gmail dot com>") (:keywords "emulation" "vi" "evil"))])
|
(evil-surround . [(20220412 1724) ((evil (1 2 12))) "emulate surround.vim from Vim" single ((:commit . "2bc8aa6425f1311e985cf51ea6b5233c1ee6ce1c") (:authors ("Tim Harper <timcharper at gmail dot com>") ("Vegard Øye <vegard_oye at hotmail dot com>")) (:maintainer "Tim Harper <timcharper at gmail dot com>") (: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-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-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 <vegard_oye at hotmail.com>")) (:maintainer "Vegard Øye <vegard_oye at hotmail.com>"))])
|
(evil-test-helpers . [(20201008 1515) ((evil (1 14 0))) "unit test helpers for Evil" single ((:commit . "6fa371222f5d56cf96103aa301da8bcbf6c15cc2") (:authors ("Vegard Øye <vegard_oye at hotmail.com>")) (:maintainer "Vegard Øye <vegard_oye at hotmail.com>"))])
|
||||||
(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-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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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 <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/helm-R.el"))])
|
(helm-R . [(20120820 14) ((helm (20120517)) (ess (20120509))) "helm-sources and some utilities for GNU R." single ((:commit . "b0eb9d5f6a483a9dbe6eb6cf1f2024d4f5938bc2") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (: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-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"))])
|
(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-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-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-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-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-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"))])
|
(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-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-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 <github.com/ikirill>")) (:maintainer "Kirill Ignatiev <github.com/ikirill>") (:keywords "convenience" "faces") (:url . "https://github.com/ikirill/hl-indent"))])
|
(hl-indent . [(20170429 2104) ((emacs (24)) (cl-lib (0 5))) "Highlight irregular indentation." single ((:commit . "bdb2e0177a7c8b29af26998e688b856adc6ded93") (:authors ("Kirill Ignatiev <github.com/ikirill>")) (:maintainer "Kirill Ignatiev <github.com/ikirill>") (: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-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"))])
|
(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"))])
|
(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"))])
|
(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 "))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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-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-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-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-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-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"))])
|
(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"))])
|
(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-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/"))])
|
(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 . [(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-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-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-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-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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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 <drymer [ AT ] autistici.org>")) (:maintainer ": drymer <drymer [ AT ] autistici.org>") (:keywords ":" "languages" "terminals") (:url . "https://git.daemons.it/drymer/molecule.el"))])
|
(molecule . [(20180527 743) ((emacs (25 1))) "Simple wrapper for molecule" single ((:commit . "2ef72b81d9aa24ea782b71a061a3abdad6cae162") (:authors (": drymer <drymer [ AT ] autistici.org>")) (:maintainer ": drymer <drymer [ AT ] autistici.org>") (: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-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-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-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-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-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"))])
|
(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-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-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-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-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-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"))])
|
(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-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-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-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-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 <dfeich.gmail.com>")) (:maintainer "Derek Feichtinger <dfeich.gmail.com>") (:keywords "org") (:url . "https://github.com/dfeich/org-clock-convenience"))])
|
(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 <dfeich.gmail.com>")) (:maintainer "Derek Feichtinger <dfeich.gmail.com>") (: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"))])
|
(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-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-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-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-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-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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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 . [(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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 <github.com/ikirill>")) (:maintainer "Kirill Ignatiev <github.com/ikirill>") (:keywords "faces") (:url . "https://github.com/ikirill/propfont-mixed"))])
|
(propfont-mixed . [(20150113 2211) ((emacs (24)) (cl-lib (0 5))) "Use proportional fonts with space-based indentation." single ((:commit . "0b461ef4754a469610dba71874a34b6da42176bf") (:authors ("Kirill Ignatiev <github.com/ikirill>")) (:maintainer "Kirill Ignatiev <github.com/ikirill>") (: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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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 <http://www.github.com/jackcrawley>")) (:maintainer "Jack Crawley <http://www.github.com/jackcrawley>") (:keywords "python" "code generation") (:url . "https://github.com/JackCrawley/pygen/"))])
|
(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 <http://www.github.com/jackcrawley>")) (:maintainer "Jack Crawley <http://www.github.com/jackcrawley>") (: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"))])
|
(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-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-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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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-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"))])
|
(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 <https://www.fosskers.ca>")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca") (:keywords "calendar") (:url . "https://github.com/fosskers/streak"))])
|
(streak . [(20220311 1929) ((emacs (27 1))) "Track a daily streak in your Mode Line" single ((:commit . "b2206de2fe43f97e754bbcb0abe9b078a419e787") (:authors ("Colin Woodbury <https://www.fosskers.ca>")) (: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"))])
|
(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"))])
|
(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"))])
|
(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 . [(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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/"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(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"))])
|
(wallpreview . [(20220220 427) ((emacs (24 4))) "Set wallpapers with image-dired" single ((:commit . "b1b8f19ae82b344a9577cea7b883ad513ec52222") (:url . "https://github.com/nryotaro/wallpreview"))])
|
||||||
|
|
8
code/elpa/dashboard-20220409.620/banners/1.txt
Normal file
8
code/elpa/dashboard-20220409.620/banners/1.txt
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
######## ## ## ### ###### ######
|
||||||
|
## ### ### ## ## ## ## ## ##
|
||||||
|
## #### #### ## ## ## ##
|
||||||
|
###### ## ### ## ## ## ## ######
|
||||||
|
## ## ## ######### ## ##
|
||||||
|
## ## ## ## ## ## ## ## ##
|
||||||
|
######## ## ## ## ## ###### ######
|
6
code/elpa/dashboard-20220409.620/banners/2.txt
Normal file
6
code/elpa/dashboard-20220409.620/banners/2.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
_______ .___ ___. ___ ______ _______.
|
||||||
|
| ____|| \/ | / \ / | / |
|
||||||
|
| |__ | \ / | / ^ \ | ,----' | (----`
|
||||||
|
| __| | |\/| | / /_\ \ | | \ \
|
||||||
|
| |____ | | | | / _____ \ | `----.----) |
|
||||||
|
|_______||__| |__| /__/ \__\ \______|_______/
|
8
code/elpa/dashboard-20220409.620/banners/3.txt
Normal file
8
code/elpa/dashboard-20220409.620/banners/3.txt
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
_______ _____ ______ ________ ________ ________
|
||||||
|
|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\
|
||||||
|
\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_
|
||||||
|
\ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \
|
||||||
|
\ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \
|
||||||
|
\ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \
|
||||||
|
\|_______|\|__| \|__|\|__|\|__|\|_______|\_________\
|
||||||
|
\|_________|
|
17
code/elpa/dashboard-20220409.620/banners/4.txt
Normal file
17
code/elpa/dashboard-20220409.620/banners/4.txt
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
_ ___ _ _
|
||||||
|
_ ___ __ ___ __ _ ___
|
||||||
|
__ _ ___ __ ___
|
||||||
|
_ ___ _
|
||||||
|
_ _ __ _
|
||||||
|
___ __ _
|
||||||
|
__ _
|
||||||
|
_ _ _
|
||||||
|
_ _ _
|
||||||
|
_ _ _
|
||||||
|
__ ___
|
||||||
|
_ _ _ _
|
||||||
|
_ _
|
||||||
|
_ _
|
||||||
|
_ _
|
||||||
|
_
|
||||||
|
__
|
BIN
code/elpa/dashboard-20220409.620/banners/emacs.png
Normal file
BIN
code/elpa/dashboard-20220409.620/banners/emacs.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
BIN
code/elpa/dashboard-20220409.620/banners/logo.png
Normal file
BIN
code/elpa/dashboard-20220409.620/banners/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
39
code/elpa/dashboard-20220409.620/dashboard-autoloads.el
Normal file
39
code/elpa/dashboard-20220409.620/dashboard-autoloads.el
Normal file
|
@ -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
|
12
code/elpa/dashboard-20220409.620/dashboard-pkg.el
Normal file
12
code/elpa/dashboard-20220409.620/dashboard-pkg.el
Normal file
|
@ -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:
|
1267
code/elpa/dashboard-20220409.620/dashboard-widgets.el
Normal file
1267
code/elpa/dashboard-20220409.620/dashboard-widgets.el
Normal file
File diff suppressed because it is too large
Load diff
472
code/elpa/dashboard-20220409.620/dashboard.el
Normal file
472
code/elpa/dashboard-20220409.620/dashboard.el
Normal file
|
@ -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 <rakan.alhneiti@gmail.com>
|
||||||
|
;; Maintainer : Jesús Martínez <jesusmartinez93@gmail.com>
|
||||||
|
;; Shen, Jen-Chieh <jcs090218@gmail.com>
|
||||||
|
;; 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 "<up>") 'dashboard-previous-line)
|
||||||
|
(define-key map (kbd "<down>") '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 "<backspace>") #'dashboard-remove-item-under)
|
||||||
|
(define-key map (kbd "<delete>") #'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
|
|
@ -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
|
|
@ -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")
|
|
@ -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 <jasond496@msn.com>
|
||||||
|
;; 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 <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;;; 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
|
|
@ -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
|
|
|
@ -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"))
|
|
|
@ -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 <matus.goljer@gmail.com>
|
|
||||||
;; Maintainer: Matúš Goljer <matus.goljer@gmail.com>
|
|
||||||
;; 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; 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
|
|
|
@ -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
|
|
|
@ -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"))
|
|
|
@ -1,299 +0,0 @@
|
||||||
;;; dired-ranger.el --- Implementation of useful ranger features for dired
|
|
||||||
|
|
||||||
;; Copyright (C) 2014-2015 Matúš Goljer
|
|
||||||
|
|
||||||
;; Author: Matúš Goljer <matus.goljer@gmail.com>
|
|
||||||
;; Maintainer: Matúš Goljer <matus.goljer@gmail.com>
|
|
||||||
;; 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; 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
|
|
22
code/elpa/git-20140128.1041/git-autoloads.el
Normal file
22
code/elpa/git-20140128.1041/git-autoloads.el
Normal file
|
@ -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
|
2
code/elpa/git-20140128.1041/git-pkg.el
Normal file
2
code/elpa/git-20140128.1041/git-pkg.el
Normal file
|
@ -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")
|
280
code/elpa/git-20140128.1041/git.el
Normal file
280
code/elpa/git-20140128.1041/git.el
Normal file
|
@ -0,0 +1,280 @@
|
||||||
|
;;; git.el --- An Elisp API for programmatically using Git
|
||||||
|
|
||||||
|
;; Copyright (C) 2013 Johan Andersson
|
||||||
|
|
||||||
|
;; Author: Johan Andersson <johan.rejeep@gmail.com>
|
||||||
|
;; Maintainer: Johan Andersson <johan.rejeep@gmail.com>
|
||||||
|
;; 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
|
|
@ -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
|
|
|
@ -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")
|
|
|
@ -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 <wyuenho@gmail.com>
|
|
||||||
;; 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; 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
|
|
8
org/elpa/dashboard-20220409.620/banners/1.txt
Normal file
8
org/elpa/dashboard-20220409.620/banners/1.txt
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
######## ## ## ### ###### ######
|
||||||
|
## ### ### ## ## ## ## ## ##
|
||||||
|
## #### #### ## ## ## ##
|
||||||
|
###### ## ### ## ## ## ## ######
|
||||||
|
## ## ## ######### ## ##
|
||||||
|
## ## ## ## ## ## ## ## ##
|
||||||
|
######## ## ## ## ## ###### ######
|
6
org/elpa/dashboard-20220409.620/banners/2.txt
Normal file
6
org/elpa/dashboard-20220409.620/banners/2.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
_______ .___ ___. ___ ______ _______.
|
||||||
|
| ____|| \/ | / \ / | / |
|
||||||
|
| |__ | \ / | / ^ \ | ,----' | (----`
|
||||||
|
| __| | |\/| | / /_\ \ | | \ \
|
||||||
|
| |____ | | | | / _____ \ | `----.----) |
|
||||||
|
|_______||__| |__| /__/ \__\ \______|_______/
|
8
org/elpa/dashboard-20220409.620/banners/3.txt
Normal file
8
org/elpa/dashboard-20220409.620/banners/3.txt
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
_______ _____ ______ ________ ________ ________
|
||||||
|
|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\
|
||||||
|
\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_
|
||||||
|
\ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \
|
||||||
|
\ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \
|
||||||
|
\ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \
|
||||||
|
\|_______|\|__| \|__|\|__|\|__|\|_______|\_________\
|
||||||
|
\|_________|
|
17
org/elpa/dashboard-20220409.620/banners/4.txt
Normal file
17
org/elpa/dashboard-20220409.620/banners/4.txt
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
_ ___ _ _
|
||||||
|
_ ___ __ ___ __ _ ___
|
||||||
|
__ _ ___ __ ___
|
||||||
|
_ ___ _
|
||||||
|
_ _ __ _
|
||||||
|
___ __ _
|
||||||
|
__ _
|
||||||
|
_ _ _
|
||||||
|
_ _ _
|
||||||
|
_ _ _
|
||||||
|
__ ___
|
||||||
|
_ _ _ _
|
||||||
|
_ _
|
||||||
|
_ _
|
||||||
|
_ _
|
||||||
|
_
|
||||||
|
__
|
BIN
org/elpa/dashboard-20220409.620/banners/emacs.png
Normal file
BIN
org/elpa/dashboard-20220409.620/banners/emacs.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
BIN
org/elpa/dashboard-20220409.620/banners/logo.png
Normal file
BIN
org/elpa/dashboard-20220409.620/banners/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
39
org/elpa/dashboard-20220409.620/dashboard-autoloads.el
Normal file
39
org/elpa/dashboard-20220409.620/dashboard-autoloads.el
Normal file
|
@ -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
|
12
org/elpa/dashboard-20220409.620/dashboard-pkg.el
Normal file
12
org/elpa/dashboard-20220409.620/dashboard-pkg.el
Normal file
|
@ -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:
|
1267
org/elpa/dashboard-20220409.620/dashboard-widgets.el
Normal file
1267
org/elpa/dashboard-20220409.620/dashboard-widgets.el
Normal file
File diff suppressed because it is too large
Load diff
472
org/elpa/dashboard-20220409.620/dashboard.el
Normal file
472
org/elpa/dashboard-20220409.620/dashboard.el
Normal file
|
@ -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 <rakan.alhneiti@gmail.com>
|
||||||
|
;; Maintainer : Jesús Martínez <jesusmartinez93@gmail.com>
|
||||||
|
;; Shen, Jen-Chieh <jcs090218@gmail.com>
|
||||||
|
;; 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 "<up>") 'dashboard-previous-line)
|
||||||
|
(define-key map (kbd "<down>") '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 "<backspace>") #'dashboard-remove-item-under)
|
||||||
|
(define-key map (kbd "<delete>") #'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
|
|
@ -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
|
|
@ -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")
|
|
@ -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 <jasond496@msn.com>
|
||||||
|
;; 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 <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;;; 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
|
|
@ -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
|
|
|
@ -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"))
|
|
|
@ -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 <matus.goljer@gmail.com>
|
|
||||||
;; Maintainer: Matúš Goljer <matus.goljer@gmail.com>
|
|
||||||
;; 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; 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
|
|
|
@ -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
|
|
|
@ -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"))
|
|
|
@ -1,275 +0,0 @@
|
||||||
;;; dired-hacks-utils.el --- Utilities and helpers for dired-hacks collection
|
|
||||||
|
|
||||||
;; Copyright (C) 2014-2015 Matúš Goljer
|
|
||||||
|
|
||||||
;; Author: Matúš Goljer <matus.goljer@gmail.com>
|
|
||||||
;; Maintainer: Matúš Goljer <matus.goljer@gmail.com>
|
|
||||||
;; 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; 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
|
|
|
@ -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
|
|
|
@ -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"))
|
|
|
@ -1,181 +0,0 @@
|
||||||
;;; dired-rainbow.el --- Extended file highlighting according to its type
|
|
||||||
|
|
||||||
;; Copyright (C) 2014-2017 Matus Goljer
|
|
||||||
|
|
||||||
;; Author: Matus Goljer <matus.goljer@gmail.com>
|
|
||||||
;; Maintainer: Matus Goljer <matus.goljer@gmail.com>
|
|
||||||
;; 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; 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
|
|
|
@ -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
|
|
|
@ -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"))
|
|
|
@ -1,299 +0,0 @@
|
||||||
;;; dired-ranger.el --- Implementation of useful ranger features for dired
|
|
||||||
|
|
||||||
;; Copyright (C) 2014-2015 Matúš Goljer
|
|
||||||
|
|
||||||
;; Author: Matúš Goljer <matus.goljer@gmail.com>
|
|
||||||
;; Maintainer: Matúš Goljer <matus.goljer@gmail.com>
|
|
||||||
;; 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; 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
|
|
|
@ -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
|
|
|
@ -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")
|
|
|
@ -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
|
|
22
org/elpa/git-20140128.1041/git-autoloads.el
Normal file
22
org/elpa/git-20140128.1041/git-autoloads.el
Normal file
|
@ -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
|
2
org/elpa/git-20140128.1041/git-pkg.el
Normal file
2
org/elpa/git-20140128.1041/git-pkg.el
Normal file
|
@ -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")
|
280
org/elpa/git-20140128.1041/git.el
Normal file
280
org/elpa/git-20140128.1041/git.el
Normal file
|
@ -0,0 +1,280 @@
|
||||||
|
;;; git.el --- An Elisp API for programmatically using Git
|
||||||
|
|
||||||
|
;; Copyright (C) 2013 Johan Andersson
|
||||||
|
|
||||||
|
;; Author: Johan Andersson <johan.rejeep@gmail.com>
|
||||||
|
;; Maintainer: Johan Andersson <johan.rejeep@gmail.com>
|
||||||
|
;; 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
|
76
org/elpa/origami-20200331.1019/origami-autoloads.el
Normal file
76
org/elpa/origami-20200331.1019/origami-autoloads.el
Normal file
|
@ -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
|
266
org/elpa/origami-20200331.1019/origami-parsers.el
Normal file
266
org/elpa/origami-20200331.1019/origami-parsers.el
Normal file
|
@ -0,0 +1,266 @@
|
||||||
|
;;; origami-parsers.el --- Collection of parsers -*- lexical-binding: t -*-
|
||||||
|
|
||||||
|
;; Author: Greg Sexton <gregsexton@gmail.com>
|
||||||
|
;; 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
|
15
org/elpa/origami-20200331.1019/origami-pkg.el
Normal file
15
org/elpa/origami-20200331.1019/origami-pkg.el
Normal file
|
@ -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:
|
828
org/elpa/origami-20200331.1019/origami.el
Normal file
828
org/elpa/origami-20200331.1019/origami.el
Normal file
|
@ -0,0 +1,828 @@
|
||||||
|
;;; origami.el --- Flexible text folding -*- lexical-binding: t -*-
|
||||||
|
|
||||||
|
;; Author: Greg Sexton <gregsexton@gmail.com>
|
||||||
|
;; 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
|
Reference in a new issue