elpa changes

This commit is contained in:
KemoNine 2022-04-22 16:59:41 -04:00
parent 31d060de46
commit b99c6c0f53
67 changed files with 5748 additions and 2207 deletions

View File

@ -1,2 +1,2 @@
;;; Generated package description from all-the-icons-dired.el -*- no-byte-compile: t -*-
(define-package "all-the-icons-dired" "20220304.1638" "Shows icons for each file in dired mode" '((emacs "24.4") (all-the-icons "2.2.0")) :commit "147ed0dfd1034a686795a08dc63e2c293128597e" :authors '(("jtbm37")) :maintainer '("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") :keywords '("files" "icons" "dired") :url "https://github.com/wyuenho/all-the-icons-dired")
;;; Generated package description from all-the-icons-dired.el -*- no-byte-compile: t -*-
(define-package "all-the-icons-dired" "20220304.1638" "Shows icons for each file in dired mode" '((emacs "24.4") (all-the-icons "2.2.0")) :commit "147ed0dfd1034a686795a08dc63e2c293128597e" :authors '(("jtbm37")) :maintainer '("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") :keywords '("files" "icons" "dired") :url "https://github.com/wyuenho/all-the-icons-dired")

View File

@ -1606,7 +1606,7 @@
("Stefan Monnier" . "monnier@iro.umontreal.ca"))
(:url . "http://elpa.gnu.org/packages/lex.html"))])
(lin .
[(0 3 0)
[(0 3 1)
((emacs
(27 1)))
"Make `hl-line-mode' more suitable for selection UIs" tar
@ -1615,7 +1615,7 @@
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
(:authors
("Protesilaos Stavrou" . "info@protesilaos.com"))
(:commit . "edc29c2afe98ecd120108b7d3561aff938cc22c3"))])
(:commit . "520621e51a6f6882beda4420fa5ccee6682748dd"))])
(lmc .
[(1 4)
((emacs
@ -1661,7 +1661,7 @@
(:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com")
(:url . "https://github.com/fourier/loccur"))])
(logos .
[(0 3 1)
[(0 3 2)
((emacs
(27 1)))
"Simple focus mode and extras" tar
@ -1670,7 +1670,7 @@
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
(:authors
("Protesilaos Stavrou" . "info@protesilaos.com"))
(:commit . "9e6824b8fa67c6c96e46eeb410cbca2f88193a2d"))])
(:commit . "dd25e36b64320f2ba9400a3929443aa81085e697"))])
(map .
[(3 2 1)
((emacs
@ -2269,7 +2269,7 @@
("Scott Andrew Borton" . "scott@pp.htv.fi"))
(:maintainer "John Darrington" . "john@darrington.wattle.id.au"))])
(pulsar .
[(0 3 0)
[(0 3 1)
((emacs
(27 1)))
"Pulse highlight on demand or after select functions" tar
@ -2278,7 +2278,7 @@
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
(:authors
("Protesilaos Stavrou" . "info@protesilaos.com"))
(:commit . "cdb7892a2b7e8e7cc644b8e24e5ab6bf0c51584d"))])
(:commit . "86a7c429c6878287c068106b318889824cad3210"))])
(pyim .
[(4 1 1)
((emacs
@ -2949,15 +2949,16 @@
("Oleh Krehel" . "ohwoeowho@gmail.com"))
(:keywords "convenience"))])
(tmr .
[(0 2 1)
[(0 2 2)
((emacs
(27 1)))
"TMR Must Recur" tar
"Set timers using a convenient notation" tar
((:url . "https://git.sr.ht/~protesilaos/tmr")
(:keywords "convenience" "timer")
(:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
(:authors
("Protesilaos Stavrou" . "info@protesilaos.com"))
(:commit . "30784cbe2eb036e58e99cd9b9e44909e7db93cdc"))])
(:commit . "bf13ea973126ea5a1a8f6d4216959d9da4ade979"))])
(tramp .
[(2 5 2 3)
((emacs

View File

@ -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

View File

@ -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-dired . [(20220304 1638) ((emacs (24 4)) (all-the-icons (2 2 0))) "Shows icons for each file in dired mode" single ((:commit . "147ed0dfd1034a686795a08dc63e2c293128597e") (:authors ("jtbm37")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "files" "icons" "dired") (:url . "https://github.com/wyuenho/all-the-icons-dired"))])
(all-the-icons-gnus . [(20180511 654) ((emacs (24 4)) (dash (2 12 0)) (all-the-icons (3 1 0))) "Shows icons for in Gnus" single ((:commit . "27f78996da0725943bcfb2d18038e6f7bddfa9c7") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "mail" "tools"))])
(all-the-icons-ibuffer . [(20220228 1513) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" single ((:commit . "21d5859f1412413f165e0ca44f6002902409a9f9") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ibuffer") (:url . "https://github.com/seagle0128/all-the-icons-ibuffer"))])
(all-the-icons-ibuffer . [(20220422 1034) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" single ((:commit . "feebb1c2fe6564cc46489e37b7423afec670f3a6") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ibuffer") (:url . "https://github.com/seagle0128/all-the-icons-ibuffer"))])
(all-the-icons-ivy . [(20190508 1803) ((emacs (24 4)) (all-the-icons (2 4 0)) (ivy (0 8 0))) "Shows icons while using ivy and counsel" single ((:commit . "a70cbfa1effe36efc946a823a580cec686d5e88d") (:authors ("asok")) (:maintainer "asok") (:keywords "faces"))])
(all-the-icons-ivy-rich . [(20220411 222) ((emacs (25 1)) (ivy-rich (0 1 0)) (all-the-icons (2 2 0))) "Better experience with icons for ivy" single ((:commit . "b2fc7db5432431e56babb3440c7a4aab8ff0744d") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ivy") (:url . "https://github.com/seagle0128/all-the-icons-ivy-rich"))])
(almost-mono-themes . [(20210306 1040) ((emacs (24))) "Almost monochromatic color themes" tar ((:commit . "6503bf0e5429a51906fb1db94941a4fa678bf9b1") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:keywords "faces") (:url . "https://github.com/cryon/almost-mono-themes"))])
@ -556,7 +556,7 @@
(cm-mode . [(20170203 2107) ((cl-lib (0 5))) "Minor mode for CriticMarkup" single ((:commit . "276d49c859822265070ae5dfbb403fd7d8d06436") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "markdown"))])
(cmake-font-lock . [(20211224 2006) ((cmake-mode (0 0))) "Advanced, type aware, highlight support for CMake" single ((:commit . "0d6111b36a66013aa9b452e664c93308df3b07e1") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "languages") (:url . "https://github.com/Lindydancer/cmake-font-lock"))])
(cmake-ide . [(20210610 1525) ((emacs (24 4)) (cl-lib (0 5)) (seq (1 11)) (levenshtein (0)) (s (1 11 0))) "Calls CMake to find out include paths and other compiler flags" single ((:commit . "28dc4ab5bd01d99553901b4efeb7234280928b18") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com") (:keywords "languages") (:url . "http://github.com/atilaneves/cmake-ide"))])
(cmake-mode . [(20220322 1258) ((emacs (24 1))) "major-mode for editing CMake sources" single ((:commit . "7fc013a9229087cbafeb9ff4c96d1d1acb71c5d6"))])
(cmake-mode . [(20220322 1258) ((emacs (24 1))) "major-mode for editing CMake sources" single ((:commit . "bcd98b5f9846d7b9d2a6518501eb7ac56139665e"))])
(cmake-project . [(20171121 1115) nil "Integrates CMake build process with Emacs" single ((:commit . "a7cf9e4c01c4683e14b6942cc5cc5e8cddc98721") (:authors ("Alexander Lamaison" . "alexander.lamaison@gmail")) (:maintainer "Alexander Lamaison" . "alexander.lamaison@gmail") (:keywords "c" "cmake" "languages" "tools") (:url . "http://github.com/alamaison/emacs-cmake-project"))])
(cmd-to-echo . [(20161203 2133) ((emacs (24 4)) (s (1 11 0)) (shell-split-string (20151224 208))) "Show the output of long-running commands in the echo area" single ((:commit . "e0e874fc0e1ad6d291e39ed76023445297ad438a") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))])
(cmm-mode . [(20150225 746) nil "Major mode for C-- source code" single ((:commit . "c3ad514dff3eb30434f6b20d953276d4c00de1ee"))])
@ -687,7 +687,7 @@
(conllu-mode . [(20200501 2328) ((emacs (25)) (cl-lib (0 5)) (flycheck (30)) (hydra (0 13 0)) (s (1 0))) "editing mode for CoNLL-U files" tar ((:commit . "0db3063572b0de08874822e20570bb153747e6ed") (:authors ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com") (:keywords "extensions") (:url . "https://github.com/odanoburu/conllu-mode"))])
(connection . [(20191111 446) nil "TCP-based client connection" single ((:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "network"))])
(constant-theme . [(20180921 1012) ((emacs (24 1))) "A calm, dark, almost monochrome color theme." tar ((:commit . "23543a09729569b566175abe1efbe774048d3fa8") (:authors ("Jannis Pohlmann" . "contact@jannispohlmann.de")) (:maintainer "Jannis Pohlmann" . "contact@jannispohlmann.de") (:keywords "themes") (:url . "https://github.com/jannis/emacs-constant-theme"))])
(consult . [(20220421 1130) ((emacs (27 1))) "Consulting completing-read" tar ((:commit . "6df330a2856a5d4fc19c865d8839ce64f179bd89") (:authors ("Daniel Mendler and Consult contributors")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/consult"))])
(consult . [(20220422 1334) ((emacs (27 1))) "Consulting completing-read" tar ((:commit . "d705257e99622d738ec48295eb573f2c686d3757") (:authors ("Daniel Mendler and Consult contributors")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/consult"))])
(consult-company . [(20211021 1152) ((emacs (27 1)) (company (0 9)) (consult (0 9))) "Consult frontend for company" single ((:commit . "ef1c553b4a72b23297b55708bf6f6dd1b27cc68e") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:url . "https://github.com/mohkale/consult-company"))])
(consult-dir . [(20211007 2352) ((emacs (26 1)) (consult (0 9)) (project (0 6 0))) "Insert paths into the minibuffer prompt" single ((:commit . "08f543ae6acbfc1ffe579ba1d00a5414012d5c0b") (:authors ("Karthik Chikmagalur")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") (:keywords "convenience") (:url . "https://github.com/karthink/consult-dir"))])
(consult-eglot . [(20220409 1238) ((emacs (27 1)) (eglot (1 7)) (consult (0 16)) (project (0 3 0))) "A consulting-read interface for eglot" single ((:commit . "0da8801dd8435160ce1f62ad8066bd52e38f5cbd") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem") (:keywords "tools" "completion" "lsp") (:url . "https://github.com/mohkale/consult-eglot"))])
@ -814,7 +814,7 @@
(dakrone-theme . [(20170801 1933) nil "dakrone's custom dark theme" single ((:commit . "232ad1be5f3572dcbdf528f1655109aa355a6937") (:authors ("Lee Hinman <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/"))])
(dante . [(20210301 1738) ((dash (2 12 0)) (emacs (25 1)) (f (0 19 0)) (flycheck (0 30)) (company (0 9)) (haskell-mode (13 14)) (s (1 11 0)) (lcr (1 0))) "Development mode for Haskell" single ((:commit . "8741419333fb85ed2c1d71f5902688f5201b0a40") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:keywords "haskell" "tools") (:url . "https://github.com/jyp/dante"))])
(dap-mode . [(20220416 1252) ((emacs (26 1)) (dash (2 18 0)) (lsp-mode (6 0)) (bui (1 1 0)) (f (0 20 0)) (s (1 12 0)) (lsp-treemacs (0 1)) (posframe (0 7 0)) (ht (2 3))) "Debug Adapter Protocol mode" tar ((:commit . "e29d3e6c79356a4c149bb50059cffca7de0ce079") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/dap-mode"))])
(dap-mode . [(20220416 1252) ((emacs (26 1)) (dash (2 18 0)) (lsp-mode (6 0)) (bui (1 1 0)) (f (0 20 0)) (s (1 12 0)) (lsp-treemacs (0 1)) (posframe (0 7 0)) (ht (2 3))) "Debug Adapter Protocol mode" tar ((:commit . "adc947a1428fe6b4136fcee5e7c73a04b16fb9ed") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/dap-mode"))])
(darcsum . [(20190316 2215) nil "a pcl-cvs like interface for managing darcs patches" single ((:commit . "6a8b690539d133c5e3d17cb23fe4365fbb6fb493") (:authors ("John Wiegley" . "johnw@gnu.org")) (:maintainer "John Wiegley" . "johnw@gnu.org") (:keywords "completion" "convenience" "tools" "vc"))])
(darcula-theme . [(20171227 1845) nil "Inspired by IntelliJ's Darcula theme" single ((:commit . "d9b82b58ded9014985be6658f4ab17e26ed9e93e") (:authors ("Sam Halliday" . "Sam.Halliday@gmail.com")) (:maintainer "Sam Halliday" . "Sam.Halliday@gmail.com") (:keywords "faces") (:url . "https://gitlab.com/fommil/emacs-darcula-theme"))])
(dark-krystal-theme . [(20170808 1300) ((emacs (24 0))) "an Emacs 24 theme based on Dark Krystal (tmTheme)" single ((:commit . "79084b99665dc9ffb0ec62cc092349a5ecebebbc") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))])
@ -886,7 +886,7 @@
(dictcc . [(20220219 1302) ((emacs (24 4)) (cl-lib (0 5)) (ivy (0 10 0))) "Look up translations on dict.cc" single ((:commit . "8ecb954fcf193cba138191f8947c8b0b60a1c6c5") (:authors ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainer "Marten Lienen" . "marten.lienen@gmail.com") (:keywords "convenience"))])
(dictionary . [(20201001 1727) ((connection (1 11)) (link (1 11))) "Client for rfc2229 dictionary servers" single ((:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "interface" "dictionary"))])
(didyoumean . [(20200905 1843) ((emacs (24 4))) "Did you mean to open another file?" single ((:commit . "ce5edcce160b86e7f6480f0381be785d43f97e19") (:keywords "convenience") (:url . "https://gitlab.com/kisaragi-hiu/didyoumean.el"))])
(diff-ansi . [(20220323 106) ((emacs (27 1))) "Display diff's using alternative diffing tools" single ((:commit . "39b39a7265c59e413ff32f1fccebe4dc1a7a966e") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-ansi"))])
(diff-ansi . [(20220422 647) ((emacs (27 1))) "Display diff's using alternative diffing tools" single ((:commit . "f47e62503d77dbcadb36e9d3d0ede9242536fa89") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-ansi"))])
(diff-at-point . [(20220211 548) ((emacs (26 2))) "Diff navigation" single ((:commit . "819da8d75762e1fb1a975d78c2b4666506048485") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-at-point"))])
(diff-hl . [(20220405 2359) ((cl-lib (0 2)) (emacs (25 1))) "Highlight uncommitted changes using VC" tar ((:commit . "9d5dc2ffa1e4c7b43734b03dccb5ae6a80800569") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "vc" "diff") (:url . "https://github.com/dgutov/diff-hl"))])
(difflib . [(20210224 2242) ((emacs (24 4)) (cl-generic (0 3)) (ht (2 2)) (s (1 12 0))) "Helpers for computing deltas between sequences." single ((:commit . "646fc4388274fe765bbf4661e17a24e4d081250c") (:authors ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainer "Diego A. Mundo" . "dieggsy@pm.me") (:keywords "matching" "tools" "string") (:url . "http://github.com/dieggsy/difflib.el"))])
@ -949,7 +949,7 @@
(direx-grep . [(20140515 1506) ((direx (0 1 -3))) "Grep node of direx.el using incremental search like anything.el/helm.el" single ((:commit . "1109a512a80b2673a70b18b8568514049017faad") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/direx-grep"))])
(dirtree . [(20140129 832) ((tree-mode (1 1 1 1)) (windata (0))) "Directory tree views" single ((:commit . "ba55f1e716e386fdd37cb8e7f48616e405dc7251") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com"))])
(dirtree-prosjekt . [(20140129 904) ((prosjekt (0 3)) (dirtree (0 1))) "dirtree integration for prosjekt." single ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))])
(dirvish . [(20220420 1321) ((emacs (27 1))) "A modern file manager based on dired mode" tar ((:commit . "7a0e47365482700bce2884790c2970b493776838") (:authors ("Alex Lu <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"))])
(disaster . [(20171016 2152) nil "Disassemble C/C++ code under cursor in Emacs" single ((:commit . "10a785facc60d89d78e0d5177985ab1af1741bb4") (:authors ("Justine Tunney" . "jtunney@gmail.com")) (:maintainer "Justine Tunney" . "jtunney@gmail.com") (:keywords "tools") (:url . "https://github.com/jart/disaster"))])
(discourse . [(20160911 819) ((cl-lib (0 5)) (request (0 2)) (s (1 11 0))) "discourse api" single ((:commit . "a86c7e608851e186fe12e892a573994f08c8e65e") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "discourse") (:url . "https://github.com/lujun9972/discourse-api"))])
@ -1036,7 +1036,7 @@
(dumb-diff . [(20171211 2122) ((emacs (24 3))) "fast arbitrary diffs" single ((:commit . "1a2331d283049b71a07c1b06b1e0627a950d55f4") (:authors ("jack angers")) (:maintainer "jack angers") (:keywords "programming" "diff"))])
(dumb-jump . [(20211018 1545) ((emacs (24 3)) (s (1 11 0)) (dash (2 9 0)) (popup (0 5 3))) "Jump to definition for 50+ languages without configuration" single ((:commit . "dbb915441a2b66f2fbb954ff5de2723c5a4771d4") (:authors ("jack angers and contributors")) (:maintainer "jack angers and contributors") (:keywords "programming") (:url . "https://github.com/jacktasia/dumb-jump"))])
(dummyparens . [(20141009 1024) nil "parenthesis auto-pairing and wrapping" single ((:commit . "9798ef1d0eaa24e4fe66f8aa6022a8c62714cc89") (:authors ("Sergei Nosov <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"))])
(duplicate-thing . [(20181031 1500) nil "Duplicate current line & selection" single ((:commit . "9d8fd05e3e5caa35d3f2a0c0032c92f0c0908e21") (:authors ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "convenience" "command" "duplicate" "line" "selection") (:url . "https://github.com/ongaeshi/duplicate-thing"))])
(dut-mode . [(20170729 2111) ((emacs (24))) "Major mode for the Dut programming language" single ((:commit . "9235c7acaa6690942e9de8b7acd1e4be0c859dc1") (:authors ("The dut-mode Authors")) (:maintainer "The dut-mode Authors") (:keywords "languages" "gut") (:url . "https://github.com/dut-lang/dut-mode"))])
@ -1232,7 +1232,7 @@
(embrace . [(20171031 1833) ((cl-lib (0 5)) (expand-region (0 10 0))) "Add/Change/Delete pairs based on `expand-region'" single ((:commit . "dd5da196e5bcc5e6d87e1937eca0c21da4334ef2") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))])
(emidje . [(20190209 1726) ((emacs (25)) (cider (0 17 0)) (seq (2 16)) (magit-popup (2 4 0))) "Test runner and report viewer for Midje" single ((:commit . "7e92f053964d925c97dc8cca8d4d70a3030021db") (:authors ("Alan Ghelardi" . "alan.ghelardi@nubank.com.br")) (:maintainer "Alan Ghelardi" . "alan.ghelardi@nubank.com.br") (:keywords "tools") (:url . "https://github.com/nubank/emidje"))])
(emmet-mode . [(20210820 1124) nil "Unofficial Emmet's support for emacs" single ((:commit . "6b2e554f7fd27f732810f4b14ea01e3c54b7b3da") (:authors ("Shin Aoyama" . "smihica@gmail.com")) (:maintainer "Shin Aoyama" . "smihica@gmail.com") (:keywords "convenience") (:url . "https://github.com/smihica/emmet-mode"))])
(emms . [(20220315 1727) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) "The Emacs Multimedia System" tar ((:commit . "dd1ee74db3325d6a27e14df7ae882b5cbd84989a") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:url . "https://www.gnu.org/software/emms/"))])
(emms . [(20220422 1318) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) "The Emacs Multimedia System" tar ((:commit . "22f3d9e5359c565b33f55715f90fbde35e4f675e") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:url . "https://www.gnu.org/software/emms/"))])
(emms-bilibili . [(20180103 418) ((emacs (25)) (cl-lib (0 5))) "Play Bilibili in EMMS." single ((:commit . "294bca3dfc42fe3a55fb326ab39bc0fcfc8c5090") (:keywords "emms" "bilibili") (:url . "https://github.com/stardiviner/emms-bilibili"))])
(emms-info-mediainfo . [(20131223 1300) ((emms (0))) "Info-method for EMMS using medianfo" single ((:commit . "bce16eae9eacd38719fea62a9755225a888da59d") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org") (:keywords "multimedia" "processes"))])
(emms-mark-ext . [(20130529 327) ((emms (3 0))) "Extra functions for emms-mark-mode and emms-tag-edit-mode" single ((:commit . "ec68129e3e9e469e5bf160c6a1b7030e322f3541") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "convenience" "multimedia") (:url . "https://github.com/vapniks/emms-mark-ext"))])
@ -1294,7 +1294,7 @@
(ergoemacs-mode . [(20220411 338) ((emacs (24 1)) (cl-lib (0 5))) "Emacs mode based on common modern interface and ergonomics." tar ((:commit . "9cd89eef490f6c9f4af273bb3dd2c68d5ed2de61") (:authors ("Xah Lee" . "xah@xahlee.org") ("David Capello" . "davidcapello@gmail.com") ("Matthew L. Fidler" . "matthew.fidler@gmail.com") ("Kim F. Storm" . "storm@cua.dk")) (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com") (:keywords "convenience") (:url . "https://github.com/ergoemacs/ergoemacs-mode"))])
(ergoemacs-status . [(20160318 538) ((powerline (2 3)) (mode-icons (0 1 0))) "Adaptive Status Bar / Mode Line" single ((:commit . "d952cc2361adf6eb4d6af60950ad4ab699c81320") (:authors ("Matthew Fidler")) (:maintainer "Matthew Fidler"))])
(eri . [(20200914 644) nil "Enhanced relative indentation (eri)" single ((:commit . "505464961f07f0991263708fd8cbf5f7ad12f53f") (:url . "https://github.com/agda/agda"))])
(erlang . [(20220215 1844) ((emacs (24 1))) "Erlang major mode" tar ((:commit . "a06b5233c254003e19544c1f5f5d00802884eb0d") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "erlang" "languages" "processes"))])
(erlang . [(20220215 1844) ((emacs (24 1))) "Erlang major mode" tar ((:commit . "a7b98023a770dae237c6733ef4b287f29615f6bb") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "erlang" "languages" "processes"))])
(erlstack-mode . [(20210419 1917) ((emacs (25 1)) (dash (2 12 0))) "Minor mode for analysing Erlang stacktraces" single ((:commit . "ca264bca24cdaa8b2bac57882716f03f633e42b0") (:authors ("k32")) (:maintainer "k32") (:keywords "tools" "erlang") (:url . "https://github.com/k32/erlstack-mode"))])
(eros . [(20180415 618) ((emacs (24 4))) "Evaluation Result OverlayS for Emacs Lisp" single ((:commit . "dd8910279226259e100dab798b073a52f9b4233a") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "convenience" "lisp") (:url . "https://github.com/xiongtx/eros"))])
(ert-async . [(20200105 1031) ((emacs (24 1))) "Async support for ERT" single ((:commit . "948cf2faa10e085bda3739034ca5ea1912893433") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "lisp" "test") (:url . "http://github.com/rejeep/ert-async.el"))])
@ -1419,7 +1419,7 @@
(evil-surround . [(20220412 1724) ((evil (1 2 12))) "emulate surround.vim from Vim" single ((:commit . "2bc8aa6425f1311e985cf51ea6b5233c1ee6ce1c") (:authors ("Tim Harper <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-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-tex . [(20220415 842) ((emacs (26 1)) (evil (1 0)) (auctex (11 88))) "Useful features for editing LaTeX in evil-mode" single ((:commit . "26035ec9a09f8b38ce0d495ff788e83ec8b195d5") (:keywords "tex" "emulation" "vi" "evil" "wp") (:url . "https://github.com/iyefrat/evil-tex"))])
(evil-text-object-python . [(20191010 1328) ((emacs (25)) (evil (1 2 14)) (dash (2 16 0))) "Python specific evil text objects" single ((:commit . "39d22fc524f0413763f291267eaab7f4e7984318") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/wbolster/evil-text-object-python"))])
@ -2066,7 +2066,7 @@
(hcl-mode . [(20200315 2129) ((emacs (24 3))) "Major mode for Hashicorp" single ((:commit . "e4d9eef631e8a386341ae8f94f7c2579586e65b5") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/emacs-hcl-mode"))])
(headlong . [(20150417 1526) nil "reckless completion" single ((:commit . "f6830f87f236eee88263cb6976125f72422abe72") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "completion") (:url . "https://github.com/abo-abo/headlong"))])
(heaven-and-hell . [(20190713 1830) ((emacs (24 4))) "easy toggle light/dark themes" single ((:commit . "e1febfd60d060c110a1e43c5f093cd8537251308") (:authors ("Valentin Ignatev" . "valentignatev@gmail.com")) (:maintainer "Valentin Ignatev" . "valentignatev@gmail.com") (:keywords "faces") (:url . "https://github.com/valignatev/heaven-and-hell"))])
(helm . [(20220421 806) ((helm-core (3 8 4)) (popup (0 5 3))) "Helm is an Emacs incremental and narrowing framework" tar ((:commit . "24cc8959fbcab17fb5ce1e71ead8fd30950014bb") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))])
(helm . [(20220421 806) ((helm-core (3 8 4)) (popup (0 5 3))) "Helm is an Emacs incremental and narrowing framework" tar ((:commit . "7ff0b93b79117babeb5262b2f0754005b6d050ad") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))])
(helm-R . [(20120820 14) ((helm (20120517)) (ess (20120509))) "helm-sources and some utilities for GNU R." single ((:commit . "b0eb9d5f6a483a9dbe6eb6cf1f2024d4f5938bc2") (:authors ("myuhe <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-ad . [(20151209 1015) ((dash (2 8 0)) (helm (1 6 2))) "helm source for Active Directory" single ((:commit . "8ac044705d8620ee354a9cfa8cc1b865e83c0d55") (:authors ("Takahiro Noda" . "takahiro.noda+github@gmail.com")) (:maintainer "Takahiro Noda" . "takahiro.noda+github@gmail.com") (:keywords "comm"))])
@ -2101,7 +2101,7 @@
(helm-codesearch . [(20190412 1153) ((emacs (25 1)) (s (1 11 0)) (dash (2 12 0)) (helm (1 7 7)) (cl-lib (0 5))) "helm interface for codesearch" single ((:commit . "72f1d1de746115ab7e861178b49fa3c0b6b58d90") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com") (:keywords "tools"))])
(helm-commandlinefu . [(20150611 545) ((emacs (24 1)) (helm (1 7 0)) (json (1 3)) (let-alist (1 0 3))) "Search and browse commandlinefu.com from helm" single ((:commit . "9ee7e018c5db23ae9c8d1c8fa969876f15b7280d") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "commandlinefu.com") (:url . "https://github.com/xuchunyang/helm-commandlinefu"))])
(helm-company . [(20190812 1429) ((helm (1 5 9)) (company (0 6 13))) "Helm interface for company-mode" single ((:commit . "6eb5c2d730a60e394e005b47c1db018697094dde") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Daniel Ralston" . "Sodel-the-Vociferous@users.noreply.github.com") (:url . "https://github.com/Sodel-the-Vociferous/helm-company"))])
(helm-core . [(20220421 733) ((emacs (25 1)) (async (1 9 4))) "Development files for Helm" tar ((:commit . "24cc8959fbcab17fb5ce1e71ead8fd30950014bb") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))])
(helm-core . [(20220422 706) ((emacs (25 1)) (async (1 9 4))) "Development files for Helm" tar ((:commit . "7ff0b93b79117babeb5262b2f0754005b6d050ad") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))])
(helm-cscope . [(20190615 41) ((xcscope (1 0)) (helm (1 6 7)) (cl-lib (0 5)) (emacs (24 1))) "Helm interface for xcscope.el." single ((:commit . "af1d9e7f4460a88d7400b5a74d5da68084089ac1") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com") (:keywords "cscope" "helm") (:url . "https://github.com/alpha22jp/helm-cscope.el"))])
(helm-css-scss . [(20191230 1549) ((emacs (24 3)) (helm (1 0))) "CSS/SCSS/LESS Selectors with helm interface" single ((:commit . "48b996f73af1fef8d6e88a1c545d98f8c50b0cf3") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "convenience" "scss" "css" "less" "selector" "helm") (:url . "https://github.com/ShingoFukuyama/helm-css-scss"))])
(helm-ctest . [(20191031 1435) ((s (1 9 0)) (dash (2 11 0)) (helm-core (1 7 4))) "Run ctest from within emacs" single ((:commit . "2a29cfb4ec583da247fa2ae7bac88790b1223e40") (:authors ("Dan LaManna" . "me@danlamanna.com")) (:maintainer "Dan LaManna" . "me@danlamanna.com") (:keywords "helm" "ctest"))])
@ -2303,7 +2303,7 @@
(hl-block-mode . [(20220211 548) ((emacs (26 1))) "Highlighting nested blocks" single ((:commit . "3dd29cfbf24fec16eaf3d47936338adb6b34f5c8") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-hl-block-mode"))])
(hl-fill-column . [(20200607 757) ((names (0 5)) (emacs (24))) "Highlight fill column." single ((:commit . "5782a91ba0182c4e562fa0db6379ff9dd472856b") (:keywords "fill column" "faces") (:url . "https://github.com/laishulu/hl-fill-column"))])
(hl-indent . [(20170429 2104) ((emacs (24)) (cl-lib (0 5))) "Highlight irregular indentation." single ((:commit . "bdb2e0177a7c8b29af26998e688b856adc6ded93") (:authors ("Kirill Ignatiev <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-todo . [(20220419 1930) ((emacs (25))) "highlight TODO and similar keywords" single ((:commit . "d2f7a9b261a52e3c04c8d677165136a306f0aed3") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/hl-todo"))])
(hledger-mode . [(20210706 1225) ((emacs (24 4)) (popup (0 5 3)) (async (1 9)) (htmlize (1 47))) "A mode for writing journal entries for hledger." tar ((:commit . "9ac07ff0adbce6a402c17e789b1750f9da0d22f4") (:authors ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainer "Narendra Joshi" . "narendraj9@gmail.com") (:keywords "data") (:url . "https://github.com/narendraj9/hledger-mode.git"))])
@ -2633,7 +2633,7 @@
(kanban . [(20170418 810) nil "Parse org-todo headlines to use org-tables as Kanban tables" single ((:commit . "fcf0173ce0144e59de97ba8a7808192620e5f8f4") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de") (:keywords "outlines" "convenience"))])
(kanji-mode . [(20160826 1139) nil "View stroke order for kanji characters at cursor" tar ((:commit . "eda4f8666486689d36317db7dbda54fb73d3e3d2") (:authors ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainer "Wojciech Gac" . "wojciech.s.gac@gmail.com") (:url . "http://github.com/wsgac/kanji-mode "))])
(kaocha-runner . [(20190904 1950) ((emacs (26)) (s (1 4 0)) (cider (0 21 0)) (parseedn (0 1 0))) "A package for running Kaocha tests via CIDER." single ((:commit . "755b0dfb3bd676c769c4b4aeb81c2cd5828bd207") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:url . "https://github.com/magnars/kaocha-runner.el"))])
(kaolin-themes . [(20220413 1705) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:commit . "bd37ae6e48d918e9d72513345903093239a8ad8d") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:url . "https://github.com/ogdenwebb/emacs-kaolin-themes"))])
(kaolin-themes . [(20220422 1305) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:commit . "51b1f719bc300a4f684b6dc7511dfb044f75f575") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:url . "https://github.com/ogdenwebb/emacs-kaolin-themes"))])
(kaomoji . [(20171227 440) ((emacs (24 3)) (helm-core (1 9 1))) "Input kaomoji superb easily" tar ((:commit . "90a1490743b2a30762f5454c9d9309018eff83dd") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:keywords "tools" "fun") (:url . "https://github.com/kuanyui/kaomoji.el"))])
(kapacitor . [(20190414 1908) ((emacs (25 1)) (magit (2 13 0)) (magit-popup (2 12 4))) "Main file for kapacitor-mode" single ((:commit . "e3300d8b4017a2f66b0d929cb85bcc7ee2612072") (:authors ("Manoj Kumar Manikchand" . "manojm.321@gmail.com")) (:maintainer "Manoj Kumar Manikchand" . "manojm.321@gmail.com") (:keywords "kapacitor" "emacs" "magit" "tools") (:url . "http://github.com/Manoj321/kapacitor-el"))])
(karma . [(20160220 1245) ((pkg-info (0 4)) (emacs (24))) "Karma Test Runner Emacs Integration" single ((:commit . "31d3e7708246183d7ed0686be92bf23140af348c") (:authors ("Samuel Tonini")) (:maintainer "Samuel Tonini") (:keywords "language" "javascript" "js" "karma" "testing") (:url . "http://github.com/tonini/karma.el"))])
@ -2857,7 +2857,7 @@
(lsp-latex . [(20210815 1426) ((emacs (25 1)) (lsp-mode (6 0))) "LSP-mode client for LaTeX, on texlab" single ((:commit . "3f6b2ac9585682828eef81f895757f74cfba7309") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "languages" "tex") (:url . "https://github.com/ROCKTAKEY/lsp-latex"))])
(lsp-ltex . [(20220222 656) ((emacs (26 1)) (lsp-mode (6 1))) "LSP Clients for LTEX" single ((:commit . "e13bedf0032d376e1e28026abda5970bbbdb636d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-languagetool/lsp-ltex"))])
(lsp-metals . [(20220330 1958) ((emacs (26 1)) (scala-mode (1 1)) (lsp-mode (7 0)) (lsp-treemacs (0 2)) (dap-mode (0 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5))) "Scala Client settings" tar ((:commit . "b7f77de69431786c54e9a57845e4f2d75fbee053") (:authors ("Ross A. Baker" . "ross@rossabaker.com") ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainer "Ross A. Baker" . "ross@rossabaker.com") (:keywords "languages" "extensions") (:url . "https://github.com/emacs-lsp/lsp-metals"))])
(lsp-mode . [(20220421 1428) ((emacs (26 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0))) "LSP mode" tar ((:commit . "d230fd1170ead71276bd5b7a2fc5072fea8fc933") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-mode"))])
(lsp-mode . [(20220421 1428) ((emacs (26 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0))) "LSP mode" tar ((:commit . "624e9f33876f36f1a4c3d1525a0ae4b36d295fcb") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-mode"))])
(lsp-mssql . [(20191204 1150) ((emacs (25 1)) (lsp-mode (6 2)) (dash (2 14 1)) (f (0 20 0)) (ht (2 0)) (lsp-treemacs (0 1))) "MSSQL LSP bindings" tar ((:commit . "88319a61a06e27fc1d3ea2e7b853ec1692b4c166") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "data" "languages") (:url . "https://github.com/emacs-lsp/lsp-mssql"))])
(lsp-origami . [(20211016 1045) ((origami (1 0)) (lsp-mode (6 1))) "origami.el support for lsp-mode" single ((:commit . "5b88ab77dc2696c93fa5dd9debe183821c533b71") (:authors ("Vibhav Pant")) (:maintainer "Vibhav Pant") (:keywords "languages" "lsp-mode") (:url . "https://github.com/emacs-lsp/lsp-origami"))])
(lsp-p4 . [(20190127 1049) ((lsp-mode (3 0))) "P4 support for lsp-mode" tar ((:commit . "669460d93b87fb876df11b2b68229677e7ad1a26") (:authors ("Dmitri Makarov")) (:maintainer "Dmitri Makarov") (:keywords "lsp" "p4") (:url . "https://github.com/dmakarov/p4ls"))])
@ -2892,11 +2892,11 @@
(mag-menu . [(20150505 1850) ((splitter (0 1 0))) "Intuitive keyboard-centric menu system" single ((:commit . "9b9277021cd09fb1dba64b1d2a00705d20914bd6") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:keywords "convenience") (:url . "https://github.com/chumpage/mag-menu"))])
(magic-filetype . [(20180219 1552) ((emacs (24)) (s (1 9 0))) "Enhance filetype major mode" single ((:commit . "019494add5ff02dd36cb3f500142fc51125522cc") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "emulations" "vim" "ft" "file" "magic-mode") (:url . "https://github.com/zonuexe/magic-filetype.el"))])
(magic-latex-buffer . [(20210306 422) ((cl-lib (0 5)) (emacs (25 1))) "Magically enhance LaTeX-mode font-locking for semi-WYSIWYG editing" single ((:commit . "903ec91872760e47c0e5715795f8465173615098") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.github.io/"))])
(magik-mode . [(20220408 1250) nil "mode for editing Magik + some utils." tar ((:commit . "9c0faba222afc875cf604dd7fe4265f1ff891535") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))])
(magik-mode . [(20220422 837) nil "mode for editing Magik + some utils." tar ((:commit . "af1b83786c95d448dcb4df5406eb1cdba975abf5") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))])
(magit . [(20220412 2029) ((emacs (25 1)) (dash (20210826)) (git-commit (20220222)) (magit-section (20220325)) (transient (20220325)) (with-editor (20220318))) "A Git porcelain inside Emacs." tar ((:commit . "3cfc8458e14c705afdfbeb7dcd3d3f43d7479344") (:authors ("Marius Vollmer" . "marius.vollmer@gmail.com") ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/magit"))])
(magit-annex . [(20220302 1725) ((cl-lib (0 3)) (magit (3 0 0))) "Control git-annex from Magit" single ((:commit . "efe484644666c6b7c544b0fb7b87e30703fa9425") (:authors ("Kyle Meyer" . "kyle@kyleam.com") ("Rémi Vanicat" . "vanicat@debian.org")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-annex"))])
(magit-circleci . [(20191209 2113) ((dash (2 16 0)) (transient (0 1 0)) (magit (2 90 0)) (emacs (25 3))) "CircleCI integration for Magit" single ((:commit . "2d4bdacf498ed3ff7d2c3574d346b2d24cbb12da") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "circleci" "continuous" "integration" "magit" "vc" "tools") (:url . "https://github.com/abrochard/magit-circleci"))])
(magit-commit-mark . [(20220422 10) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" single ((:commit . "f794b45efcbbaab28d968b3616900dd4370ea030") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-magit-commit-mark"))])
(magit-commit-mark . [(20220422 705) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" single ((:commit . "2a4d08ac816734fc8195f86f685443e58e63da06") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-magit-commit-mark"))])
(magit-delta . [(20220125 50) ((emacs (25 1)) (magit (20200426)) (xterm-color (2 0))) "Use Delta when displaying diffs in Magit" single ((:commit . "5fc7dbddcfacfe46d3fd876172ad02a9ab6ac616") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com") (:url . "https://github.com/dandavison/magit-delta"))])
(magit-diff-flycheck . [(20190524 551) ((magit (2)) (flycheck (31)) (seq (2)) (emacs (25 1))) "Report errors in diffs" single ((:commit . "28acf74f59e385865746cccf4b1e4c4025ae9433") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com") (:keywords "convenience" "matching") (:url . "https://github.com/ragone/magit-diff-flycheck"))])
(magit-filenotify . [(20151116 2340) ((magit (1 3 0)) (emacs (24 4))) "Refresh status buffer when git tree changes" single ((:commit . "c0865b3c41af20b6cd89de23d3b0beb54c8401a4") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.de") (:keywords "tools"))])
@ -3059,7 +3059,7 @@
(modern-sh . [(20211101 1001) ((emacs (25 1)) (hydra (0 15 0)) (eval-in-repl (0 9 7))) "Minor mode for editing shell script" single ((:commit . "8ebebe77304aa8170f7af809e7564c79d3bd45da") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/modern-sh"))])
(modtime-skip-mode . [(20140128 2201) nil "Minor mode for disabling modtime and supersession checks on files." single ((:commit . "c0e49523aa26b2263a8693691ac775988015f592") (:authors ("Jordon Biondo" . "biondoj@mail.gvsu.edu")) (:maintainer "Jordon Biondo" . "biondoj@mail.gvsu.edu") (:url . "http://www.github.com/jordonbiondo/modtime-skip-mode"))])
(modular-config . [(20210726 1614) ((emacs (25 1))) "Organize your config into small and loadable modules" single ((:commit . "2bd77193fa3a7ec0541db284b4034821a8f59fea") (:authors ("Sidharth Arya" . "sidhartharya10@gmail.com")) (:maintainer "Sidharth Arya" . "sidhartharya10@gmail.com") (:keywords "startup" "lisp" "tools") (:url . "https://github.com/SidharthArya/modular-config.el"))])
(modus-themes . [(20220421 1021) ((emacs (27 1))) "Elegant, highly legible and customizable themes" tar ((:commit . "e8f1b8997466e244d9aa1a11b7ffaa4b70419874") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:keywords "faces" "theme" "accessibility") (:url . "https://git.sr.ht/~protesilaos/modus-themes"))])
(modus-themes . [(20220422 552) ((emacs (27 1))) "Elegant, highly legible and customizable themes" tar ((:commit . "a1752787db94b398a9f120c5f5e24fdf0c82e77b") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:keywords "faces" "theme" "accessibility") (:url . "https://git.sr.ht/~protesilaos/modus-themes"))])
(moe-theme . [(20220111 1220) nil "A colorful eye-candy theme. Moe, moe, kyun!" tar ((:commit . "edf3fe47fb986e283e3b04cba443dcb39fe8720e") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com") (:keywords "themes") (:url . "https://github.com/kuanyui/moe-theme.el"))])
(molar-mass . [(20210519 1342) ((emacs (24 3))) "Calculates molar mass of a molecule" single ((:commit . "838db1486a2dc5a3774eb195d62fbcdef71a63f7") (:authors ("Sergi Ruiz Trepat")) (:maintainer "Sergi Ruiz Trepat") (:keywords "convenience" "chemistry") (:url . "https://github.com/sergiruiztrepat/molar-mass.el"))])
(molecule . [(20180527 743) ((emacs (25 1))) "Simple wrapper for molecule" single ((:commit . "2ef72b81d9aa24ea782b71a061a3abdad6cae162") (:authors (": drymer <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-env-install . [(20200812 1305) ((emacs (25 1))) "Install packages using nix-env" single ((:commit . "79c34bc117ba1cebeb67fab32c364951d2ec37a0") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "processes" "tools") (:url . "https://github.com/akirak/nix-env-install"))])
(nix-haskell-mode . [(20190615 135) ((emacs (25)) (haskell-mode (16 0)) (nix-mode (1 3 0))) "haskell-mode integrations for Nix" single ((:commit . "68efbcbf949a706ecca6409506968ed2ef928a20") (:authors ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "haskell" "languages" "processes") (:url . "https://github.com/matthewbauer/nix-haskell"))])
(nix-mode . [(20220228 1520) ((emacs (25 1)) (magit-section (0)) (transient (0 3))) "Major mode for editing .nix files" tar ((:commit . "20ee8d88900b169831d6b0783bd82d2625e940c7") (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "languages" "tools" "unix") (:url . "https://github.com/NixOS/nix-mode"))])
(nix-mode . [(20220422 451) ((emacs (25 1)) (magit-section (0)) (transient (0 3))) "Major mode for editing .nix files" tar ((:commit . "66206cab276c0f4d1c84e77ba2a67ed6a46b2d9c") (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "languages" "tools" "unix") (:url . "https://github.com/NixOS/nix-mode"))])
(nix-modeline . [(20210405 742) ((emacs (25 1))) "Info about in-progress Nix evaluations on your modeline" single ((:commit . "ecda866b960321bb82deac26af45918e172ef0ba") (:authors ("Jordan Mulcahey" . "snhjordy@gmail.com")) (:maintainer "Jordan Mulcahey" . "snhjordy@gmail.com") (:keywords "processes" "unix" "tools") (:url . "https://github.com/ocelot-project/nix-modeline"))])
(nix-sandbox . [(20210325 1622) ((dash (2 12 1)) (s (1 10 0))) "Utility functions to work with nix-shell sandboxes" single ((:commit . "053a2d5110ce05b7f99bcc2ac4804b70cbe87916") (:authors ("Sven Keidel" . "svenkeidel@gmail.com")) (:maintainer "Sven Keidel" . "svenkeidel@gmail.com") (:url . "https://github.com/travisbhartwell/nix-emacs"))])
(nix-update . [(20190124 1935) ((emacs (25))) "Update \"fetch\" blocks in .nix expressions" single ((:commit . "fc6c39c2da3fcfa62f4796816c084a6389c8b6e7") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "nix") (:url . "https://github.com/jwiegley/nix-update-el"))])
@ -3285,7 +3285,7 @@
(ob-dart . [(20170106 1624) nil "org-babel functions for Dart evaluation" single ((:commit . "04d63b922a5469506560ca0c00678e57131e0269") (:authors ("Milan Zimmermann")) (:maintainer "Milan Zimmermann") (:keywords "literate programming" "reproducible research" "emacs" "org" "babel" "dart") (:url . "http://github.org/mzimmerm/ob-dart"))])
(ob-deno . [(20201019 101) ((emacs (26 1))) "Babel Functions for Javascript/TypeScript with Deno" single ((:commit . "f1129d20fe9931f1c0b62c4af781f5489abd957f") (:authors ("HIGASHI Taiju")) (:maintainer "HIGASHI Taiju") (:keywords "literate programming" "reproducible research" "javascript" "typescript" "tools") (:url . "https://github.com/taiju/ob-deno"))])
(ob-diagrams . [(20160407 1237) nil "org-babel functions for diagrams evaluation" single ((:commit . "ed6649616325ca5b2d2109f74aded8bcb8aa5186") (:authors ("Daniel Bergey")) (:maintainer "Daniel Bergey") (:keywords "literate programming" "reproducible research") (:url . "http://orgmode.org"))])
(ob-dsq . [(20220405 2219) ((emacs (27 1))) "Babel functions for the `dsq` CLI tool by Multiprocess Labs" single ((:commit . "37090235c064ba5a5e436b0b77b5442f606cf5b3") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "data" "tools") (:url . "https://github.com/fritzgrabo/ob-dsq"))])
(ob-dsq . [(20220422 730) ((emacs (27 1))) "Babel functions for the `dsq` CLI tool by Multiprocess Labs" single ((:commit . "3dd955a2c5f7d7aecb10c4bcc4ef0c27f50a6376") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "data" "tools") (:url . "https://github.com/fritzgrabo/ob-dsq"))])
(ob-elixir . [(20170725 1419) ((org (8))) "org-babel functions for elixir evaluation" single ((:commit . "8990a8178b2f7bd93504a9ab136622aab6e82e32") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "elixir") (:url . "http://github.com/zweifisch/ob-elixir"))])
(ob-elm . [(20200528 1857) ((emacs (26 1)) (org (9 3))) "Org-babel functions for elm evaluation" single ((:commit . "d3a9fbc2f56416894c9aed65ea9a20cc1d98f15d") (:authors ("Bonface M. K.")) (:maintainer "Bonface M. K.") (:keywords "languages" "tools") (:url . "https://www.bonfacemunyoki.com"))])
(ob-elvish . [(20180427 1900) nil "org-babel functions for Elvish shell" single ((:commit . "369181ceae1190bf971c71aebf9fc6133bd98c39") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "literate programming" "elvish" "shell" "languages" "processes" "tools") (:url . "https://github.com/zzamboni/ob-elvish"))])
@ -3398,7 +3398,7 @@
(org-caldav . [(20200510 2030) ((org (7))) "Sync org files with external calendar through CalDAV" single ((:commit . "8569941a0a5a9393ba51afc8923fd7b77b73fa7a") (:authors ("David Engster" . "deng@randomsample.de")) (:maintainer "David Engster" . "deng@randomsample.de") (:keywords "calendar" "caldav"))])
(org-capture-pop-frame . [(20160518 1008) ((emacs (24 4))) "Run org-capture in a new pop frame" single ((:commit . "b16fd712de62cf0d1f9befd03be6ab5983cb3301") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/org-capture-pop-frame.git"))])
(org-category-capture . [(20220114 730) ((org (9 0 0)) (emacs (24))) "Contextualy capture of org-mode TODOs." single ((:commit . "642b39c698db00bc535c1c2335f425fb9f4855a9") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org-mode" "todo" "tools" "outlines") (:url . "https://github.com/IvanMalison/org-projectile"))])
(org-chef . [(20220412 1423) ((org (0)) (emacs (24))) "Cookbook and recipe management with org-mode." tar ((:commit . "f244b33a5a42d2879b9a6f4fcfeedcefb3326b94") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:url . "https://github.com/Chobbes/org-chef"))])
(org-chef . [(20220422 300) ((org (0)) (emacs (24))) "Cookbook and recipe management with org-mode." tar ((:commit . "6a786e77e67a715b3cd4f5128b59d501614928af") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:url . "https://github.com/Chobbes/org-chef"))])
(org-cliplink . [(20201126 1020) ((emacs (24 4))) "insert org-mode links from the clipboard" tar ((:commit . "13e0940b65d22bec34e2de4bc8cba1412a7abfbc") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/org-cliplink"))])
(org-clock-convenience . [(20200705 1527) ((cl-lib (0 5)) (org (8)) (emacs (24 3))) "convenience functions for org time tracking" single ((:commit . "efc9773a8dedf834cf4a78fb6f5f8fffe55ef8eb") (:authors ("Derek Feichtinger <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"))])
@ -3454,7 +3454,7 @@
(org-mind-map . [(20180826 2340) ((emacs (24)) (dash (1 8 0)) (org (8 2 10))) "Creates a directed graph from org-mode files" single ((:commit . "95347b2f9291f5c5eb6ebac8e726c03634c61de3") (:authors ("Ted Wiles" . "theodore.wiles@gmail.com")) (:maintainer "Ted Wiles" . "theodore.wiles@gmail.com") (:keywords "orgmode" "extensions" "graphviz" "dot") (:url . "https://github.com/theodorewiles/org-mind-map"))])
(org-ml . [(20211231 700) ((emacs (26 1)) (org (9 3)) (dash (2 17)) (s (1 12))) "Functional Org Mode API" tar ((:commit . "3974435bbf72722801f7ed78855381d77a773162") (:authors ("Nathan Dwarshuis" . "ndwar@yavin4.ch")) (:maintainer "Nathan Dwarshuis" . "ndwar@yavin4.ch") (:keywords "org-mode" "outlines") (:url . "https://github.com/ndwarshuis/org-ml"))])
(org-mobile-sync . [(20180606 524) ((emacs (24 3 50)) (org (8 0))) "automatically sync org-mobile on changes" single ((:commit . "06764b943a528827df1e2acc6bc7806cc2c1351f") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "org-mode" "org" "mobile" "sync" "todo") (:url . "https://framagit.org/steckerhalter/org-mobile-sync"))])
(org-modern . [(20220420 1400) ((emacs (27 1))) "Modern looks for Org" single ((:commit . "42cb064f9d31adaf00168f18072cec0206b9737c") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/org-modern"))])
(org-modern . [(20220422 940) ((emacs (27 1))) "Modern looks for Org" single ((:commit . "ff1046705b3950b7a49da50bc34c11da86c6226d") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/org-modern"))])
(org-movies . [(20210920 101) ((emacs (26 1)) (org (9 0)) (request (0 3 0))) "Manage watchlist with Org mode" single ((:commit . "e96fecaffa2924de64a507aa31d2934e667ee1ea") (:authors ("Anh T Nguyen")) (:maintainer "Anh T Nguyen") (:keywords "hypermedia" "outlines" "org") (:url . "https://github.com/teeann/org-movies"))])
(org-mru-clock . [(20211029 1147) ((emacs (26 1))) "Clock in/out of tasks with completion and persistent history" single ((:commit . "a74322f0cfd6e52151f9bb8d4f90833330f69120") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "calendar") (:url . "https://github.com/unhammer/org-mru-clock"))])
(org-msg . [(20220331 1707) ((emacs (24 4)) (htmlize (1 54))) "Org mode to send and reply to email in HTML." single ((:commit . "60e22e446325a9b3387396459d98be7c1c52579d") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:keywords "extensions" "mail") (:url . "https://github.com/jeremy-compostella/org-msg"))])
@ -3683,8 +3683,8 @@
(parse-it . [(20220214 1531) ((emacs (25 1)) (s (1 12 0))) "Basic Parser in Emacs Lisp" tar ((:commit . "41af4e77ff9b3abf98fb52302a418b638be88f7c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/parse-it"))])
(parsebib . [(20220116 2336) ((emacs (25 1))) "A library for parsing bib files" single ((:commit . "63e85c8477fdf98ba920437c9df15f8f06c315e9") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "bibtex") (:url . "https://github.com/joostkremers/parsebib"))])
(parsec . [(20180730 16) ((emacs (24)) (cl-lib (0 5))) "Parser combinator library" single ((:commit . "2cbbbc2254aa7bcaa4fb5e07c8c1bf2f381dba26") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/parsec.el"))])
(parseclj . [(20220328 558) ((emacs (25))) "Clojure/EDN parser" tar ((:commit . "b04eae67384c1d8181edf318fd62d422a8220724") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))])
(parseedn . [(20220207 1352) ((emacs (26)) (parseclj (1 1 0)) (map (2))) "Clojure/EDN parser" single ((:commit . "ea7b5281ec80aca0bd1cc93a348aebb302497339") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))])
(parseclj . [(20220422 936) ((emacs (25))) "Clojure/EDN parser" tar ((:commit . "4d0e780e00f1828b00c43099e6eebc6582998f72") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))])
(parseedn . [(20220422 936) ((emacs (26)) (parseclj (1 1 0)) (map (2))) "Clojure/EDN parser" single ((:commit . "dce2eed418ad21acf3d2d6d75c37dfa679b22359") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))])
(pasp-mode . [(20180404 1700) ((emacs (24 3))) "- A major mode for editing Answer Set Programs." single ((:commit . "59385eb0e8ebcfc8c11dd811fb145d4b0fa3cc92") (:authors ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainer "Henrik Jürges" . "juerges.henrik@gmail.com") (:keywords "asp" "pasp" "answer set programs" "potassco answer set programs" "major mode" "languages") (:url . "https://github.com/santifa/pasp-mode"))])
(pass . [(20210203 810) ((emacs (25)) (password-store (2 1 0)) (password-store-otp (0 1 5)) (f (0 17))) "Major mode for password-store.el" single ((:commit . "5651da53137db9adcb125b4897c2fe27eeb4368d") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com") ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "password-store" "password" "keychain"))])
(passmm . [(20210109 8) ((emacs (24 4)) (password-store (0))) "A minor mode for pass (Password Store)." single ((:commit . "d78d1bf4f397180d2256248df589f33aafb4c8b4") (:authors ("Peter Jones" . "pjones@devalot.com")) (:maintainer "Peter Jones" . "pjones@devalot.com") (:url . "https://github.com/pjones/passmm"))])
@ -3925,7 +3925,7 @@
(propfont-mixed . [(20150113 2211) ((emacs (24)) (cl-lib (0 5))) "Use proportional fonts with space-based indentation." single ((:commit . "0b461ef4754a469610dba71874a34b6da42176bf") (:authors ("Kirill Ignatiev <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"))])
(prosjekt . [(20151127 1416) ((dash (2 8 0))) "a software project tool for emacs" tar ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))])
(protobuf-mode . [(20220303 1716) nil "major mode for editing protocol buffers." single ((:commit . "e81c678e7dfd43f75d4d68ba1df75ce168820f11") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com") (:keywords "google" "protobuf" "languages"))])
(protobuf-mode . [(20220303 1716) nil "major mode for editing protocol buffers." single ((:commit . "bfc956bc3a03f22309173c1872db6ca67d2a161f") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com") (:keywords "google" "protobuf" "languages"))])
(protocols . [(20170802 1132) ((cl-lib (0 5))) "Protocol database access functions." single ((:commit . "d0f7c4acb05465f1a0d4be54363bbd2802647e77") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "net" "protocols") (:url . "https://github.com/davep/protocols.el"))])
(proxy-mode . [(20220210 1410) ((emacs (25))) "A minor mode to toggle proxy." single ((:commit . "620e48c6afaf760d0ee9f5bdf583fd91cd9d0ec6") (:keywords "comm" "proxy") (:url . "https://repo.or.cz/proxy-mode.git"))])
(psalm . [(20211002 1552) ((emacs (24 3)) (php-mode (1 22 3))) "Interface to Psalm" single ((:commit . "28d546a79cb865a78b94cd7e929d66d720505faa") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/psalm.el"))])
@ -3965,7 +3965,7 @@
(pyenv-mode-auto . [(20180620 1252) ((pyenv-mode (0 1 0)) (s (1 11 0)) (f (0 17 0))) "Automatically activates pyenv version if .python-version file exists." single ((:commit . "347b94cd5ad22e33cc41be661c102d4548767858") (:authors ("Sviatoslav Bulbakha" . "mail@ssbb.me")) (:maintainer "Sviatoslav Bulbakha" . "mail@ssbb.me") (:keywords "python" "pyenv") (:url . "https://github.com/ssbb/pyenv-mode-auto"))])
(pygen . [(20161121 506) ((elpy (1 12 0)) (python-mode (6 2 2)) (dash (2 13 0))) "Python code generation using Elpy and Python-mode." single ((:commit . "9019ff44ba49d7295b1476530feab91fdadb084b") (:authors ("Jack Crawley <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"))])
(pyim . [(20220422 208) ((emacs (25 1)) (async (1 6)) (xr (1 13))) "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime." tar ((:commit . "63de15e13b8c3ad6be50b7cb6a5855a53a6d8739") (:authors ("Ye Wenbin" . "wenbinye@163.com") ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method") (:url . "https://github.com/tumashu/pyim"))])
(pyim . [(20220422 936) ((emacs (25 1)) (async (1 6)) (xr (1 13))) "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime." tar ((:commit . "cd1bfd2bbc10fe0ac47d0ec383cde453f6019e6c") (:authors ("Ye Wenbin" . "wenbinye@163.com") ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method") (:url . "https://github.com/tumashu/pyim"))])
(pyim-basedict . [(20210517 43) nil "The default pinyin dict of pyim" tar ((:commit . "86f6de3e3a1523eb278bd3afe7c4ceba2a0e2972") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/tumashu/pyim-basedict"))])
(pyim-cangjiedict . [(20210617 934) ((pyim (3 7))) "Some cangjie dicts for pyim" tar ((:commit . "d17e3d32a6480939b350a91a915ebe8e6efad819") (:authors ("Yuanchen Xie" . "yuanchen.gm@gmail.com")) (:maintainer "Yuanchen Xie" . "yuanchen.gm@gmail.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/p1uxtar/pyim-cangjiedict"))])
(pyim-smzmdict . [(20210505 1445) ((pyim (3 7))) "Sanma(triple) Zhengma dict for pyim" tar ((:commit . "fcddbde17a04d174c7353548056524687f7be8d2") (:authors ("Yue Shi (Zhizhi)")) (:maintainer "Yuanchen Xie") (:keywords "convenience" "i18n" "pyim" "chinese" "zhengma") (:url . "https://github.com/p1uxtar/pyim-smzmdict"))])
@ -3973,7 +3973,7 @@
(pyimport . [(20180308 1752) ((dash (2 8 0)) (s (1 9 0)) (shut-up (0 3 2))) "Manage Python imports!" single ((:commit . "a6f63cf7ed93f0c0f7c207e6595813966f8852b9") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))])
(pyimpsort . [(20160130 453) ((emacs (24 3))) "Sort python imports." tar ((:commit . "d5c61d70896b642646dfd3c809c06174ae086c1a") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/pyimpsort.el"))])
(pyinspect . [(20211102 1415) ((emacs (27 1))) "Python object inspector" tar ((:commit . "36cf624236c8b4cce852dd52b64d058d4d4a32fd") (:authors ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainer "Maor Kadosh" . "git@avocadosh.xyz") (:keywords "tools") (:url . "https://github.com/it-is-wednesday/pyinspect.el"))])
(pylint . [(20210411 1931) nil "minor mode for running `pylint'" single ((:commit . "8bab34e23c88057753bc251373467c47a6c66ba7") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com") (:keywords "languages" "python"))])
(pylint . [(20210411 1931) nil "minor mode for running `pylint'" single ((:commit . "7163b86c6f4a1a1c4ae1d6e5d3ab324ec76569e5") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com") (:keywords "languages" "python"))])
(pynt . [(20180710 726) ((emacs (24 4)) (ein (0 13 1)) (epc (0 1 1)) (deferred (0 5 1))) "Generate and scroll EIN buffers from python code" single ((:commit . "86cf9ce78d34f92bfd0764c9cbb75427ebd429e6") (:authors ("Edward Banner" . "edward.banner@gmail.com")) (:maintainer "Edward Banner" . "edward.banner@gmail.com") (:keywords "convenience") (:url . "https://github.com/ebanner/pynt"))])
(pyramid . [(20210427 1032) ((emacs (25 2)) (pythonic (0 1 1)) (tablist (0 70))) "Minor mode for working with pyramid projects" tar ((:commit . "66f54f4a9cc9fa81edf768ab433d5b3c5517363c") (:authors ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my") (:keywords "python" "pyramid" "pylons" "convenience" "tools" "processes") (:url . "https://github.com/dakra/pyramid.el"))])
(pytest . [(20200330 41) ((s (1 9 0))) "Easy Python test running in Emacs" single ((:commit . "6934047242db79b1c53e9fe3e0734cc9719ed1c4") (:keywords "pytest" "python" "testing") (:url . "https://github.com/ionrock/pytest-el"))])
@ -4520,7 +4520,7 @@
(stickyfunc-enhance . [(20150429 1814) ((emacs (24 3))) "An enhancement to stock `semantic-stickyfunc-mode'" single ((:commit . "13bdba51fcd83ccbc3267959d23afc94d458dcb0") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainer "Tu, Do Hoang") (:keywords "c" "languages" "tools") (:url . "https://github.com/tuhdo/semantic-stickyfunc-enhance"))])
(stimmung-themes . [(20220412 1434) ((emacs (25))) "Themes tuned to inner harmonies" tar ((:commit . "77146bd3ad4f275847c965148572bb0ff0b54c1e") (:authors ("Love Lagerkvist")) (:maintainer "Love Lagerkvist") (:keywords "faces") (:url . "https://github.com/motform/stimmung-themes"))])
(stock-ticker . [(20150204 1052) ((s (1 9 0)) (request (0 2 0))) "Show stock prices in mode line" single ((:commit . "f2e564142c9de84232839a5b01979cf95b04d6a9") (:authors ("Gunther Hagleitner")) (:maintainer "Gunther Hagleitner") (:keywords "comms") (:url . "https://github.com/hagleitn/stock-ticker"))])
(stock-tracker . [(20220422 225) ((emacs (27 1)) (dash (2 16 0)) (async (1 9 5))) "Track stock price" single ((:commit . "ae082b7125b7d64cb262268ac91e42cdcbefb3cc") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "stock" "finance") (:url . "https://github.com/beacoder/stock-tracker"))])
(stock-tracker . [(20220422 943) ((emacs (27 1)) (dash (2 16 0)) (async (1 9 5))) "Track stock price" single ((:commit . "649812ebd286f1944eaf7b34d45d72ef60a0b0fb") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "stock" "finance") (:url . "https://github.com/beacoder/stock-tracker"))])
(strace-mode . [(20171116 2039) nil "strace output syntax highlighting" single ((:commit . "2901baa968d5180ab985ac40ca22cc20914d01f5") (:authors ("Preston Moore" . "prestonkmoore@gmail.com")) (:maintainer "Preston Moore" . "prestonkmoore@gmail.com") (:keywords "languages"))])
(streak . [(20220311 1929) ((emacs (27 1))) "Track a daily streak in your Mode Line" single ((:commit . "b2206de2fe43f97e754bbcb0abe9b078a419e787") (:authors ("Colin Woodbury <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"))])
@ -4810,7 +4810,7 @@
(undersea-theme . [(20200719 618) ((emacs (24 3))) "Theme styled after undersea imagery" single ((:commit . "b7b5bffe242fd15b9eb8fe5cb7c9b45e474babbc") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/undersea-theme"))])
(underwater-theme . [(20131118 2) nil "A gentle, deep blue color theme" single ((:commit . "4eb9ef014f580adc135d91d1cd68d37a310640b6") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com") (:keywords "faces"))])
(undo-fu . [(20220412 2337) ((emacs (25 1))) "Undo helper with redo" single ((:commit . "f9c39c248cb965cd3c7cb3c8e15a4eee71921f8c") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu"))])
(undo-fu-session . [(20220421 2239) ((emacs (28 1))) "Persistent undo, available between sessions" single ((:commit . "e4cf026fd535dbd734a355af98b6b2e788947093") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu-session"))])
(undo-fu-session . [(20220422 320) ((emacs (28 1))) "Persistent undo, available between sessions" single ((:commit . "ee3879e469c792ae09933a2ca160b7979796b9e1") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu-session"))])
(undo-propose . [(20210207 45) ((emacs (24 3))) "Simple and safe undo navigation" single ((:commit . "91a1dfe516d90dab69c368f6669bacb2458ec5e9") (:authors ("Jack Kamm")) (:maintainer "Jack Kamm") (:keywords "convenience" "files" "undo" "redo" "history") (:url . "https://github.com/jackkamm/undo-propose.el"))])
(undohist . [(20220219 634) ((cl-lib (1 0))) "Persistent undo history for GNU Emacs" single ((:commit . "ec95d5038425bca375865803701c971a9c748114") (:authors ("MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com")) (:maintainer "MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com") (:keywords "convenience"))])
(unfill . [(20210106 220) ((emacs (24 1))) "Do the opposite of fill-paragraph or fill-region" single ((:commit . "cd354ea1a74338760ac6f5872d573e3ecb6b4bd2") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience") (:url . "https://github.com/purcell/unfill"))])
@ -4940,7 +4940,7 @@
(wakatime-mode . [(20211104 1455) nil "Automatic time tracking extension for WakaTime" single ((:commit . "a53c0e819258ea9dbea3ad64b16e4c6c6201f5a5") (:authors ("Gabor Torok" . "gabor@20y.hu")) (:maintainer "Alan Hamlett" . "alan@wakatime.com") (:keywords "calendar" "comm"))])
(wakib-keys . [(20220211 1304) ((emacs (24 4))) "Minor Mode for Modern Keybindings" single ((:commit . "ed86134f91c532a38d2739dd15ea6cec879cbd8a") (:authors ("Abdulla Bubshait")) (:maintainer "Abdulla Bubshait") (:keywords "convenience" "keybindings" "keys") (:url . "https://github.com/darkstego/wakib-keys/"))])
(wal-mode . [(20220409 1214) ((emacs (25 1))) "A major mode for the WAL programming language" single ((:commit . "1daaf882824e8483419dc999c2d5507ad30cc929") (:authors ("Lucas Klemmer" . "lucas.klemmer@jku.at")) (:maintainer "Lucas Klemmer" . "lucas.klemmer@jku.at") (:keywords "languages") (:url . "https://github.com/LucasKl/wal-major-mode"))])
(walkclj . [(20220421 645) ((emacs (25)) (parseclj (0 1 0)) (treepy (0 1 0))) "Manipulate Clojure parse trees" single ((:commit . "4b4e9fcef2361bdf88ab3c7f905a76672cfd43e4") (:authors ("Arne Brasseur")) (:maintainer "Arne Brasseur") (:keywords "languages") (:url . "https://github.com/plexus/walkclj"))])
(walkclj . [(20220422 854) ((emacs (25)) (parseclj (0 1 0)) (treepy (0 1 0))) "Manipulate Clojure parse trees" single ((:commit . "ce4e7713d801b03f94f5da9898fce09718380ed4") (:authors ("Arne Brasseur")) (:maintainer "Arne Brasseur") (:keywords "languages") (:url . "https://github.com/plexus/walkclj"))])
(walkman . [(20220318 2122) ((transient (0 1 0)) (org (8 3 5)) (json-mode (1 6 0)) (emacs (26 3))) "Write HTTP requests in Org mode" single ((:commit . "3118dd4f493caffcc2849058833572dfc0c0e0a9") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "walkman" "http" "curl" "org" "comm") (:url . "https://github.com/abrochard/walkman"))])
(wallpaper . [(20201019 2123) ((emacs (25 1))) "Setting the wallpaper" single ((:commit . "cc0101726dd2fa2b4eda06924c7abfae54f663e2") (:authors ("Farlado" . "farlado@sdf.org")) (:maintainer "Farlado" . "farlado@sdf.org") (:keywords "unix" "wallpaper" "extensions") (:url . "https://github.com/farlado/emacs-wallpaper"))])
(wallpreview . [(20220220 427) ((emacs (24 4))) "Set wallpapers with image-dired" single ((:commit . "b1b8f19ae82b344a9577cea7b883ad513ec52222") (:url . "https://github.com/nryotaro/wallpreview"))])

View File

@ -0,0 +1,8 @@
######## ## ## ### ###### ######
## ### ### ## ## ## ## ## ##
## #### #### ## ## ## ##
###### ## ### ## ## ## ## ######
## ## ## ######### ## ##
## ## ## ## ## ## ## ## ##
######## ## ## ## ## ###### ######

View File

@ -0,0 +1,6 @@
_______ .___ ___. ___ ______ _______.
| ____|| \/ | / \ / | / |
| |__ | \ / | / ^ \ | ,----' | (----`
| __| | |\/| | / /_\ \ | | \ \
| |____ | | | | / _____ \ | `----.----) |
|_______||__| |__| /__/ \__\ \______|_______/

View File

@ -0,0 +1,8 @@
_______ _____ ______ ________ ________ ________
|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\
\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_
\ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \
\ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \
\ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \
\|_______|\|__| \|__|\|__|\|__|\|_______|\_________\
\|_________|

View File

@ -0,0 +1,17 @@
_ ___ _ _
_ ___ __ ___ __ _ ___
__ _ ___ __ ___
_ ___ _
_ _ __ _
___ __ _
__ _
_ _ _
_ _ _
_ _ _
__ ___
_ _ _ _
_ _
_ _
_ _
_
__

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View 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

View 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:

File diff suppressed because it is too large Load Diff

View 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 lines 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 lines 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 doesnt
;; use invisible text currently but when it does were 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

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -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

View File

@ -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"))

View File

@ -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

View File

@ -1,2 +1,2 @@
;;; Generated package description from dired-hacks-utils.el -*- no-byte-compile: t -*-
(define-package "dired-hacks-utils" "20201005.2318" "Utilities and helpers for dired-hacks collection" '((dash "2.5.0")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files"))
;;; Generated package description from dired-hacks-utils.el -*- no-byte-compile: t -*-
(define-package "dired-hacks-utils" "20201005.2318" "Utilities and helpers for dired-hacks collection" '((dash "2.5.0")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files"))

View File

@ -1,2 +1,2 @@
;;; Generated package description from dired-rainbow.el -*- no-byte-compile: t -*-
(define-package "dired-rainbow" "20190722.1109" "Extended file highlighting according to its type" '((dash "2.5.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matus Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matus Goljer" . "matus.goljer@gmail.com") :keywords '("files"))
;;; Generated package description from dired-rainbow.el -*- no-byte-compile: t -*-
(define-package "dired-rainbow" "20190722.1109" "Extended file highlighting according to its type" '((dash "2.5.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matus Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matus Goljer" . "matus.goljer@gmail.com") :keywords '("files"))

View File

@ -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

View File

@ -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"))

View File

@ -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

View File

@ -1,2 +1,2 @@
;;; Generated package description from dired-single.el -*- no-byte-compile: t -*-
(define-package "dired-single" "20211101.2319" "Reuse the current dired buffer to visit a directory" 'nil :commit "b254f9b7bfc96a5eab5760a56811f2872d2c590a" :keywords '("dired" "reuse" "buffer") :url "https://github.com/crocket/dired-single")
;;; Generated package description from dired-single.el -*- no-byte-compile: t -*-
(define-package "dired-single" "20211101.2319" "Reuse the current dired buffer to visit a directory" 'nil :commit "b254f9b7bfc96a5eab5760a56811f2872d2c590a" :keywords '("dired" "reuse" "buffer") :url "https://github.com/crocket/dired-single")

View 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

View 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")

View 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

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -0,0 +1,8 @@
######## ## ## ### ###### ######
## ### ### ## ## ## ## ## ##
## #### #### ## ## ## ##
###### ## ### ## ## ## ## ######
## ## ## ######### ## ##
## ## ## ## ## ## ## ## ##
######## ## ## ## ## ###### ######

View File

@ -0,0 +1,6 @@
_______ .___ ___. ___ ______ _______.
| ____|| \/ | / \ / | / |
| |__ | \ / | / ^ \ | ,----' | (----`
| __| | |\/| | / /_\ \ | | \ \
| |____ | | | | / _____ \ | `----.----) |
|_______||__| |__| /__/ \__\ \______|_______/

View File

@ -0,0 +1,8 @@
_______ _____ ______ ________ ________ ________
|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\
\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_
\ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \
\ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \
\ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \
\|_______|\|__| \|__|\|__|\|__|\|_______|\_________\
\|_________|

View File

@ -0,0 +1,17 @@
_ ___ _ _
_ ___ __ ___ __ _ ___
__ _ ___ __ ___
_ ___ _
_ _ __ _
___ __ _
__ _
_ _ _
_ _ _
_ _ _
__ ___
_ _ _ _
_ _
_ _
_ _
_
__

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View 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

View 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:

File diff suppressed because it is too large Load Diff

View 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 lines 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 lines 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 doesnt
;; use invisible text currently but when it does were 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

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -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

View File

@ -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"))

View File

@ -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

View File

@ -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

View File

@ -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"))

View File

@ -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

View File

@ -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

View File

@ -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"))

View File

@ -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

View File

@ -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

View File

@ -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"))

View File

@ -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

View File

@ -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

View File

@ -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")

View File

@ -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

View 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

View 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")

View 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

View 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

View 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

View 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:

View 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