diff --git a/code/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el b/code/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el index a6ce0d7..e0def8d 100644 --- a/code/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el +++ b/code/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el @@ -1,2 +1,2 @@ -;;; Generated package description from all-the-icons-dired.el -*- no-byte-compile: t -*- -(define-package "all-the-icons-dired" "20220304.1638" "Shows icons for each file in dired mode" '((emacs "24.4") (all-the-icons "2.2.0")) :commit "147ed0dfd1034a686795a08dc63e2c293128597e" :authors '(("jtbm37")) :maintainer '("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") :keywords '("files" "icons" "dired") :url "https://github.com/wyuenho/all-the-icons-dired") +;;; Generated package description from all-the-icons-dired.el -*- no-byte-compile: t -*- +(define-package "all-the-icons-dired" "20220304.1638" "Shows icons for each file in dired mode" '((emacs "24.4") (all-the-icons "2.2.0")) :commit "147ed0dfd1034a686795a08dc63e2c293128597e" :authors '(("jtbm37")) :maintainer '("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") :keywords '("files" "icons" "dired") :url "https://github.com/wyuenho/all-the-icons-dired") diff --git a/code/elpa/archives/gnu/archive-contents b/code/elpa/archives/gnu/archive-contents index 1c78ee3..1ca8966 100644 --- a/code/elpa/archives/gnu/archive-contents +++ b/code/elpa/archives/gnu/archive-contents @@ -1606,7 +1606,7 @@ ("Stefan Monnier" . "monnier@iro.umontreal.ca")) (:url . "http://elpa.gnu.org/packages/lex.html"))]) (lin . - [(0 3 0) + [(0 3 1) ((emacs (27 1))) "Make `hl-line-mode' more suitable for selection UIs" tar @@ -1615,7 +1615,7 @@ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) - (:commit . "edc29c2afe98ecd120108b7d3561aff938cc22c3"))]) + (:commit . "520621e51a6f6882beda4420fa5ccee6682748dd"))]) (lmc . [(1 4) ((emacs @@ -1661,7 +1661,7 @@ (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:url . "https://github.com/fourier/loccur"))]) (logos . - [(0 3 1) + [(0 3 2) ((emacs (27 1))) "Simple focus mode and extras" tar @@ -1670,7 +1670,7 @@ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) - (:commit . "9e6824b8fa67c6c96e46eeb410cbca2f88193a2d"))]) + (:commit . "dd25e36b64320f2ba9400a3929443aa81085e697"))]) (map . [(3 2 1) ((emacs @@ -2269,7 +2269,7 @@ ("Scott Andrew Borton" . "scott@pp.htv.fi")) (:maintainer "John Darrington" . "john@darrington.wattle.id.au"))]) (pulsar . - [(0 3 0) + [(0 3 1) ((emacs (27 1))) "Pulse highlight on demand or after select functions" tar @@ -2278,7 +2278,7 @@ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) - (:commit . "cdb7892a2b7e8e7cc644b8e24e5ab6bf0c51584d"))]) + (:commit . "86a7c429c6878287c068106b318889824cad3210"))]) (pyim . [(4 1 1) ((emacs @@ -2949,15 +2949,16 @@ ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:keywords "convenience"))]) (tmr . - [(0 2 1) + [(0 2 2) ((emacs (27 1))) - "TMR Must Recur" tar + "Set timers using a convenient notation" tar ((:url . "https://git.sr.ht/~protesilaos/tmr") + (:keywords "convenience" "timer") (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) - (:commit . "30784cbe2eb036e58e99cd9b9e44909e7db93cdc"))]) + (:commit . "bf13ea973126ea5a1a8f6d4216959d9da4ade979"))]) (tramp . [(2 5 2 3) ((emacs diff --git a/code/elpa/archives/gnu/archive-contents.signed b/code/elpa/archives/gnu/archive-contents.signed index 39d3607..a069b33 100644 --- a/code/elpa/archives/gnu/archive-contents.signed +++ b/code/elpa/archives/gnu/archive-contents.signed @@ -1 +1 @@ -Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) (trust undefined) created at 2022-04-21T17:15:02-0400 using RSA \ No newline at end of file +Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) (trust undefined) created at 2022-04-22T05:05:03-0400 using RSA \ No newline at end of file diff --git a/code/elpa/archives/melpa/archive-contents b/code/elpa/archives/melpa/archive-contents index b5f0071..22319fd 100644 --- a/code/elpa/archives/melpa/archive-contents +++ b/code/elpa/archives/melpa/archive-contents @@ -100,7 +100,7 @@ (all-the-icons-completion . [(20220409 1204) ((emacs (26 1)) (all-the-icons (5 0))) "Add icons to completion candidates" single ((:commit . "286e2c064a1298be0d8d4100dc91d7a7a554d04a") (:authors ("Itai Y. Efrat ")) (:maintainer "Itai Y. Efrat" . "itai3397@gmail.com") (:keywords "convenient" "lisp") (:url . "https://github.com/iyefrat/all-the-icons-completion"))]) (all-the-icons-dired . [(20220304 1638) ((emacs (24 4)) (all-the-icons (2 2 0))) "Shows icons for each file in dired mode" single ((:commit . "147ed0dfd1034a686795a08dc63e2c293128597e") (:authors ("jtbm37")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "files" "icons" "dired") (:url . "https://github.com/wyuenho/all-the-icons-dired"))]) (all-the-icons-gnus . [(20180511 654) ((emacs (24 4)) (dash (2 12 0)) (all-the-icons (3 1 0))) "Shows icons for in Gnus" single ((:commit . "27f78996da0725943bcfb2d18038e6f7bddfa9c7") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "mail" "tools"))]) - (all-the-icons-ibuffer . [(20220228 1513) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" single ((:commit . "21d5859f1412413f165e0ca44f6002902409a9f9") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ibuffer") (:url . "https://github.com/seagle0128/all-the-icons-ibuffer"))]) + (all-the-icons-ibuffer . [(20220422 1034) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" single ((:commit . "feebb1c2fe6564cc46489e37b7423afec670f3a6") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ibuffer") (:url . "https://github.com/seagle0128/all-the-icons-ibuffer"))]) (all-the-icons-ivy . [(20190508 1803) ((emacs (24 4)) (all-the-icons (2 4 0)) (ivy (0 8 0))) "Shows icons while using ivy and counsel" single ((:commit . "a70cbfa1effe36efc946a823a580cec686d5e88d") (:authors ("asok")) (:maintainer "asok") (:keywords "faces"))]) (all-the-icons-ivy-rich . [(20220411 222) ((emacs (25 1)) (ivy-rich (0 1 0)) (all-the-icons (2 2 0))) "Better experience with icons for ivy" single ((:commit . "b2fc7db5432431e56babb3440c7a4aab8ff0744d") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ivy") (:url . "https://github.com/seagle0128/all-the-icons-ivy-rich"))]) (almost-mono-themes . [(20210306 1040) ((emacs (24))) "Almost monochromatic color themes" tar ((:commit . "6503bf0e5429a51906fb1db94941a4fa678bf9b1") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:keywords "faces") (:url . "https://github.com/cryon/almost-mono-themes"))]) @@ -556,7 +556,7 @@ (cm-mode . [(20170203 2107) ((cl-lib (0 5))) "Minor mode for CriticMarkup" single ((:commit . "276d49c859822265070ae5dfbb403fd7d8d06436") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "markdown"))]) (cmake-font-lock . [(20211224 2006) ((cmake-mode (0 0))) "Advanced, type aware, highlight support for CMake" single ((:commit . "0d6111b36a66013aa9b452e664c93308df3b07e1") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "languages") (:url . "https://github.com/Lindydancer/cmake-font-lock"))]) (cmake-ide . [(20210610 1525) ((emacs (24 4)) (cl-lib (0 5)) (seq (1 11)) (levenshtein (0)) (s (1 11 0))) "Calls CMake to find out include paths and other compiler flags" single ((:commit . "28dc4ab5bd01d99553901b4efeb7234280928b18") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com") (:keywords "languages") (:url . "http://github.com/atilaneves/cmake-ide"))]) - (cmake-mode . [(20220322 1258) ((emacs (24 1))) "major-mode for editing CMake sources" single ((:commit . "7fc013a9229087cbafeb9ff4c96d1d1acb71c5d6"))]) + (cmake-mode . [(20220322 1258) ((emacs (24 1))) "major-mode for editing CMake sources" single ((:commit . "bcd98b5f9846d7b9d2a6518501eb7ac56139665e"))]) (cmake-project . [(20171121 1115) nil "Integrates CMake build process with Emacs" single ((:commit . "a7cf9e4c01c4683e14b6942cc5cc5e8cddc98721") (:authors ("Alexander Lamaison" . "alexander.lamaison@gmail")) (:maintainer "Alexander Lamaison" . "alexander.lamaison@gmail") (:keywords "c" "cmake" "languages" "tools") (:url . "http://github.com/alamaison/emacs-cmake-project"))]) (cmd-to-echo . [(20161203 2133) ((emacs (24 4)) (s (1 11 0)) (shell-split-string (20151224 208))) "Show the output of long-running commands in the echo area" single ((:commit . "e0e874fc0e1ad6d291e39ed76023445297ad438a") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) (cmm-mode . [(20150225 746) nil "Major mode for C-- source code" single ((:commit . "c3ad514dff3eb30434f6b20d953276d4c00de1ee"))]) @@ -687,7 +687,7 @@ (conllu-mode . [(20200501 2328) ((emacs (25)) (cl-lib (0 5)) (flycheck (30)) (hydra (0 13 0)) (s (1 0))) "editing mode for CoNLL-U files" tar ((:commit . "0db3063572b0de08874822e20570bb153747e6ed") (:authors ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com") (:keywords "extensions") (:url . "https://github.com/odanoburu/conllu-mode"))]) (connection . [(20191111 446) nil "TCP-based client connection" single ((:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "network"))]) (constant-theme . [(20180921 1012) ((emacs (24 1))) "A calm, dark, almost monochrome color theme." tar ((:commit . "23543a09729569b566175abe1efbe774048d3fa8") (:authors ("Jannis Pohlmann" . "contact@jannispohlmann.de")) (:maintainer "Jannis Pohlmann" . "contact@jannispohlmann.de") (:keywords "themes") (:url . "https://github.com/jannis/emacs-constant-theme"))]) - (consult . [(20220421 1130) ((emacs (27 1))) "Consulting completing-read" tar ((:commit . "6df330a2856a5d4fc19c865d8839ce64f179bd89") (:authors ("Daniel Mendler and Consult contributors")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/consult"))]) + (consult . [(20220422 1334) ((emacs (27 1))) "Consulting completing-read" tar ((:commit . "d705257e99622d738ec48295eb573f2c686d3757") (:authors ("Daniel Mendler and Consult contributors")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/consult"))]) (consult-company . [(20211021 1152) ((emacs (27 1)) (company (0 9)) (consult (0 9))) "Consult frontend for company" single ((:commit . "ef1c553b4a72b23297b55708bf6f6dd1b27cc68e") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:url . "https://github.com/mohkale/consult-company"))]) (consult-dir . [(20211007 2352) ((emacs (26 1)) (consult (0 9)) (project (0 6 0))) "Insert paths into the minibuffer prompt" single ((:commit . "08f543ae6acbfc1ffe579ba1d00a5414012d5c0b") (:authors ("Karthik Chikmagalur")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") (:keywords "convenience") (:url . "https://github.com/karthink/consult-dir"))]) (consult-eglot . [(20220409 1238) ((emacs (27 1)) (eglot (1 7)) (consult (0 16)) (project (0 3 0))) "A consulting-read interface for eglot" single ((:commit . "0da8801dd8435160ce1f62ad8066bd52e38f5cbd") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "Mohsin Kaleem") (:keywords "tools" "completion" "lsp") (:url . "https://github.com/mohkale/consult-eglot"))]) @@ -814,7 +814,7 @@ (dakrone-theme . [(20170801 1933) nil "dakrone's custom dark theme" single ((:commit . "232ad1be5f3572dcbdf528f1655109aa355a6937") (:authors ("Lee Hinman ")) (:maintainer "Lee Hinman ") (:keywords "color" "themes") (:url . "https://github.com/dakrone/dakrone-theme"))]) (danneskjold-theme . [(20220316 1101) nil "Beautiful high-contrast Emacs theme." tar ((:commit . "054c0b9bc9cefb53a4065096e66707d20885c461") (:authors ("Dmitry Akatov" . "akatovda@yandex.com")) (:maintainer "Dmitry Akatov" . "akatovda@yandex.com") (:url . "https://github.com/rails-to-cosmos/"))]) (dante . [(20210301 1738) ((dash (2 12 0)) (emacs (25 1)) (f (0 19 0)) (flycheck (0 30)) (company (0 9)) (haskell-mode (13 14)) (s (1 11 0)) (lcr (1 0))) "Development mode for Haskell" single ((:commit . "8741419333fb85ed2c1d71f5902688f5201b0a40") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:keywords "haskell" "tools") (:url . "https://github.com/jyp/dante"))]) - (dap-mode . [(20220416 1252) ((emacs (26 1)) (dash (2 18 0)) (lsp-mode (6 0)) (bui (1 1 0)) (f (0 20 0)) (s (1 12 0)) (lsp-treemacs (0 1)) (posframe (0 7 0)) (ht (2 3))) "Debug Adapter Protocol mode" tar ((:commit . "e29d3e6c79356a4c149bb50059cffca7de0ce079") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/dap-mode"))]) + (dap-mode . [(20220416 1252) ((emacs (26 1)) (dash (2 18 0)) (lsp-mode (6 0)) (bui (1 1 0)) (f (0 20 0)) (s (1 12 0)) (lsp-treemacs (0 1)) (posframe (0 7 0)) (ht (2 3))) "Debug Adapter Protocol mode" tar ((:commit . "adc947a1428fe6b4136fcee5e7c73a04b16fb9ed") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/dap-mode"))]) (darcsum . [(20190316 2215) nil "a pcl-cvs like interface for managing darcs patches" single ((:commit . "6a8b690539d133c5e3d17cb23fe4365fbb6fb493") (:authors ("John Wiegley" . "johnw@gnu.org")) (:maintainer "John Wiegley" . "johnw@gnu.org") (:keywords "completion" "convenience" "tools" "vc"))]) (darcula-theme . [(20171227 1845) nil "Inspired by IntelliJ's Darcula theme" single ((:commit . "d9b82b58ded9014985be6658f4ab17e26ed9e93e") (:authors ("Sam Halliday" . "Sam.Halliday@gmail.com")) (:maintainer "Sam Halliday" . "Sam.Halliday@gmail.com") (:keywords "faces") (:url . "https://gitlab.com/fommil/emacs-darcula-theme"))]) (dark-krystal-theme . [(20170808 1300) ((emacs (24 0))) "an Emacs 24 theme based on Dark Krystal (tmTheme)" single ((:commit . "79084b99665dc9ffb0ec62cc092349a5ecebebbc") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) @@ -886,7 +886,7 @@ (dictcc . [(20220219 1302) ((emacs (24 4)) (cl-lib (0 5)) (ivy (0 10 0))) "Look up translations on dict.cc" single ((:commit . "8ecb954fcf193cba138191f8947c8b0b60a1c6c5") (:authors ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainer "Marten Lienen" . "marten.lienen@gmail.com") (:keywords "convenience"))]) (dictionary . [(20201001 1727) ((connection (1 11)) (link (1 11))) "Client for rfc2229 dictionary servers" single ((:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "interface" "dictionary"))]) (didyoumean . [(20200905 1843) ((emacs (24 4))) "Did you mean to open another file?" single ((:commit . "ce5edcce160b86e7f6480f0381be785d43f97e19") (:keywords "convenience") (:url . "https://gitlab.com/kisaragi-hiu/didyoumean.el"))]) - (diff-ansi . [(20220323 106) ((emacs (27 1))) "Display diff's using alternative diffing tools" single ((:commit . "39b39a7265c59e413ff32f1fccebe4dc1a7a966e") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-ansi"))]) + (diff-ansi . [(20220422 647) ((emacs (27 1))) "Display diff's using alternative diffing tools" single ((:commit . "f47e62503d77dbcadb36e9d3d0ede9242536fa89") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-ansi"))]) (diff-at-point . [(20220211 548) ((emacs (26 2))) "Diff navigation" single ((:commit . "819da8d75762e1fb1a975d78c2b4666506048485") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-at-point"))]) (diff-hl . [(20220405 2359) ((cl-lib (0 2)) (emacs (25 1))) "Highlight uncommitted changes using VC" tar ((:commit . "9d5dc2ffa1e4c7b43734b03dccb5ae6a80800569") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "vc" "diff") (:url . "https://github.com/dgutov/diff-hl"))]) (difflib . [(20210224 2242) ((emacs (24 4)) (cl-generic (0 3)) (ht (2 2)) (s (1 12 0))) "Helpers for computing deltas between sequences." single ((:commit . "646fc4388274fe765bbf4661e17a24e4d081250c") (:authors ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainer "Diego A. Mundo" . "dieggsy@pm.me") (:keywords "matching" "tools" "string") (:url . "http://github.com/dieggsy/difflib.el"))]) @@ -949,7 +949,7 @@ (direx-grep . [(20140515 1506) ((direx (0 1 -3))) "Grep node of direx.el using incremental search like anything.el/helm.el" single ((:commit . "1109a512a80b2673a70b18b8568514049017faad") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/direx-grep"))]) (dirtree . [(20140129 832) ((tree-mode (1 1 1 1)) (windata (0))) "Directory tree views" single ((:commit . "ba55f1e716e386fdd37cb8e7f48616e405dc7251") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com"))]) (dirtree-prosjekt . [(20140129 904) ((prosjekt (0 3)) (dirtree (0 1))) "dirtree integration for prosjekt." single ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))]) - (dirvish . [(20220420 1321) ((emacs (27 1))) "A modern file manager based on dired mode" tar ((:commit . "7a0e47365482700bce2884790c2970b493776838") (:authors ("Alex Lu ")) (:maintainer "Alex Lu ") (:keywords "files" "convenience") (:url . "https://github.com/alexluigit/dirvish"))]) + (dirvish . [(20220422 330) ((emacs (27 1))) "A modern file manager based on dired mode" tar ((:commit . "a7f3759a2dd5333e0bd8def3a73fb9b681b77374") (:authors ("Alex Lu ")) (:maintainer "Alex Lu ") (:keywords "files" "convenience") (:url . "https://github.com/alexluigit/dirvish"))]) (disable-mouse . [(20210512 2114) ((emacs (24 1))) "Disable mouse commands globally" single ((:commit . "cae3be9dd012727b40ad3b511731191f79cebe42") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "mouse") (:url . "https://github.com/purcell/disable-mouse"))]) (disaster . [(20171016 2152) nil "Disassemble C/C++ code under cursor in Emacs" single ((:commit . "10a785facc60d89d78e0d5177985ab1af1741bb4") (:authors ("Justine Tunney" . "jtunney@gmail.com")) (:maintainer "Justine Tunney" . "jtunney@gmail.com") (:keywords "tools") (:url . "https://github.com/jart/disaster"))]) (discourse . [(20160911 819) ((cl-lib (0 5)) (request (0 2)) (s (1 11 0))) "discourse api" single ((:commit . "a86c7e608851e186fe12e892a573994f08c8e65e") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "discourse") (:url . "https://github.com/lujun9972/discourse-api"))]) @@ -1036,7 +1036,7 @@ (dumb-diff . [(20171211 2122) ((emacs (24 3))) "fast arbitrary diffs" single ((:commit . "1a2331d283049b71a07c1b06b1e0627a950d55f4") (:authors ("jack angers")) (:maintainer "jack angers") (:keywords "programming" "diff"))]) (dumb-jump . [(20211018 1545) ((emacs (24 3)) (s (1 11 0)) (dash (2 9 0)) (popup (0 5 3))) "Jump to definition for 50+ languages without configuration" single ((:commit . "dbb915441a2b66f2fbb954ff5de2723c5a4771d4") (:authors ("jack angers and contributors")) (:maintainer "jack angers and contributors") (:keywords "programming") (:url . "https://github.com/jacktasia/dumb-jump"))]) (dummyparens . [(20141009 1024) nil "parenthesis auto-pairing and wrapping" single ((:commit . "9798ef1d0eaa24e4fe66f8aa6022a8c62714cc89") (:authors ("Sergei Nosov ")) (:maintainer "Sergei Nosov ") (:keywords "dummyparens" "auto-pair" "wrapping") (:url . "https://github.com/snosov1/dummyparens"))]) - (dune . [(20210909 1010) nil "Integration with the dune build system" tar ((:commit . "e9cb2d66abb690b7a5585d293793a7e020762e00") (:url . "https://github.com/ocaml/dune"))]) + (dune . [(20210909 1010) nil "Integration with the dune build system" tar ((:commit . "c63c9898e651e5505f965c3a48dd4089b8d88d9a") (:url . "https://github.com/ocaml/dune"))]) (dune-format . [(20210505 108) ((reformatter (0 6)) (emacs (24 1))) "Reformat OCaml's dune files automatically" single ((:commit . "196f16a01f4c855de7becddbc4cfed2f6788693a") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/emacs-dune-format"))]) (duplicate-thing . [(20181031 1500) nil "Duplicate current line & selection" single ((:commit . "9d8fd05e3e5caa35d3f2a0c0032c92f0c0908e21") (:authors ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "convenience" "command" "duplicate" "line" "selection") (:url . "https://github.com/ongaeshi/duplicate-thing"))]) (dut-mode . [(20170729 2111) ((emacs (24))) "Major mode for the Dut programming language" single ((:commit . "9235c7acaa6690942e9de8b7acd1e4be0c859dc1") (:authors ("The dut-mode Authors")) (:maintainer "The dut-mode Authors") (:keywords "languages" "gut") (:url . "https://github.com/dut-lang/dut-mode"))]) @@ -1232,7 +1232,7 @@ (embrace . [(20171031 1833) ((cl-lib (0 5)) (expand-region (0 10 0))) "Add/Change/Delete pairs based on `expand-region'" single ((:commit . "dd5da196e5bcc5e6d87e1937eca0c21da4334ef2") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) (emidje . [(20190209 1726) ((emacs (25)) (cider (0 17 0)) (seq (2 16)) (magit-popup (2 4 0))) "Test runner and report viewer for Midje" single ((:commit . "7e92f053964d925c97dc8cca8d4d70a3030021db") (:authors ("Alan Ghelardi" . "alan.ghelardi@nubank.com.br")) (:maintainer "Alan Ghelardi" . "alan.ghelardi@nubank.com.br") (:keywords "tools") (:url . "https://github.com/nubank/emidje"))]) (emmet-mode . [(20210820 1124) nil "Unofficial Emmet's support for emacs" single ((:commit . "6b2e554f7fd27f732810f4b14ea01e3c54b7b3da") (:authors ("Shin Aoyama" . "smihica@gmail.com")) (:maintainer "Shin Aoyama" . "smihica@gmail.com") (:keywords "convenience") (:url . "https://github.com/smihica/emmet-mode"))]) - (emms . [(20220315 1727) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) "The Emacs Multimedia System" tar ((:commit . "dd1ee74db3325d6a27e14df7ae882b5cbd84989a") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:url . "https://www.gnu.org/software/emms/"))]) + (emms . [(20220422 1318) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) "The Emacs Multimedia System" tar ((:commit . "22f3d9e5359c565b33f55715f90fbde35e4f675e") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:url . "https://www.gnu.org/software/emms/"))]) (emms-bilibili . [(20180103 418) ((emacs (25)) (cl-lib (0 5))) "Play Bilibili in EMMS." single ((:commit . "294bca3dfc42fe3a55fb326ab39bc0fcfc8c5090") (:keywords "emms" "bilibili") (:url . "https://github.com/stardiviner/emms-bilibili"))]) (emms-info-mediainfo . [(20131223 1300) ((emms (0))) "Info-method for EMMS using medianfo" single ((:commit . "bce16eae9eacd38719fea62a9755225a888da59d") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org") (:keywords "multimedia" "processes"))]) (emms-mark-ext . [(20130529 327) ((emms (3 0))) "Extra functions for emms-mark-mode and emms-tag-edit-mode" single ((:commit . "ec68129e3e9e469e5bf160c6a1b7030e322f3541") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "convenience" "multimedia") (:url . "https://github.com/vapniks/emms-mark-ext"))]) @@ -1294,7 +1294,7 @@ (ergoemacs-mode . [(20220411 338) ((emacs (24 1)) (cl-lib (0 5))) "Emacs mode based on common modern interface and ergonomics." tar ((:commit . "9cd89eef490f6c9f4af273bb3dd2c68d5ed2de61") (:authors ("Xah Lee" . "xah@xahlee.org") ("David Capello" . "davidcapello@gmail.com") ("Matthew L. Fidler" . "matthew.fidler@gmail.com") ("Kim F. Storm" . "storm@cua.dk")) (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com") (:keywords "convenience") (:url . "https://github.com/ergoemacs/ergoemacs-mode"))]) (ergoemacs-status . [(20160318 538) ((powerline (2 3)) (mode-icons (0 1 0))) "Adaptive Status Bar / Mode Line" single ((:commit . "d952cc2361adf6eb4d6af60950ad4ab699c81320") (:authors ("Matthew Fidler")) (:maintainer "Matthew Fidler"))]) (eri . [(20200914 644) nil "Enhanced relative indentation (eri)" single ((:commit . "505464961f07f0991263708fd8cbf5f7ad12f53f") (:url . "https://github.com/agda/agda"))]) - (erlang . [(20220215 1844) ((emacs (24 1))) "Erlang major mode" tar ((:commit . "a06b5233c254003e19544c1f5f5d00802884eb0d") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "erlang" "languages" "processes"))]) + (erlang . [(20220215 1844) ((emacs (24 1))) "Erlang major mode" tar ((:commit . "a7b98023a770dae237c6733ef4b287f29615f6bb") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "erlang" "languages" "processes"))]) (erlstack-mode . [(20210419 1917) ((emacs (25 1)) (dash (2 12 0))) "Minor mode for analysing Erlang stacktraces" single ((:commit . "ca264bca24cdaa8b2bac57882716f03f633e42b0") (:authors ("k32")) (:maintainer "k32") (:keywords "tools" "erlang") (:url . "https://github.com/k32/erlstack-mode"))]) (eros . [(20180415 618) ((emacs (24 4))) "Evaluation Result OverlayS for Emacs Lisp" single ((:commit . "dd8910279226259e100dab798b073a52f9b4233a") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "convenience" "lisp") (:url . "https://github.com/xiongtx/eros"))]) (ert-async . [(20200105 1031) ((emacs (24 1))) "Async support for ERT" single ((:commit . "948cf2faa10e085bda3739034ca5ea1912893433") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "lisp" "test") (:url . "http://github.com/rejeep/ert-async.el"))]) @@ -1419,7 +1419,7 @@ (evil-surround . [(20220412 1724) ((evil (1 2 12))) "emulate surround.vim from Vim" single ((:commit . "2bc8aa6425f1311e985cf51ea6b5233c1ee6ce1c") (:authors ("Tim Harper ") ("Vegard Øye ")) (:maintainer "Tim Harper ") (:keywords "emulation" "vi" "evil"))]) (evil-swap-keys . [(20191105 1426) ((emacs (24 4))) "Intelligently swap keys on text input with evil" single ((:commit . "b5ef105499f998b5667da40da30c073229a213ea") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "data" "languages" "tools") (:url . "https://github.com/wbolster/evil-swap-keys"))]) (evil-tabs . [(20160217 1520) ((evil (0 0 0)) (elscreen (0 0 0))) "Integrating Vim-style tabs for Evil mode users." single ((:commit . "53d3314a810017b6056ab6796aef671f5ea1c063") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:keywords "evil" "tab" "tabs" "vim") (:url . "https://github.com/krisajenkins/evil-tabs"))]) - (evil-terminal-cursor-changer . [(20211225 600) ((evil (1 0 8))) "Change cursor shape and color by evil state in terminal" single ((:commit . "3d7db4d6b4a3121ffd7e505b12ea94fcdb8c5df8") (:authors ("7696122")) (:maintainer "7696122") (:keywords "evil" "terminal" "cursor") (:url . "https://github.com/7696122/evil-terminal-cursor-changer"))]) + (evil-terminal-cursor-changer . [(20220422 255) ((evil (1 0 8))) "Change cursor shape and color by evil state in terminal" single ((:commit . "69d562932f9ab9869ab1ed923e9789cbfa0ff14c") (:authors ("7696122")) (:maintainer "7696122") (:keywords "evil" "terminal" "cursor") (:url . "https://github.com/7696122/evil-terminal-cursor-changer"))]) (evil-test-helpers . [(20201008 1515) ((evil (1 14 0))) "unit test helpers for Evil" single ((:commit . "6fa371222f5d56cf96103aa301da8bcbf6c15cc2") (:authors ("Vegard Øye ")) (:maintainer "Vegard Øye "))]) (evil-tex . [(20220415 842) ((emacs (26 1)) (evil (1 0)) (auctex (11 88))) "Useful features for editing LaTeX in evil-mode" single ((:commit . "26035ec9a09f8b38ce0d495ff788e83ec8b195d5") (:keywords "tex" "emulation" "vi" "evil" "wp") (:url . "https://github.com/iyefrat/evil-tex"))]) (evil-text-object-python . [(20191010 1328) ((emacs (25)) (evil (1 2 14)) (dash (2 16 0))) "Python specific evil text objects" single ((:commit . "39d22fc524f0413763f291267eaab7f4e7984318") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/wbolster/evil-text-object-python"))]) @@ -2066,7 +2066,7 @@ (hcl-mode . [(20200315 2129) ((emacs (24 3))) "Major mode for Hashicorp" single ((:commit . "e4d9eef631e8a386341ae8f94f7c2579586e65b5") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/emacs-hcl-mode"))]) (headlong . [(20150417 1526) nil "reckless completion" single ((:commit . "f6830f87f236eee88263cb6976125f72422abe72") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "completion") (:url . "https://github.com/abo-abo/headlong"))]) (heaven-and-hell . [(20190713 1830) ((emacs (24 4))) "easy toggle light/dark themes" single ((:commit . "e1febfd60d060c110a1e43c5f093cd8537251308") (:authors ("Valentin Ignatev" . "valentignatev@gmail.com")) (:maintainer "Valentin Ignatev" . "valentignatev@gmail.com") (:keywords "faces") (:url . "https://github.com/valignatev/heaven-and-hell"))]) - (helm . [(20220421 806) ((helm-core (3 8 4)) (popup (0 5 3))) "Helm is an Emacs incremental and narrowing framework" tar ((:commit . "24cc8959fbcab17fb5ce1e71ead8fd30950014bb") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))]) + (helm . [(20220421 806) ((helm-core (3 8 4)) (popup (0 5 3))) "Helm is an Emacs incremental and narrowing framework" tar ((:commit . "7ff0b93b79117babeb5262b2f0754005b6d050ad") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))]) (helm-R . [(20120820 14) ((helm (20120517)) (ess (20120509))) "helm-sources and some utilities for GNU R." single ((:commit . "b0eb9d5f6a483a9dbe6eb6cf1f2024d4f5938bc2") (:authors ("myuhe ")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/helm-R.el"))]) (helm-ack . [(20141030 1226) ((helm (1 0)) (cl-lib (0 5))) "Ack command with helm interface" single ((:commit . "889bc225318d14c6e3be80e73b1d9d6fb30e48c3") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-ack"))]) (helm-ad . [(20151209 1015) ((dash (2 8 0)) (helm (1 6 2))) "helm source for Active Directory" single ((:commit . "8ac044705d8620ee354a9cfa8cc1b865e83c0d55") (:authors ("Takahiro Noda" . "takahiro.noda+github@gmail.com")) (:maintainer "Takahiro Noda" . "takahiro.noda+github@gmail.com") (:keywords "comm"))]) @@ -2101,7 +2101,7 @@ (helm-codesearch . [(20190412 1153) ((emacs (25 1)) (s (1 11 0)) (dash (2 12 0)) (helm (1 7 7)) (cl-lib (0 5))) "helm interface for codesearch" single ((:commit . "72f1d1de746115ab7e861178b49fa3c0b6b58d90") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com") (:keywords "tools"))]) (helm-commandlinefu . [(20150611 545) ((emacs (24 1)) (helm (1 7 0)) (json (1 3)) (let-alist (1 0 3))) "Search and browse commandlinefu.com from helm" single ((:commit . "9ee7e018c5db23ae9c8d1c8fa969876f15b7280d") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "commandlinefu.com") (:url . "https://github.com/xuchunyang/helm-commandlinefu"))]) (helm-company . [(20190812 1429) ((helm (1 5 9)) (company (0 6 13))) "Helm interface for company-mode" single ((:commit . "6eb5c2d730a60e394e005b47c1db018697094dde") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Daniel Ralston" . "Sodel-the-Vociferous@users.noreply.github.com") (:url . "https://github.com/Sodel-the-Vociferous/helm-company"))]) - (helm-core . [(20220421 733) ((emacs (25 1)) (async (1 9 4))) "Development files for Helm" tar ((:commit . "24cc8959fbcab17fb5ce1e71ead8fd30950014bb") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))]) + (helm-core . [(20220422 706) ((emacs (25 1)) (async (1 9 4))) "Development files for Helm" tar ((:commit . "7ff0b93b79117babeb5262b2f0754005b6d050ad") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://emacs-helm.github.io/helm/"))]) (helm-cscope . [(20190615 41) ((xcscope (1 0)) (helm (1 6 7)) (cl-lib (0 5)) (emacs (24 1))) "Helm interface for xcscope.el." single ((:commit . "af1d9e7f4460a88d7400b5a74d5da68084089ac1") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com") (:keywords "cscope" "helm") (:url . "https://github.com/alpha22jp/helm-cscope.el"))]) (helm-css-scss . [(20191230 1549) ((emacs (24 3)) (helm (1 0))) "CSS/SCSS/LESS Selectors with helm interface" single ((:commit . "48b996f73af1fef8d6e88a1c545d98f8c50b0cf3") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "convenience" "scss" "css" "less" "selector" "helm") (:url . "https://github.com/ShingoFukuyama/helm-css-scss"))]) (helm-ctest . [(20191031 1435) ((s (1 9 0)) (dash (2 11 0)) (helm-core (1 7 4))) "Run ctest from within emacs" single ((:commit . "2a29cfb4ec583da247fa2ae7bac88790b1223e40") (:authors ("Dan LaManna" . "me@danlamanna.com")) (:maintainer "Dan LaManna" . "me@danlamanna.com") (:keywords "helm" "ctest"))]) @@ -2303,7 +2303,7 @@ (hl-block-mode . [(20220211 548) ((emacs (26 1))) "Highlighting nested blocks" single ((:commit . "3dd29cfbf24fec16eaf3d47936338adb6b34f5c8") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-hl-block-mode"))]) (hl-fill-column . [(20200607 757) ((names (0 5)) (emacs (24))) "Highlight fill column." single ((:commit . "5782a91ba0182c4e562fa0db6379ff9dd472856b") (:keywords "fill column" "faces") (:url . "https://github.com/laishulu/hl-fill-column"))]) (hl-indent . [(20170429 2104) ((emacs (24)) (cl-lib (0 5))) "Highlight irregular indentation." single ((:commit . "bdb2e0177a7c8b29af26998e688b856adc6ded93") (:authors ("Kirill Ignatiev ")) (:maintainer "Kirill Ignatiev ") (:keywords "convenience" "faces") (:url . "https://github.com/ikirill/hl-indent"))]) - (hl-prog-extra . [(20220324 16) ((emacs (26 2))) "Customizable highlighting for source-code" tar ((:commit . "3312497ddfc7b7bc0e773ae98fc02477a4b0c7a0") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-hl-prog-extra"))]) + (hl-prog-extra . [(20220422 541) ((emacs (26 2))) "Customizable highlighting for source-code" tar ((:commit . "40905568a040c1050941275cc9b970a45b77eb90") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-hl-prog-extra"))]) (hl-sentence . [(20171018 1519) nil "highlight a sentence based on customizable face" single ((:commit . "86ae38d3103bd20da5485cbdd59dfbd396c45ee4") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "highlighting") (:url . "http://github.com/milkypostman/hl-sentence"))]) (hl-todo . [(20220419 1930) ((emacs (25))) "highlight TODO and similar keywords" single ((:commit . "d2f7a9b261a52e3c04c8d677165136a306f0aed3") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/hl-todo"))]) (hledger-mode . [(20210706 1225) ((emacs (24 4)) (popup (0 5 3)) (async (1 9)) (htmlize (1 47))) "A mode for writing journal entries for hledger." tar ((:commit . "9ac07ff0adbce6a402c17e789b1750f9da0d22f4") (:authors ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainer "Narendra Joshi" . "narendraj9@gmail.com") (:keywords "data") (:url . "https://github.com/narendraj9/hledger-mode.git"))]) @@ -2633,7 +2633,7 @@ (kanban . [(20170418 810) nil "Parse org-todo headlines to use org-tables as Kanban tables" single ((:commit . "fcf0173ce0144e59de97ba8a7808192620e5f8f4") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de") (:keywords "outlines" "convenience"))]) (kanji-mode . [(20160826 1139) nil "View stroke order for kanji characters at cursor" tar ((:commit . "eda4f8666486689d36317db7dbda54fb73d3e3d2") (:authors ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainer "Wojciech Gac" . "wojciech.s.gac@gmail.com") (:url . "http://github.com/wsgac/kanji-mode "))]) (kaocha-runner . [(20190904 1950) ((emacs (26)) (s (1 4 0)) (cider (0 21 0)) (parseedn (0 1 0))) "A package for running Kaocha tests via CIDER." single ((:commit . "755b0dfb3bd676c769c4b4aeb81c2cd5828bd207") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:url . "https://github.com/magnars/kaocha-runner.el"))]) - (kaolin-themes . [(20220413 1705) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:commit . "bd37ae6e48d918e9d72513345903093239a8ad8d") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:url . "https://github.com/ogdenwebb/emacs-kaolin-themes"))]) + (kaolin-themes . [(20220422 1305) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:commit . "51b1f719bc300a4f684b6dc7511dfb044f75f575") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:url . "https://github.com/ogdenwebb/emacs-kaolin-themes"))]) (kaomoji . [(20171227 440) ((emacs (24 3)) (helm-core (1 9 1))) "Input kaomoji superb easily" tar ((:commit . "90a1490743b2a30762f5454c9d9309018eff83dd") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:keywords "tools" "fun") (:url . "https://github.com/kuanyui/kaomoji.el"))]) (kapacitor . [(20190414 1908) ((emacs (25 1)) (magit (2 13 0)) (magit-popup (2 12 4))) "Main file for kapacitor-mode" single ((:commit . "e3300d8b4017a2f66b0d929cb85bcc7ee2612072") (:authors ("Manoj Kumar Manikchand" . "manojm.321@gmail.com")) (:maintainer "Manoj Kumar Manikchand" . "manojm.321@gmail.com") (:keywords "kapacitor" "emacs" "magit" "tools") (:url . "http://github.com/Manoj321/kapacitor-el"))]) (karma . [(20160220 1245) ((pkg-info (0 4)) (emacs (24))) "Karma Test Runner Emacs Integration" single ((:commit . "31d3e7708246183d7ed0686be92bf23140af348c") (:authors ("Samuel Tonini")) (:maintainer "Samuel Tonini") (:keywords "language" "javascript" "js" "karma" "testing") (:url . "http://github.com/tonini/karma.el"))]) @@ -2857,7 +2857,7 @@ (lsp-latex . [(20210815 1426) ((emacs (25 1)) (lsp-mode (6 0))) "LSP-mode client for LaTeX, on texlab" single ((:commit . "3f6b2ac9585682828eef81f895757f74cfba7309") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "languages" "tex") (:url . "https://github.com/ROCKTAKEY/lsp-latex"))]) (lsp-ltex . [(20220222 656) ((emacs (26 1)) (lsp-mode (6 1))) "LSP Clients for LTEX" single ((:commit . "e13bedf0032d376e1e28026abda5970bbbdb636d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-languagetool/lsp-ltex"))]) (lsp-metals . [(20220330 1958) ((emacs (26 1)) (scala-mode (1 1)) (lsp-mode (7 0)) (lsp-treemacs (0 2)) (dap-mode (0 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5))) "Scala Client settings" tar ((:commit . "b7f77de69431786c54e9a57845e4f2d75fbee053") (:authors ("Ross A. Baker" . "ross@rossabaker.com") ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainer "Ross A. Baker" . "ross@rossabaker.com") (:keywords "languages" "extensions") (:url . "https://github.com/emacs-lsp/lsp-metals"))]) - (lsp-mode . [(20220421 1428) ((emacs (26 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0))) "LSP mode" tar ((:commit . "d230fd1170ead71276bd5b7a2fc5072fea8fc933") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-mode"))]) + (lsp-mode . [(20220421 1428) ((emacs (26 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0))) "LSP mode" tar ((:commit . "624e9f33876f36f1a4c3d1525a0ae4b36d295fcb") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-mode"))]) (lsp-mssql . [(20191204 1150) ((emacs (25 1)) (lsp-mode (6 2)) (dash (2 14 1)) (f (0 20 0)) (ht (2 0)) (lsp-treemacs (0 1))) "MSSQL LSP bindings" tar ((:commit . "88319a61a06e27fc1d3ea2e7b853ec1692b4c166") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "data" "languages") (:url . "https://github.com/emacs-lsp/lsp-mssql"))]) (lsp-origami . [(20211016 1045) ((origami (1 0)) (lsp-mode (6 1))) "origami.el support for lsp-mode" single ((:commit . "5b88ab77dc2696c93fa5dd9debe183821c533b71") (:authors ("Vibhav Pant")) (:maintainer "Vibhav Pant") (:keywords "languages" "lsp-mode") (:url . "https://github.com/emacs-lsp/lsp-origami"))]) (lsp-p4 . [(20190127 1049) ((lsp-mode (3 0))) "P4 support for lsp-mode" tar ((:commit . "669460d93b87fb876df11b2b68229677e7ad1a26") (:authors ("Dmitri Makarov")) (:maintainer "Dmitri Makarov") (:keywords "lsp" "p4") (:url . "https://github.com/dmakarov/p4ls"))]) @@ -2892,11 +2892,11 @@ (mag-menu . [(20150505 1850) ((splitter (0 1 0))) "Intuitive keyboard-centric menu system" single ((:commit . "9b9277021cd09fb1dba64b1d2a00705d20914bd6") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:keywords "convenience") (:url . "https://github.com/chumpage/mag-menu"))]) (magic-filetype . [(20180219 1552) ((emacs (24)) (s (1 9 0))) "Enhance filetype major mode" single ((:commit . "019494add5ff02dd36cb3f500142fc51125522cc") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "emulations" "vim" "ft" "file" "magic-mode") (:url . "https://github.com/zonuexe/magic-filetype.el"))]) (magic-latex-buffer . [(20210306 422) ((cl-lib (0 5)) (emacs (25 1))) "Magically enhance LaTeX-mode font-locking for semi-WYSIWYG editing" single ((:commit . "903ec91872760e47c0e5715795f8465173615098") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.github.io/"))]) - (magik-mode . [(20220408 1250) nil "mode for editing Magik + some utils." tar ((:commit . "9c0faba222afc875cf604dd7fe4265f1ff891535") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))]) + (magik-mode . [(20220422 837) nil "mode for editing Magik + some utils." tar ((:commit . "af1b83786c95d448dcb4df5406eb1cdba975abf5") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))]) (magit . [(20220412 2029) ((emacs (25 1)) (dash (20210826)) (git-commit (20220222)) (magit-section (20220325)) (transient (20220325)) (with-editor (20220318))) "A Git porcelain inside Emacs." tar ((:commit . "3cfc8458e14c705afdfbeb7dcd3d3f43d7479344") (:authors ("Marius Vollmer" . "marius.vollmer@gmail.com") ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/magit"))]) (magit-annex . [(20220302 1725) ((cl-lib (0 3)) (magit (3 0 0))) "Control git-annex from Magit" single ((:commit . "efe484644666c6b7c544b0fb7b87e30703fa9425") (:authors ("Kyle Meyer" . "kyle@kyleam.com") ("Rémi Vanicat" . "vanicat@debian.org")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-annex"))]) (magit-circleci . [(20191209 2113) ((dash (2 16 0)) (transient (0 1 0)) (magit (2 90 0)) (emacs (25 3))) "CircleCI integration for Magit" single ((:commit . "2d4bdacf498ed3ff7d2c3574d346b2d24cbb12da") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "circleci" "continuous" "integration" "magit" "vc" "tools") (:url . "https://github.com/abrochard/magit-circleci"))]) - (magit-commit-mark . [(20220422 10) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" single ((:commit . "f794b45efcbbaab28d968b3616900dd4370ea030") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-magit-commit-mark"))]) + (magit-commit-mark . [(20220422 705) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" single ((:commit . "2a4d08ac816734fc8195f86f685443e58e63da06") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-magit-commit-mark"))]) (magit-delta . [(20220125 50) ((emacs (25 1)) (magit (20200426)) (xterm-color (2 0))) "Use Delta when displaying diffs in Magit" single ((:commit . "5fc7dbddcfacfe46d3fd876172ad02a9ab6ac616") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com") (:url . "https://github.com/dandavison/magit-delta"))]) (magit-diff-flycheck . [(20190524 551) ((magit (2)) (flycheck (31)) (seq (2)) (emacs (25 1))) "Report errors in diffs" single ((:commit . "28acf74f59e385865746cccf4b1e4c4025ae9433") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com") (:keywords "convenience" "matching") (:url . "https://github.com/ragone/magit-diff-flycheck"))]) (magit-filenotify . [(20151116 2340) ((magit (1 3 0)) (emacs (24 4))) "Refresh status buffer when git tree changes" single ((:commit . "c0865b3c41af20b6cd89de23d3b0beb54c8401a4") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.de") (:keywords "tools"))]) @@ -3059,7 +3059,7 @@ (modern-sh . [(20211101 1001) ((emacs (25 1)) (hydra (0 15 0)) (eval-in-repl (0 9 7))) "Minor mode for editing shell script" single ((:commit . "8ebebe77304aa8170f7af809e7564c79d3bd45da") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/modern-sh"))]) (modtime-skip-mode . [(20140128 2201) nil "Minor mode for disabling modtime and supersession checks on files." single ((:commit . "c0e49523aa26b2263a8693691ac775988015f592") (:authors ("Jordon Biondo" . "biondoj@mail.gvsu.edu")) (:maintainer "Jordon Biondo" . "biondoj@mail.gvsu.edu") (:url . "http://www.github.com/jordonbiondo/modtime-skip-mode"))]) (modular-config . [(20210726 1614) ((emacs (25 1))) "Organize your config into small and loadable modules" single ((:commit . "2bd77193fa3a7ec0541db284b4034821a8f59fea") (:authors ("Sidharth Arya" . "sidhartharya10@gmail.com")) (:maintainer "Sidharth Arya" . "sidhartharya10@gmail.com") (:keywords "startup" "lisp" "tools") (:url . "https://github.com/SidharthArya/modular-config.el"))]) - (modus-themes . [(20220421 1021) ((emacs (27 1))) "Elegant, highly legible and customizable themes" tar ((:commit . "e8f1b8997466e244d9aa1a11b7ffaa4b70419874") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:keywords "faces" "theme" "accessibility") (:url . "https://git.sr.ht/~protesilaos/modus-themes"))]) + (modus-themes . [(20220422 552) ((emacs (27 1))) "Elegant, highly legible and customizable themes" tar ((:commit . "a1752787db94b398a9f120c5f5e24fdf0c82e77b") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:keywords "faces" "theme" "accessibility") (:url . "https://git.sr.ht/~protesilaos/modus-themes"))]) (moe-theme . [(20220111 1220) nil "A colorful eye-candy theme. Moe, moe, kyun!" tar ((:commit . "edf3fe47fb986e283e3b04cba443dcb39fe8720e") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com") (:keywords "themes") (:url . "https://github.com/kuanyui/moe-theme.el"))]) (molar-mass . [(20210519 1342) ((emacs (24 3))) "Calculates molar mass of a molecule" single ((:commit . "838db1486a2dc5a3774eb195d62fbcdef71a63f7") (:authors ("Sergi Ruiz Trepat")) (:maintainer "Sergi Ruiz Trepat") (:keywords "convenience" "chemistry") (:url . "https://github.com/sergiruiztrepat/molar-mass.el"))]) (molecule . [(20180527 743) ((emacs (25 1))) "Simple wrapper for molecule" single ((:commit . "2ef72b81d9aa24ea782b71a061a3abdad6cae162") (:authors (": drymer ")) (:maintainer ": drymer ") (:keywords ":" "languages" "terminals") (:url . "https://git.daemons.it/drymer/molecule.el"))]) @@ -3204,7 +3204,7 @@ (nix-buffer . [(20180212 1518) ((f (0 17 3)) (emacs (24 4))) "Set up buffer environments with nix" single ((:commit . "db57cda36e7477bdc7ef5a136357b971b1d4d099") (:authors ("Shea Levy")) (:maintainer "Shea Levy") (:url . "https://github.com/shlevy/nix-buffer/tree/master/"))]) (nix-env-install . [(20200812 1305) ((emacs (25 1))) "Install packages using nix-env" single ((:commit . "79c34bc117ba1cebeb67fab32c364951d2ec37a0") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "processes" "tools") (:url . "https://github.com/akirak/nix-env-install"))]) (nix-haskell-mode . [(20190615 135) ((emacs (25)) (haskell-mode (16 0)) (nix-mode (1 3 0))) "haskell-mode integrations for Nix" single ((:commit . "68efbcbf949a706ecca6409506968ed2ef928a20") (:authors ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "haskell" "languages" "processes") (:url . "https://github.com/matthewbauer/nix-haskell"))]) - (nix-mode . [(20220228 1520) ((emacs (25 1)) (magit-section (0)) (transient (0 3))) "Major mode for editing .nix files" tar ((:commit . "20ee8d88900b169831d6b0783bd82d2625e940c7") (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "languages" "tools" "unix") (:url . "https://github.com/NixOS/nix-mode"))]) + (nix-mode . [(20220422 451) ((emacs (25 1)) (magit-section (0)) (transient (0 3))) "Major mode for editing .nix files" tar ((:commit . "66206cab276c0f4d1c84e77ba2a67ed6a46b2d9c") (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "languages" "tools" "unix") (:url . "https://github.com/NixOS/nix-mode"))]) (nix-modeline . [(20210405 742) ((emacs (25 1))) "Info about in-progress Nix evaluations on your modeline" single ((:commit . "ecda866b960321bb82deac26af45918e172ef0ba") (:authors ("Jordan Mulcahey" . "snhjordy@gmail.com")) (:maintainer "Jordan Mulcahey" . "snhjordy@gmail.com") (:keywords "processes" "unix" "tools") (:url . "https://github.com/ocelot-project/nix-modeline"))]) (nix-sandbox . [(20210325 1622) ((dash (2 12 1)) (s (1 10 0))) "Utility functions to work with nix-shell sandboxes" single ((:commit . "053a2d5110ce05b7f99bcc2ac4804b70cbe87916") (:authors ("Sven Keidel" . "svenkeidel@gmail.com")) (:maintainer "Sven Keidel" . "svenkeidel@gmail.com") (:url . "https://github.com/travisbhartwell/nix-emacs"))]) (nix-update . [(20190124 1935) ((emacs (25))) "Update \"fetch\" blocks in .nix expressions" single ((:commit . "fc6c39c2da3fcfa62f4796816c084a6389c8b6e7") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "nix") (:url . "https://github.com/jwiegley/nix-update-el"))]) @@ -3285,7 +3285,7 @@ (ob-dart . [(20170106 1624) nil "org-babel functions for Dart evaluation" single ((:commit . "04d63b922a5469506560ca0c00678e57131e0269") (:authors ("Milan Zimmermann")) (:maintainer "Milan Zimmermann") (:keywords "literate programming" "reproducible research" "emacs" "org" "babel" "dart") (:url . "http://github.org/mzimmerm/ob-dart"))]) (ob-deno . [(20201019 101) ((emacs (26 1))) "Babel Functions for Javascript/TypeScript with Deno" single ((:commit . "f1129d20fe9931f1c0b62c4af781f5489abd957f") (:authors ("HIGASHI Taiju")) (:maintainer "HIGASHI Taiju") (:keywords "literate programming" "reproducible research" "javascript" "typescript" "tools") (:url . "https://github.com/taiju/ob-deno"))]) (ob-diagrams . [(20160407 1237) nil "org-babel functions for diagrams evaluation" single ((:commit . "ed6649616325ca5b2d2109f74aded8bcb8aa5186") (:authors ("Daniel Bergey")) (:maintainer "Daniel Bergey") (:keywords "literate programming" "reproducible research") (:url . "http://orgmode.org"))]) - (ob-dsq . [(20220405 2219) ((emacs (27 1))) "Babel functions for the `dsq` CLI tool by Multiprocess Labs" single ((:commit . "37090235c064ba5a5e436b0b77b5442f606cf5b3") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "data" "tools") (:url . "https://github.com/fritzgrabo/ob-dsq"))]) + (ob-dsq . [(20220422 730) ((emacs (27 1))) "Babel functions for the `dsq` CLI tool by Multiprocess Labs" single ((:commit . "3dd955a2c5f7d7aecb10c4bcc4ef0c27f50a6376") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "data" "tools") (:url . "https://github.com/fritzgrabo/ob-dsq"))]) (ob-elixir . [(20170725 1419) ((org (8))) "org-babel functions for elixir evaluation" single ((:commit . "8990a8178b2f7bd93504a9ab136622aab6e82e32") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "elixir") (:url . "http://github.com/zweifisch/ob-elixir"))]) (ob-elm . [(20200528 1857) ((emacs (26 1)) (org (9 3))) "Org-babel functions for elm evaluation" single ((:commit . "d3a9fbc2f56416894c9aed65ea9a20cc1d98f15d") (:authors ("Bonface M. K.")) (:maintainer "Bonface M. K.") (:keywords "languages" "tools") (:url . "https://www.bonfacemunyoki.com"))]) (ob-elvish . [(20180427 1900) nil "org-babel functions for Elvish shell" single ((:commit . "369181ceae1190bf971c71aebf9fc6133bd98c39") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "literate programming" "elvish" "shell" "languages" "processes" "tools") (:url . "https://github.com/zzamboni/ob-elvish"))]) @@ -3398,7 +3398,7 @@ (org-caldav . [(20200510 2030) ((org (7))) "Sync org files with external calendar through CalDAV" single ((:commit . "8569941a0a5a9393ba51afc8923fd7b77b73fa7a") (:authors ("David Engster" . "deng@randomsample.de")) (:maintainer "David Engster" . "deng@randomsample.de") (:keywords "calendar" "caldav"))]) (org-capture-pop-frame . [(20160518 1008) ((emacs (24 4))) "Run org-capture in a new pop frame" single ((:commit . "b16fd712de62cf0d1f9befd03be6ab5983cb3301") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/org-capture-pop-frame.git"))]) (org-category-capture . [(20220114 730) ((org (9 0 0)) (emacs (24))) "Contextualy capture of org-mode TODOs." single ((:commit . "642b39c698db00bc535c1c2335f425fb9f4855a9") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org-mode" "todo" "tools" "outlines") (:url . "https://github.com/IvanMalison/org-projectile"))]) - (org-chef . [(20220412 1423) ((org (0)) (emacs (24))) "Cookbook and recipe management with org-mode." tar ((:commit . "f244b33a5a42d2879b9a6f4fcfeedcefb3326b94") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:url . "https://github.com/Chobbes/org-chef"))]) + (org-chef . [(20220422 300) ((org (0)) (emacs (24))) "Cookbook and recipe management with org-mode." tar ((:commit . "6a786e77e67a715b3cd4f5128b59d501614928af") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:url . "https://github.com/Chobbes/org-chef"))]) (org-cliplink . [(20201126 1020) ((emacs (24 4))) "insert org-mode links from the clipboard" tar ((:commit . "13e0940b65d22bec34e2de4bc8cba1412a7abfbc") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/org-cliplink"))]) (org-clock-convenience . [(20200705 1527) ((cl-lib (0 5)) (org (8)) (emacs (24 3))) "convenience functions for org time tracking" single ((:commit . "efc9773a8dedf834cf4a78fb6f5f8fffe55ef8eb") (:authors ("Derek Feichtinger ")) (:maintainer "Derek Feichtinger ") (:keywords "org") (:url . "https://github.com/dfeich/org-clock-convenience"))]) (org-clock-csv . [(20201222 1506) ((org (8 3)) (s (1 0))) "Export `org-mode' clock entries to CSV format." single ((:commit . "af94b58c2e179a5bcc938f339e93de0eee3da99c") (:authors ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainer "Aaron Jacobs" . "atheriel@gmail.com") (:keywords "calendar" "data" "org") (:url . "https://github.com/atheriel/org-clock-csv"))]) @@ -3454,7 +3454,7 @@ (org-mind-map . [(20180826 2340) ((emacs (24)) (dash (1 8 0)) (org (8 2 10))) "Creates a directed graph from org-mode files" single ((:commit . "95347b2f9291f5c5eb6ebac8e726c03634c61de3") (:authors ("Ted Wiles" . "theodore.wiles@gmail.com")) (:maintainer "Ted Wiles" . "theodore.wiles@gmail.com") (:keywords "orgmode" "extensions" "graphviz" "dot") (:url . "https://github.com/theodorewiles/org-mind-map"))]) (org-ml . [(20211231 700) ((emacs (26 1)) (org (9 3)) (dash (2 17)) (s (1 12))) "Functional Org Mode API" tar ((:commit . "3974435bbf72722801f7ed78855381d77a773162") (:authors ("Nathan Dwarshuis" . "ndwar@yavin4.ch")) (:maintainer "Nathan Dwarshuis" . "ndwar@yavin4.ch") (:keywords "org-mode" "outlines") (:url . "https://github.com/ndwarshuis/org-ml"))]) (org-mobile-sync . [(20180606 524) ((emacs (24 3 50)) (org (8 0))) "automatically sync org-mobile on changes" single ((:commit . "06764b943a528827df1e2acc6bc7806cc2c1351f") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "org-mode" "org" "mobile" "sync" "todo") (:url . "https://framagit.org/steckerhalter/org-mobile-sync"))]) - (org-modern . [(20220420 1400) ((emacs (27 1))) "Modern looks for Org" single ((:commit . "42cb064f9d31adaf00168f18072cec0206b9737c") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/org-modern"))]) + (org-modern . [(20220422 940) ((emacs (27 1))) "Modern looks for Org" single ((:commit . "ff1046705b3950b7a49da50bc34c11da86c6226d") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/org-modern"))]) (org-movies . [(20210920 101) ((emacs (26 1)) (org (9 0)) (request (0 3 0))) "Manage watchlist with Org mode" single ((:commit . "e96fecaffa2924de64a507aa31d2934e667ee1ea") (:authors ("Anh T Nguyen")) (:maintainer "Anh T Nguyen") (:keywords "hypermedia" "outlines" "org") (:url . "https://github.com/teeann/org-movies"))]) (org-mru-clock . [(20211029 1147) ((emacs (26 1))) "Clock in/out of tasks with completion and persistent history" single ((:commit . "a74322f0cfd6e52151f9bb8d4f90833330f69120") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "calendar") (:url . "https://github.com/unhammer/org-mru-clock"))]) (org-msg . [(20220331 1707) ((emacs (24 4)) (htmlize (1 54))) "Org mode to send and reply to email in HTML." single ((:commit . "60e22e446325a9b3387396459d98be7c1c52579d") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:keywords "extensions" "mail") (:url . "https://github.com/jeremy-compostella/org-msg"))]) @@ -3683,8 +3683,8 @@ (parse-it . [(20220214 1531) ((emacs (25 1)) (s (1 12 0))) "Basic Parser in Emacs Lisp" tar ((:commit . "41af4e77ff9b3abf98fb52302a418b638be88f7c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/parse-it"))]) (parsebib . [(20220116 2336) ((emacs (25 1))) "A library for parsing bib files" single ((:commit . "63e85c8477fdf98ba920437c9df15f8f06c315e9") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "bibtex") (:url . "https://github.com/joostkremers/parsebib"))]) (parsec . [(20180730 16) ((emacs (24)) (cl-lib (0 5))) "Parser combinator library" single ((:commit . "2cbbbc2254aa7bcaa4fb5e07c8c1bf2f381dba26") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/parsec.el"))]) - (parseclj . [(20220328 558) ((emacs (25))) "Clojure/EDN parser" tar ((:commit . "b04eae67384c1d8181edf318fd62d422a8220724") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) - (parseedn . [(20220207 1352) ((emacs (26)) (parseclj (1 1 0)) (map (2))) "Clojure/EDN parser" single ((:commit . "ea7b5281ec80aca0bd1cc93a348aebb302497339") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) + (parseclj . [(20220422 936) ((emacs (25))) "Clojure/EDN parser" tar ((:commit . "4d0e780e00f1828b00c43099e6eebc6582998f72") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) + (parseedn . [(20220422 936) ((emacs (26)) (parseclj (1 1 0)) (map (2))) "Clojure/EDN parser" single ((:commit . "dce2eed418ad21acf3d2d6d75c37dfa679b22359") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) (pasp-mode . [(20180404 1700) ((emacs (24 3))) "- A major mode for editing Answer Set Programs." single ((:commit . "59385eb0e8ebcfc8c11dd811fb145d4b0fa3cc92") (:authors ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainer "Henrik Jürges" . "juerges.henrik@gmail.com") (:keywords "asp" "pasp" "answer set programs" "potassco answer set programs" "major mode" "languages") (:url . "https://github.com/santifa/pasp-mode"))]) (pass . [(20210203 810) ((emacs (25)) (password-store (2 1 0)) (password-store-otp (0 1 5)) (f (0 17))) "Major mode for password-store.el" single ((:commit . "5651da53137db9adcb125b4897c2fe27eeb4368d") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com") ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "password-store" "password" "keychain"))]) (passmm . [(20210109 8) ((emacs (24 4)) (password-store (0))) "A minor mode for pass (Password Store)." single ((:commit . "d78d1bf4f397180d2256248df589f33aafb4c8b4") (:authors ("Peter Jones" . "pjones@devalot.com")) (:maintainer "Peter Jones" . "pjones@devalot.com") (:url . "https://github.com/pjones/passmm"))]) @@ -3925,7 +3925,7 @@ (propfont-mixed . [(20150113 2211) ((emacs (24)) (cl-lib (0 5))) "Use proportional fonts with space-based indentation." single ((:commit . "0b461ef4754a469610dba71874a34b6da42176bf") (:authors ("Kirill Ignatiev ")) (:maintainer "Kirill Ignatiev ") (:keywords "faces") (:url . "https://github.com/ikirill/propfont-mixed"))]) (proportional . [(20200309 1556) ((emacs (25 1))) "use a proportional font everywhere" single ((:commit . "0e4537af7ba2bc9dbb449c38350bce012b382f51") (:authors ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:keywords "faces") (:url . "https://github.com/ksjogo/proportional"))]) (prosjekt . [(20151127 1416) ((dash (2 8 0))) "a software project tool for emacs" tar ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))]) - (protobuf-mode . [(20220303 1716) nil "major mode for editing protocol buffers." single ((:commit . "e81c678e7dfd43f75d4d68ba1df75ce168820f11") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com") (:keywords "google" "protobuf" "languages"))]) + (protobuf-mode . [(20220303 1716) nil "major mode for editing protocol buffers." single ((:commit . "bfc956bc3a03f22309173c1872db6ca67d2a161f") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com") (:keywords "google" "protobuf" "languages"))]) (protocols . [(20170802 1132) ((cl-lib (0 5))) "Protocol database access functions." single ((:commit . "d0f7c4acb05465f1a0d4be54363bbd2802647e77") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "net" "protocols") (:url . "https://github.com/davep/protocols.el"))]) (proxy-mode . [(20220210 1410) ((emacs (25))) "A minor mode to toggle proxy." single ((:commit . "620e48c6afaf760d0ee9f5bdf583fd91cd9d0ec6") (:keywords "comm" "proxy") (:url . "https://repo.or.cz/proxy-mode.git"))]) (psalm . [(20211002 1552) ((emacs (24 3)) (php-mode (1 22 3))) "Interface to Psalm" single ((:commit . "28d546a79cb865a78b94cd7e929d66d720505faa") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/psalm.el"))]) @@ -3965,7 +3965,7 @@ (pyenv-mode-auto . [(20180620 1252) ((pyenv-mode (0 1 0)) (s (1 11 0)) (f (0 17 0))) "Automatically activates pyenv version if .python-version file exists." single ((:commit . "347b94cd5ad22e33cc41be661c102d4548767858") (:authors ("Sviatoslav Bulbakha" . "mail@ssbb.me")) (:maintainer "Sviatoslav Bulbakha" . "mail@ssbb.me") (:keywords "python" "pyenv") (:url . "https://github.com/ssbb/pyenv-mode-auto"))]) (pygen . [(20161121 506) ((elpy (1 12 0)) (python-mode (6 2 2)) (dash (2 13 0))) "Python code generation using Elpy and Python-mode." single ((:commit . "9019ff44ba49d7295b1476530feab91fdadb084b") (:authors ("Jack Crawley ")) (:maintainer "Jack Crawley ") (:keywords "python" "code generation") (:url . "https://github.com/JackCrawley/pygen/"))]) (pygn-mode . [(20211021 2325) ((emacs (26 1)) (tree-sitter (0 15 2)) (tree-sitter-langs (0 10 7)) (uci-mode (0 5 4)) (nav-flash (1 0 0)) (ivy (0 10 0))) "Major-mode for chess PGN files, powered by Python" tar ((:commit . "eb1da7e3eb5f5754b60d404b0e341206eebe19ca") (:authors ("Dodge Coates and Roland Walker")) (:maintainer "Dodge Coates and Roland Walker") (:keywords "data" "games" "chess") (:url . "https://github.com/dwcoates/pygn-mode"))]) - (pyim . [(20220422 208) ((emacs (25 1)) (async (1 6)) (xr (1 13))) "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime." tar ((:commit . "63de15e13b8c3ad6be50b7cb6a5855a53a6d8739") (:authors ("Ye Wenbin" . "wenbinye@163.com") ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method") (:url . "https://github.com/tumashu/pyim"))]) + (pyim . [(20220422 936) ((emacs (25 1)) (async (1 6)) (xr (1 13))) "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime." tar ((:commit . "cd1bfd2bbc10fe0ac47d0ec383cde453f6019e6c") (:authors ("Ye Wenbin" . "wenbinye@163.com") ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method") (:url . "https://github.com/tumashu/pyim"))]) (pyim-basedict . [(20210517 43) nil "The default pinyin dict of pyim" tar ((:commit . "86f6de3e3a1523eb278bd3afe7c4ceba2a0e2972") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/tumashu/pyim-basedict"))]) (pyim-cangjiedict . [(20210617 934) ((pyim (3 7))) "Some cangjie dicts for pyim" tar ((:commit . "d17e3d32a6480939b350a91a915ebe8e6efad819") (:authors ("Yuanchen Xie" . "yuanchen.gm@gmail.com")) (:maintainer "Yuanchen Xie" . "yuanchen.gm@gmail.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/p1uxtar/pyim-cangjiedict"))]) (pyim-smzmdict . [(20210505 1445) ((pyim (3 7))) "Sanma(triple) Zhengma dict for pyim" tar ((:commit . "fcddbde17a04d174c7353548056524687f7be8d2") (:authors ("Yue Shi (Zhizhi)")) (:maintainer "Yuanchen Xie") (:keywords "convenience" "i18n" "pyim" "chinese" "zhengma") (:url . "https://github.com/p1uxtar/pyim-smzmdict"))]) @@ -3973,7 +3973,7 @@ (pyimport . [(20180308 1752) ((dash (2 8 0)) (s (1 9 0)) (shut-up (0 3 2))) "Manage Python imports!" single ((:commit . "a6f63cf7ed93f0c0f7c207e6595813966f8852b9") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) (pyimpsort . [(20160130 453) ((emacs (24 3))) "Sort python imports." tar ((:commit . "d5c61d70896b642646dfd3c809c06174ae086c1a") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/pyimpsort.el"))]) (pyinspect . [(20211102 1415) ((emacs (27 1))) "Python object inspector" tar ((:commit . "36cf624236c8b4cce852dd52b64d058d4d4a32fd") (:authors ("Maor Kadosh" . "git@avocadosh.xyz")) (:maintainer "Maor Kadosh" . "git@avocadosh.xyz") (:keywords "tools") (:url . "https://github.com/it-is-wednesday/pyinspect.el"))]) - (pylint . [(20210411 1931) nil "minor mode for running `pylint'" single ((:commit . "8bab34e23c88057753bc251373467c47a6c66ba7") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com") (:keywords "languages" "python"))]) + (pylint . [(20210411 1931) nil "minor mode for running `pylint'" single ((:commit . "7163b86c6f4a1a1c4ae1d6e5d3ab324ec76569e5") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com") (:keywords "languages" "python"))]) (pynt . [(20180710 726) ((emacs (24 4)) (ein (0 13 1)) (epc (0 1 1)) (deferred (0 5 1))) "Generate and scroll EIN buffers from python code" single ((:commit . "86cf9ce78d34f92bfd0764c9cbb75427ebd429e6") (:authors ("Edward Banner" . "edward.banner@gmail.com")) (:maintainer "Edward Banner" . "edward.banner@gmail.com") (:keywords "convenience") (:url . "https://github.com/ebanner/pynt"))]) (pyramid . [(20210427 1032) ((emacs (25 2)) (pythonic (0 1 1)) (tablist (0 70))) "Minor mode for working with pyramid projects" tar ((:commit . "66f54f4a9cc9fa81edf768ab433d5b3c5517363c") (:authors ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my") (:keywords "python" "pyramid" "pylons" "convenience" "tools" "processes") (:url . "https://github.com/dakra/pyramid.el"))]) (pytest . [(20200330 41) ((s (1 9 0))) "Easy Python test running in Emacs" single ((:commit . "6934047242db79b1c53e9fe3e0734cc9719ed1c4") (:keywords "pytest" "python" "testing") (:url . "https://github.com/ionrock/pytest-el"))]) @@ -4520,7 +4520,7 @@ (stickyfunc-enhance . [(20150429 1814) ((emacs (24 3))) "An enhancement to stock `semantic-stickyfunc-mode'" single ((:commit . "13bdba51fcd83ccbc3267959d23afc94d458dcb0") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainer "Tu, Do Hoang") (:keywords "c" "languages" "tools") (:url . "https://github.com/tuhdo/semantic-stickyfunc-enhance"))]) (stimmung-themes . [(20220412 1434) ((emacs (25))) "Themes tuned to inner harmonies" tar ((:commit . "77146bd3ad4f275847c965148572bb0ff0b54c1e") (:authors ("Love Lagerkvist")) (:maintainer "Love Lagerkvist") (:keywords "faces") (:url . "https://github.com/motform/stimmung-themes"))]) (stock-ticker . [(20150204 1052) ((s (1 9 0)) (request (0 2 0))) "Show stock prices in mode line" single ((:commit . "f2e564142c9de84232839a5b01979cf95b04d6a9") (:authors ("Gunther Hagleitner")) (:maintainer "Gunther Hagleitner") (:keywords "comms") (:url . "https://github.com/hagleitn/stock-ticker"))]) - (stock-tracker . [(20220422 225) ((emacs (27 1)) (dash (2 16 0)) (async (1 9 5))) "Track stock price" single ((:commit . "ae082b7125b7d64cb262268ac91e42cdcbefb3cc") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "stock" "finance") (:url . "https://github.com/beacoder/stock-tracker"))]) + (stock-tracker . [(20220422 943) ((emacs (27 1)) (dash (2 16 0)) (async (1 9 5))) "Track stock price" single ((:commit . "649812ebd286f1944eaf7b34d45d72ef60a0b0fb") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "stock" "finance") (:url . "https://github.com/beacoder/stock-tracker"))]) (strace-mode . [(20171116 2039) nil "strace output syntax highlighting" single ((:commit . "2901baa968d5180ab985ac40ca22cc20914d01f5") (:authors ("Preston Moore" . "prestonkmoore@gmail.com")) (:maintainer "Preston Moore" . "prestonkmoore@gmail.com") (:keywords "languages"))]) (streak . [(20220311 1929) ((emacs (27 1))) "Track a daily streak in your Mode Line" single ((:commit . "b2206de2fe43f97e754bbcb0abe9b078a419e787") (:authors ("Colin Woodbury ")) (:maintainer "Colin Woodbury" . "colin@fosskers.ca") (:keywords "calendar") (:url . "https://github.com/fosskers/streak"))]) (streamlink . [(20210811 1429) ((s (1 12 0))) "A major mode for streamlink output" single ((:commit . "c265dc61c02ad29ec01dfd8b5cbe3bac60fbf097") (:keywords "multimedia" "streamlink") (:url . "https://github.com/BenediktBroich/streamlink"))]) @@ -4810,7 +4810,7 @@ (undersea-theme . [(20200719 618) ((emacs (24 3))) "Theme styled after undersea imagery" single ((:commit . "b7b5bffe242fd15b9eb8fe5cb7c9b45e474babbc") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/undersea-theme"))]) (underwater-theme . [(20131118 2) nil "A gentle, deep blue color theme" single ((:commit . "4eb9ef014f580adc135d91d1cd68d37a310640b6") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com") (:keywords "faces"))]) (undo-fu . [(20220412 2337) ((emacs (25 1))) "Undo helper with redo" single ((:commit . "f9c39c248cb965cd3c7cb3c8e15a4eee71921f8c") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu"))]) - (undo-fu-session . [(20220421 2239) ((emacs (28 1))) "Persistent undo, available between sessions" single ((:commit . "e4cf026fd535dbd734a355af98b6b2e788947093") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu-session"))]) + (undo-fu-session . [(20220422 320) ((emacs (28 1))) "Persistent undo, available between sessions" single ((:commit . "ee3879e469c792ae09933a2ca160b7979796b9e1") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu-session"))]) (undo-propose . [(20210207 45) ((emacs (24 3))) "Simple and safe undo navigation" single ((:commit . "91a1dfe516d90dab69c368f6669bacb2458ec5e9") (:authors ("Jack Kamm")) (:maintainer "Jack Kamm") (:keywords "convenience" "files" "undo" "redo" "history") (:url . "https://github.com/jackkamm/undo-propose.el"))]) (undohist . [(20220219 634) ((cl-lib (1 0))) "Persistent undo history for GNU Emacs" single ((:commit . "ec95d5038425bca375865803701c971a9c748114") (:authors ("MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com")) (:maintainer "MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com") (:keywords "convenience"))]) (unfill . [(20210106 220) ((emacs (24 1))) "Do the opposite of fill-paragraph or fill-region" single ((:commit . "cd354ea1a74338760ac6f5872d573e3ecb6b4bd2") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience") (:url . "https://github.com/purcell/unfill"))]) @@ -4940,7 +4940,7 @@ (wakatime-mode . [(20211104 1455) nil "Automatic time tracking extension for WakaTime" single ((:commit . "a53c0e819258ea9dbea3ad64b16e4c6c6201f5a5") (:authors ("Gabor Torok" . "gabor@20y.hu")) (:maintainer "Alan Hamlett" . "alan@wakatime.com") (:keywords "calendar" "comm"))]) (wakib-keys . [(20220211 1304) ((emacs (24 4))) "Minor Mode for Modern Keybindings" single ((:commit . "ed86134f91c532a38d2739dd15ea6cec879cbd8a") (:authors ("Abdulla Bubshait")) (:maintainer "Abdulla Bubshait") (:keywords "convenience" "keybindings" "keys") (:url . "https://github.com/darkstego/wakib-keys/"))]) (wal-mode . [(20220409 1214) ((emacs (25 1))) "A major mode for the WAL programming language" single ((:commit . "1daaf882824e8483419dc999c2d5507ad30cc929") (:authors ("Lucas Klemmer" . "lucas.klemmer@jku.at")) (:maintainer "Lucas Klemmer" . "lucas.klemmer@jku.at") (:keywords "languages") (:url . "https://github.com/LucasKl/wal-major-mode"))]) - (walkclj . [(20220421 645) ((emacs (25)) (parseclj (0 1 0)) (treepy (0 1 0))) "Manipulate Clojure parse trees" single ((:commit . "4b4e9fcef2361bdf88ab3c7f905a76672cfd43e4") (:authors ("Arne Brasseur")) (:maintainer "Arne Brasseur") (:keywords "languages") (:url . "https://github.com/plexus/walkclj"))]) + (walkclj . [(20220422 854) ((emacs (25)) (parseclj (0 1 0)) (treepy (0 1 0))) "Manipulate Clojure parse trees" single ((:commit . "ce4e7713d801b03f94f5da9898fce09718380ed4") (:authors ("Arne Brasseur")) (:maintainer "Arne Brasseur") (:keywords "languages") (:url . "https://github.com/plexus/walkclj"))]) (walkman . [(20220318 2122) ((transient (0 1 0)) (org (8 3 5)) (json-mode (1 6 0)) (emacs (26 3))) "Write HTTP requests in Org mode" single ((:commit . "3118dd4f493caffcc2849058833572dfc0c0e0a9") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "walkman" "http" "curl" "org" "comm") (:url . "https://github.com/abrochard/walkman"))]) (wallpaper . [(20201019 2123) ((emacs (25 1))) "Setting the wallpaper" single ((:commit . "cc0101726dd2fa2b4eda06924c7abfae54f663e2") (:authors ("Farlado" . "farlado@sdf.org")) (:maintainer "Farlado" . "farlado@sdf.org") (:keywords "unix" "wallpaper" "extensions") (:url . "https://github.com/farlado/emacs-wallpaper"))]) (wallpreview . [(20220220 427) ((emacs (24 4))) "Set wallpapers with image-dired" single ((:commit . "b1b8f19ae82b344a9577cea7b883ad513ec52222") (:url . "https://github.com/nryotaro/wallpreview"))]) diff --git a/code/elpa/dashboard-20220409.620/banners/1.txt b/code/elpa/dashboard-20220409.620/banners/1.txt new file mode 100644 index 0000000..8bd71a7 --- /dev/null +++ b/code/elpa/dashboard-20220409.620/banners/1.txt @@ -0,0 +1,8 @@ + +######## ## ## ### ###### ###### +## ### ### ## ## ## ## ## ## +## #### #### ## ## ## ## +###### ## ### ## ## ## ## ###### +## ## ## ######### ## ## +## ## ## ## ## ## ## ## ## +######## ## ## ## ## ###### ###### diff --git a/code/elpa/dashboard-20220409.620/banners/2.txt b/code/elpa/dashboard-20220409.620/banners/2.txt new file mode 100644 index 0000000..73b761b --- /dev/null +++ b/code/elpa/dashboard-20220409.620/banners/2.txt @@ -0,0 +1,6 @@ + _______ .___ ___. ___ ______ _______. +| ____|| \/ | / \ / | / | +| |__ | \ / | / ^ \ | ,----' | (----` +| __| | |\/| | / /_\ \ | | \ \ +| |____ | | | | / _____ \ | `----.----) | +|_______||__| |__| /__/ \__\ \______|_______/ diff --git a/code/elpa/dashboard-20220409.620/banners/3.txt b/code/elpa/dashboard-20220409.620/banners/3.txt new file mode 100644 index 0000000..3abfd82 --- /dev/null +++ b/code/elpa/dashboard-20220409.620/banners/3.txt @@ -0,0 +1,8 @@ + _______ _____ ______ ________ ________ ________ +|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\ +\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_ + \ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \ + \ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \ + \ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \ + \|_______|\|__| \|__|\|__|\|__|\|_______|\_________\ + \|_________| diff --git a/code/elpa/dashboard-20220409.620/banners/4.txt b/code/elpa/dashboard-20220409.620/banners/4.txt new file mode 100644 index 0000000..d82d67c --- /dev/null +++ b/code/elpa/dashboard-20220409.620/banners/4.txt @@ -0,0 +1,17 @@ +_ ___ _ _ +_ ___ __ ___ __ _ ___ +__ _ ___ __ ___ + _ ___ _ + _ _ __ _ + ___ __ _ + __ _ + _ _ _ + _ _ _ + _ _ _ + __ ___ + _ _ _ _ + _ _ + _ _ + _ _ + _ +__ diff --git a/code/elpa/dashboard-20220409.620/banners/emacs.png b/code/elpa/dashboard-20220409.620/banners/emacs.png new file mode 100644 index 0000000..718b071 Binary files /dev/null and b/code/elpa/dashboard-20220409.620/banners/emacs.png differ diff --git a/code/elpa/dashboard-20220409.620/banners/logo.png b/code/elpa/dashboard-20220409.620/banners/logo.png new file mode 100644 index 0000000..c9de00c Binary files /dev/null and b/code/elpa/dashboard-20220409.620/banners/logo.png differ diff --git a/code/elpa/dashboard-20220409.620/dashboard-autoloads.el b/code/elpa/dashboard-20220409.620/dashboard-autoloads.el new file mode 100644 index 0000000..6d2d64a --- /dev/null +++ b/code/elpa/dashboard-20220409.620/dashboard-autoloads.el @@ -0,0 +1,39 @@ +;;; dashboard-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dashboard" "dashboard.el" (0 0 0 0)) +;;; Generated autoloads from dashboard.el + +(autoload 'dashboard-setup-startup-hook "dashboard" "\ +Setup post initialization hooks. +If a command line argument is provided, assume a filename and skip displaying +Dashboard." nil nil) + +(register-definition-prefixes "dashboard" '("dashboard-")) + +;;;*** + +;;;### (autoloads nil "dashboard-widgets" "dashboard-widgets.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from dashboard-widgets.el + +(register-definition-prefixes "dashboard-widgets" '("dashboard-" "org-time-less-p" "recentf-list")) + +;;;*** + +;;;### (autoloads nil nil ("dashboard-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dashboard-autoloads.el ends here diff --git a/code/elpa/dashboard-20220409.620/dashboard-pkg.el b/code/elpa/dashboard-20220409.620/dashboard-pkg.el new file mode 100644 index 0000000..6b8e0da --- /dev/null +++ b/code/elpa/dashboard-20220409.620/dashboard-pkg.el @@ -0,0 +1,12 @@ +(define-package "dashboard" "20220409.620" "A startup screen extracted from Spacemacs" + '((emacs "26.1")) + :commit "09290bf700cc269ad3c07d9518cd758b90971fcd" :authors + '(("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com")) + :maintainer + '("Jesús Martínez" . "jesusmartinez93@gmail.com") + :keywords + '("startup" "screen" "tools" "dashboard") + :url "https://github.com/emacs-dashboard/emacs-dashboard") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/code/elpa/dashboard-20220409.620/dashboard-widgets.el b/code/elpa/dashboard-20220409.620/dashboard-widgets.el new file mode 100644 index 0000000..8168afe --- /dev/null +++ b/code/elpa/dashboard-20220409.620/dashboard-widgets.el @@ -0,0 +1,1267 @@ +;;; dashboard-widgets.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2022 emacs-dashboard maintainers +;; +;; Author : Rakan Al-Hneiti +;; Maintainer : Jesús Martínez +;; Shen, Jen-Chieh +;; URL : https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "26.1")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projects (projectile or project.el), org-agenda and more. + +;;; Code: + +(require 'cl-lib) +(require 'subr-x) +(require 'image) + +;; Compiler pacifier +(declare-function all-the-icons-icon-for-dir "ext:all-the-icons.el") +(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") +(declare-function all-the-icons-fileicon "ext:data-fileicons.el") +(declare-function all-the-icons-octicon "ext:data-octicons.el") +(declare-function bookmark-get-filename "ext:bookmark.el") +(declare-function bookmark-all-names "ext:bookmark.el") +(declare-function calendar-date-compare "ext:calendar.el") +(declare-function projectile-cleanup-known-projects "ext:projectile.el") +(declare-function projectile-load-known-projects "ext:projectile.el") +(declare-function projectile-mode "ext:projectile.el") +(declare-function projectile-relevant-known-projects "ext:projectile.el") +;;; project.el in Emacs 26 does not contain this function +(declare-function project-known-project-roots "ext:project.el" nil t) +(declare-function project-forget-zombie-projects "ext:project.el" nil t) +(declare-function org-agenda-format-item "ext:org-agenda.el") +(declare-function org-compile-prefix-format "ext:org-agenda.el") +(declare-function org-entry-is-done-p "ext:org.el") +(declare-function org-in-archived-heading-p "ext:org.el") +(declare-function org-get-category "ext:org.el") +(declare-function org-get-deadline-time "ext:org.el") +(declare-function org-get-heading "ext:org.el") +(declare-function org-get-scheduled-time "ext:org.el") +(declare-function org-get-tags "ext:org.el") +(declare-function org-map-entries "ext:org.el") +(declare-function org-outline-level "ext:org.el") +(declare-function org-today "ext:org.el") +(declare-function org-get-todo-face "ext:org.el") +(declare-function org-get-todo-state "ext:org.el") +(declare-function org-entry-is-todo-p "ext:org.el") +(declare-function org-release-buffers "ext:org.el") +(declare-function recentf-cleanup "ext:recentf.el") +(defalias 'org-time-less-p 'time-less-p) +(defvar org-level-faces) +(defvar org-agenda-new-buffers) +(defvar org-agenda-prefix-format) +(defvar org-agenda-todo-keyword-format) +(defvar org-todo-keywords-1) +(defvar all-the-icons-dir-icon-alist) +(defvar package-activated-list) + +(defcustom dashboard-page-separator "\n\n" + "Separator to use between the different pages." + :type 'string + :group 'dashboard) + +(defcustom dashboard-image-banner-max-height 0 + "Maximum height of banner image. + +This setting applies only if Emacs supports image transforms or +compiled with Imagemagick support. When value is non-zero the image +banner will be resized to the specified height in pixels, with aspect +ratio preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-image-banner-max-width 0 + "Maximum width of banner image. + +This setting applies if Emacs supports image transforms or compiled +with Imagemagick support. When value is non-zero the image banner +will be resized to the specified width in pixels, with aspect ratio +preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-set-heading-icons nil + "When non nil, heading sections will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-file-icons nil + "When non nil, file lists will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-navigator nil + "When non nil, a navigator will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-init-info t + "When non nil, init info will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-footer t + "When non nil, a footer will be displayed at the bottom." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-footer-messages + '("The one true editor, Emacs!" + "Who the hell uses VIM anyway? Go Evil!" + "Free as free speech, free as free Beer" + "Happy coding!" + "Vi Vi Vi, the editor of the beast" + "Welcome to the church of Emacs" + "While any text editor can save your files, only Emacs can save your soul" + "I showed you my source code, pls respond") + "A list of messages, one of which dashboard chooses to display." + :type 'list + :group 'dashboard) + +(defcustom dashboard-show-shortcuts t + "Whether to show shortcut keys for each section." + :type 'boolean + :group 'dashboard) + +(defconst dashboard-banners-directory + (concat (file-name-directory (locate-library "dashboard")) "banners/") + "Default banner directory.") + +(defconst dashboard-banner-official-png + (concat dashboard-banners-directory "emacs.png") + "Emacs banner image.") + +(defconst dashboard-banner-logo-png + (concat dashboard-banners-directory "logo.png") + "Emacs banner image.") + +(defconst dashboard-banner-length 75 + "Width of a banner.") + +(defcustom dashboard-banner-logo-title "Welcome to Emacs!" + "Specify the startup banner." + :type 'string + :group 'dashboard) + +(defcustom dashboard-navigator-buttons nil + "Specify the navigator buttons. +The format is: 'icon title help action face prefix suffix'. + +Example: +'((\"☆\" \"Star\" \"Show stars\" (lambda (&rest _) + (show-stars)) 'warning \"[\" \"]\"))" + :type '(repeat (repeat (list string string string function symbol string string))) + :group 'dashboard) + +(defcustom dashboard-init-info + (lambda () + (let ((package-count 0) (time (emacs-init-time))) + (when (bound-and-true-p package-alist) + (setq package-count (length package-activated-list))) + (when (boundp 'straight--profile-cache) + (setq package-count (+ (hash-table-count straight--profile-cache) package-count))) + (if (zerop package-count) + (format "Emacs started in %s" time) + (format "%d packages loaded in %s" package-count time)))) + "Init info with packages loaded and init time." + :type '(function string) + :group 'dashboard) + +(defcustom dashboard-footer + (nth (random (1- (1+ (length dashboard-footer-messages)))) dashboard-footer-messages) + "A footer with some short message." + :type 'string + :group 'dashboard) + +(defcustom dashboard-footer-icon + (if (and (display-graphic-p) + (or (fboundp 'all-the-icons-fileicon) + (require 'all-the-icons nil 'noerror))) + (all-the-icons-fileicon "emacs" + :height 1.1 + :v-adjust -0.05 + :face 'font-lock-keyword-face) + (propertize ">" 'face 'dashboard-footer)) + "Footer's icon." + :type 'string + :group 'dashboard) + +(defcustom dashboard-startup-banner 'official + "Specify the startup banner. +Default value is `official', it displays the Emacs logo. `logo' displays Emacs +alternative logo. An integer value is the index of text banner. A string +value must be a path to a .PNG or .TXT file. If the value is nil then no banner +is displayed." + :type '(choice (const :tag "offical" official) + (const :tag "logo" logo) + (string :tag "a png or txt path")) + :group 'dashboard) + +(defcustom dashboard-buffer-last-width nil + "Previous width of dashboard-buffer." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-item-generators + '((recents . dashboard-insert-recents) + (bookmarks . dashboard-insert-bookmarks) + (projects . dashboard-insert-projects) + (agenda . dashboard-insert-agenda) + (registers . dashboard-insert-registers)) + "Association list of items to how to generate in the startup buffer. +Will be of the form `(list-type . list-function)'. +Possible values for list-type are: `recents', `bookmarks', `projects', +`agenda' ,`registers'." + :type '(repeat (alist :key-type symbol :value-type function)) + :group 'dashboard) + +(defcustom dashboard-projects-backend 'projectile + "The package that supplies the list of recent projects. +With the value `projectile', the projects widget uses the package +projectile (available in MELPA). With the value `project-el', +the widget uses the package project (available in GNU ELPA). + +To activate the projects widget, add e.g. `(projects . 10)' to +`dashboard-items' after making sure the necessary package is +installed." + :type '(choice (const :tag "Use projectile" projectile) + (const :tag "Use project.el" project-el)) + :group 'dashboard) + +(defcustom dashboard-items + '((recents . 5) + (bookmarks . 5) + (agenda . 5)) + "Association list of items to show in the startup buffer. +Will be of the form `(list-type . list-size)'. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'." + :type '(repeat (alist :key-type symbol :value-type integer)) + :group 'dashboard) + +(defcustom dashboard-item-shortcuts + '((recents . "r") + (bookmarks . "m") + (projects . "p") + (agenda . "a") + (registers . "e")) + "Association list of items and their corresponding shortcuts. +Will be of the form `(list-type . keys)' as understood by `(kbd keys)'. +If nil, shortcuts are disabled. If an entry's value is nil, that item's +shortcut is disbaled. See `dashboard-items' for possible values of list-type.'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defcustom dashboard-item-names nil + "Association list of item heading names. +When an item is nil or not present, the default name is used. +Will be of the form `(default-name . new-name)'." + :type '(alist :key-type string :value-type string) + :options '("Recent Files:" "Bookmarks:" "Agenda for today:" + "Agenda for the coming week:" "Registers:" "Projects:") + :group 'dashboard) + +(defcustom dashboard-items-default-length 20 + "Length used for startup lists with otherwise unspecified bounds. +Set to nil for unbounded." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-heading-icons + '((recents . "history") + (bookmarks . "bookmark") + (agenda . "calendar") + (projects . "rocket") + (registers . "database")) + "Association list for the icons of the heading sections. +Will be of the form `(list-type . icon-name-string)`. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defcustom dashboard-path-style nil + "Style to display path." + :type '(choice + (const :tag "No specify" nil) + (const :tag "Truncate the beginning part of the path" truncate-beginning) + (const :tag "Truncate the middle part of the path" truncate-middle) + (const :tag "Truncate the end part of the path" truncate-end)) + :group 'dashboard) + +(defcustom dashboard-path-max-length 70 + "Maximum length for path to display." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-path-shorten-string "..." + "String the that displays in the center of the path." + :type 'string + :group 'dashboard) + +(defvar recentf-list nil) + +(defvar dashboard-buffer-name) + +;; +;; Faces +;; +(defface dashboard-text-banner + '((t (:inherit font-lock-keyword-face))) + "Face used for text banners." + :group 'dashboard) + +(defface dashboard-banner-logo-title + '((t :inherit default)) + "Face used for the banner title." + :group 'dashboard) + +(defface dashboard-navigator + '((t (:inherit font-lock-keyword-face))) + "Face used for the navigator." + :group 'dashboard) + +(defface dashboard-heading + '((t (:inherit font-lock-keyword-face))) + "Face used for widget headings." + :group 'dashboard) + +(defface dashboard-items-face + '((t (:inherit widget-button))) + "Face used for items." + :group 'dashboard) + +(defface dashboard-no-items-face + '((t (:inherit widget-button))) + "Face used for no items." + :group 'dashboard) + +(defface dashboard-footer + '((t (:inherit font-lock-doc-face))) + "Face used for widget headings." + :group 'dashboard) + +(define-obsolete-face-alias + 'dashboard-text-banner-face 'dashboard-text-banner "1.2.6") +(define-obsolete-face-alias + 'dashboard-banner-logo-title-face 'dashboard-banner-logo-title "1.2.6") +(define-obsolete-face-alias + 'dashboard-heading-face 'dashboard-heading "1.2.6") + +;; +;; Util +;; +(defmacro dashboard-mute-apply (&rest body) + "Execute BODY without message." + (declare (indent 0) (debug t)) + `(let (message-log-max) + (with-temp-message (or (current-message) nil) + (let ((inhibit-message t)) ,@body)))) + +(defun dashboard-funcall-fboundp (fnc &rest args) + "Call FNC with ARGS if exists." + (when (fboundp fnc) (if args (funcall fnc args) (funcall fnc)))) + +;; +;; Generic widget helpers +;; +(defun dashboard-subseq (seq end) + "Return the subsequence of SEQ from 0 to END." + (let ((len (length seq))) + (butlast seq (- len (min len end))))) + +(defun dashboard-get-shortcut-name (item) + "Get the shortcut name to be used for ITEM." + (let ((elem (rassoc item dashboard-item-shortcuts))) + (and elem (car elem)))) + +(defun dashboard-get-shortcut (item) + "Get the shortcut to be used for ITEM." + (let ((elem (assq item dashboard-item-shortcuts))) + (and elem (cdr elem)))) + +(defmacro dashboard-insert-shortcut (shortcut-id + shortcut-char + search-label + &optional no-next-line) + "Insert a shortcut SHORTCUT-CHAR for a given SEARCH-LABEL. +Optionally, provide NO-NEXT-LINE to move the cursor forward a line." + (let* (;; Ensure punctuation and upper case in search string is not + ;; used to construct the `defun' + (name (downcase (replace-regexp-in-string "[[:punct:]]+" "" (format "%s" search-label)))) + ;; remove symbol quote + (sym (intern (replace-regexp-in-string "'" "" (format "dashboard-jump-to-%s" shortcut-id))))) + `(progn + (eval-when-compile (defvar dashboard-mode-map)) + (defun ,sym nil + ,(concat "Jump to " name ". This code is dynamically generated in `dashboard-insert-shortcut'.") + (interactive) + (unless (search-forward ,search-label (point-max) t) + (search-backward ,search-label (point-min) t)) + ,@(unless no-next-line '((forward-line 1))) + (back-to-indentation)) + (eval-after-load 'dashboard + (define-key dashboard-mode-map ,shortcut-char ',sym))))) + +(defun dashboard-append (msg &optional _messagebuf) + "Append MSG to dashboard buffer. +If MESSAGEBUF is not nil then MSG is also written in message buffer." + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (goto-char (point-max)) + (let (buffer-read-only) (insert msg)))) + +(defun dashboard-modify-heading-icons (alist) + "Append ALIST items to `dashboard-heading-icons' to modify icons." + (dolist (icon alist) + (add-to-list 'dashboard-heading-icons icon))) + +(defun dashboard-insert-page-break () + "Insert a page break line in dashboard buffer." + (dashboard-append dashboard-page-separator)) + +(defun dashboard-insert-heading (heading &optional shortcut) + "Insert a widget HEADING in dashboard buffer, adding SHORTCUT if provided." + (when (and (display-graphic-p) dashboard-set-heading-icons) + ;; Try loading `all-the-icons' + (unless (or (fboundp 'all-the-icons-octicon) + (require 'all-the-icons nil 'noerror)) + (error "Package `all-the-icons' isn't installed")) + + (insert (cond + ((string-equal heading "Recent Files:") + (all-the-icons-octicon (cdr (assoc 'recents dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Bookmarks:") + (all-the-icons-octicon (cdr (assoc 'bookmarks dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((or (string-equal heading "Agenda for today:") + (string-equal heading "Agenda for the coming week:")) + (all-the-icons-octicon (cdr (assoc 'agenda dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Registers:") + (all-the-icons-octicon (cdr (assoc 'registers dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Projects:") + (all-the-icons-octicon (cdr (assoc 'projects dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + (t " "))) + (insert " ")) + + (insert (propertize heading 'face 'dashboard-heading)) + + ;; Turn the inserted heading into an overlay, so that we may freely change + ;; its name without breaking any of the functions that expect the default name. + ;; If there isn't a suitable entry in `dashboard-item-names', + ;; we fallback to using HEADING. In that case we still want it to be an + ;; overlay to maintain consistent behavior (such as the point movement) + ;; between modified and default headings. + (let ((ov (make-overlay (- (point) (length heading)) (point) nil t))) + (overlay-put ov 'display (or (cdr (assoc heading dashboard-item-names)) heading)) + (overlay-put ov 'face 'dashboard-heading)) + (when shortcut (insert (format " (%s)" shortcut)))) + +(defun dashboard-center-line (string) + "Center a STRING accoring to it's size." + (insert (make-string (max 0 (floor (/ (- dashboard-banner-length + (+ (length string) 1)) 2))) ?\ ))) + +;; +;; BANNER +;; +(defun dashboard-insert-ascii-banner-centered (file) + "Insert banner from FILE." + (let ((ascii-banner + (with-temp-buffer + (insert-file-contents file) + (let ((banner-width 0)) + (while (not (eobp)) + (let ((line-length (- (line-end-position) (line-beginning-position)))) + (if (< banner-width line-length) + (setq banner-width line-length))) + (forward-line 1)) + (goto-char 0) + (let ((margin + (max 0 (floor (/ (- dashboard-banner-length banner-width) 2))))) + (while (not (eobp)) + (insert (make-string margin ?\ )) + (forward-line 1)))) + (buffer-string)))) + (put-text-property 0 (length ascii-banner) 'face 'dashboard-text-banner ascii-banner) + (insert ascii-banner))) + +(defun dashboard--type-is-gif-p (image-path) + "Return if image is a gif. +String -> bool. +Argument IMAGE-PATH path to the image." + (eq 'gif (image-type image-path))) + +(defun dashboard-insert-image-banner (banner) + "Display an image BANNER." + (when (file-exists-p banner) + (let* ((title dashboard-banner-logo-title) + (size-props + (append (when (> dashboard-image-banner-max-width 0) + (list :max-width dashboard-image-banner-max-width)) + (when (> dashboard-image-banner-max-height 0) + (list :max-height dashboard-image-banner-max-height)))) + (spec + (cond ((dashboard--type-is-gif-p banner) + (create-image banner)) + ((image-type-available-p 'imagemagick) + (apply 'create-image banner 'imagemagick nil size-props)) + (t + (apply 'create-image banner nil nil + (when (and (fboundp 'image-transforms-p) + (memq 'scale (funcall 'image-transforms-p))) + size-props))))) + ;; TODO: For some reason, `elisp-lint' is reporting error void + ;; function `image-size'. + (size (when (fboundp 'image-size) (image-size spec))) + (width (car size)) + (left-margin (max 0 (floor (- dashboard-banner-length width) 2)))) + (goto-char (point-min)) + (insert "\n") + (insert (make-string left-margin ?\ )) + (insert-image spec) + (when (dashboard--type-is-gif-p banner) (image-animate spec 0 t)) + (insert "\n\n") + (when title + (dashboard-center-line title) + (insert (format "%s\n\n" (propertize title 'face 'dashboard-banner-logo-title))))))) + +;; +;; INIT INFO +;; +(defun dashboard-insert-init-info () + "Insert init info when `dashboard-set-init-info' is t." + (when dashboard-set-init-info + (let ((init-info (if (functionp dashboard-init-info) + (funcall dashboard-init-info) + dashboard-init-info))) + (dashboard-center-line init-info) + (insert (propertize init-info 'face 'font-lock-comment-face))))) + +(defun dashboard-get-banner-path (index) + "Return the full path to banner with index INDEX." + (concat dashboard-banners-directory (format "%d.txt" index))) + +(defun dashboard-choose-banner () + "Return the full path of a banner based on the dotfile value." + (when dashboard-startup-banner + (cond ((eq 'official dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-official-png + (dashboard-get-banner-path 1))) + ((eq 'logo dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-logo-png + (dashboard-get-banner-path 1))) + ((integerp dashboard-startup-banner) + (dashboard-get-banner-path dashboard-startup-banner)) + ((stringp dashboard-startup-banner) + (if (and (file-exists-p dashboard-startup-banner) + (or (string-suffix-p ".txt" dashboard-startup-banner) + (and (display-graphic-p) + (image-type-available-p (intern (file-name-extension + dashboard-startup-banner)))))) + dashboard-startup-banner + (message "could not find banner %s, use default instead" dashboard-startup-banner) + (dashboard-get-banner-path 1))) + (t (dashboard-get-banner-path 1))))) + +(defun dashboard-insert-banner () + "Insert Banner at the top of the dashboard." + (goto-char (point-max)) + (let ((banner (dashboard-choose-banner)) buffer-read-only) + (when banner + (if (image-type-available-p (intern (file-name-extension banner))) + (dashboard-insert-image-banner banner) + (dashboard-insert-ascii-banner-centered banner)) + (dashboard-insert-navigator) + (dashboard-insert-init-info)))) + +(defun dashboard-insert-navigator () + "Insert Navigator of the dashboard." + (when (and dashboard-set-navigator dashboard-navigator-buttons) + (dolist (line dashboard-navigator-buttons) + (dolist (btn line) + (let* ((icon (car btn)) + (title (cadr btn)) + (help (or (cadr (cdr btn)) "")) + (action (or (cadr (cddr btn)) #'ignore)) + (face (or (cadr (cddr (cdr btn))) 'dashboard-navigator)) + (prefix (or (cadr (cddr (cddr btn))) (propertize "[" 'face face))) + (suffix (or (cadr (cddr (cddr (cdr btn)))) (propertize "]" 'face face)))) + (widget-create 'item + :tag (concat + (when icon + (propertize icon 'face + (let ((prop-face (get-text-property 0 'face icon))) + (if prop-face + `(:inherit ,prop-face :inherit ,face) + `(:inherit ,face))))) + (when (and icon title + (not (string-equal icon "")) + (not (string-equal title ""))) + (propertize " " 'face 'variable-pitch)) + (when title (propertize title 'face face))) + :help-echo help + :action action + :button-face 'dashboard-items-face + :mouse-face 'highlight + :button-prefix prefix + :button-suffix suffix + :format "%[%t%]") + (insert " "))) + (let* ((width (current-column))) + (beginning-of-line) + (dashboard-center-line (make-string width ?\s)) + (end-of-line)) + (insert "\n")) + (insert "\n"))) + +(defmacro dashboard-insert-section (section-name list list-size shortcut-id shortcut-char action &rest widget-params) + "Add a section with SECTION-NAME and LIST of LIST-SIZE items to the dashboard. +SHORTCUT-CHAR is the keyboard shortcut used to access the section. +ACTION is theaction taken when the user activates the widget button. +WIDGET-PARAMS are passed to the \"widget-create\" function." + `(progn + (dashboard-insert-heading ,section-name + (if (and ,list ,shortcut-char dashboard-show-shortcuts) ,shortcut-char)) + (if ,list + (when (and (dashboard-insert-section-list + ,section-name + (dashboard-subseq ,list ,list-size) + ,action + ,@widget-params) + ,shortcut-id ,shortcut-char) + (dashboard-insert-shortcut ,shortcut-id ,shortcut-char ,section-name)) + (insert (propertize "\n --- No items ---" 'face 'dashboard-no-items-face))))) + +;; +;; Section list +;; +(defmacro dashboard-insert-section-list (section-name list action &rest rest) + "Insert into SECTION-NAME a LIST of items, expanding ACTION and passing REST +to widget creation." + `(when (car ,list) + (mapc + (lambda (el) + (let ((tag ,@rest)) + (insert "\n ") + + (when (and (display-graphic-p) + dashboard-set-file-icons + (or (fboundp 'all-the-icons-icon-for-dir) + (require 'all-the-icons nil 'noerror))) + (let* ((path (car (last (split-string ,@rest " - ")))) + (icon (if (and (not (file-remote-p path)) + (file-directory-p path)) + (all-the-icons-icon-for-dir path nil "") + (cond + ((or (string-equal ,section-name "Agenda for today:") + (string-equal ,section-name "Agenda for the coming week:")) + (all-the-icons-octicon "primitive-dot" :height 1.0 :v-adjust 0.01)) + ((file-remote-p path) + (all-the-icons-octicon "radio-tower" :height 1.0 :v-adjust 0.01)) + (t (all-the-icons-icon-for-file (file-name-nondirectory path) + :v-adjust -0.05)))))) + (setq tag (concat icon " " ,@rest)))) + + (widget-create 'item + :tag tag + :action ,action + :button-face 'dashboard-items-face + :mouse-face 'highlight + :button-prefix "" + :button-suffix "" + :format "%[%t%]"))) + ,list))) + +;; Footer +(defun dashboard-random-footer () + "Return a random footer from `dashboard-footer-messages'." + (nth (random (length dashboard-footer-messages)) dashboard-footer-messages)) + +(defun dashboard-insert-footer () + "Insert footer of dashboard." + (when-let ((footer (and dashboard-set-footer (dashboard-random-footer)))) + (insert "\n") + (dashboard-center-line footer) + (insert dashboard-footer-icon) + (insert " ") + (insert (propertize footer 'face 'dashboard-footer)) + (insert "\n"))) + +;; +;; Truncate +;; +(defcustom dashboard-shorten-by-window-width nil + "Shorten path by window edges." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-shorten-path-offset 0 + "Shorten path offset on the edges." + :type 'integer + :group 'dashboard) + +(defun dashboard-f-filename (path) + "Return file name from PATH." + (file-name-nondirectory path)) + +(defun dashboard-f-base (path) + "Return directory name from PATH." + (file-name-nondirectory (directory-file-name (file-name-directory path)))) + +(defun dashboard-shorten-path-beginning (path) + "Shorten PATH from beginning if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + front) + (if (<= len-path dashboard-path-max-length) path + (setq front (ignore-errors (substring path (- len-path len-total) len-path))) + (if front (concat dashboard-path-shorten-string front) "")))) + +(defun dashboard-shorten-path-middle (path) + "Shorten PATH from middle if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + (center (/ len-total 2)) + (end-back center) + (start-front (- len-path center)) + back front) + (if (<= len-path dashboard-path-max-length) path + (setq back (substring path 0 end-back) + front (ignore-errors (substring path start-front len-path))) + (if front (concat back dashboard-path-shorten-string front) "")))) + +(defun dashboard-shorten-path-end (path) + "Shorten PATH from end if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + back) + (if (<= len-path dashboard-path-max-length) path + (setq back (ignore-errors (substring path 0 len-total))) + (if (and back (< 0 dashboard-path-max-length)) + (concat back dashboard-path-shorten-string) "")))) + +(defun dashboard--get-base-length (path type) + "Return the length of the base from the PATH by TYPE." + (let* ((is-dir (file-directory-p path)) + (base (if is-dir (dashboard-f-base path) (dashboard-f-filename path))) + (option (cl-case type + (recents 'dashboard-recentf-show-base) + (bookmarks 'dashboard-bookmarks-show-base) + (projects 'dashboard-projects-show-base))) + (option-val (symbol-value option)) + base-len) + (cl-case option-val + (`align (setq base-len (dashboard--align-length-by-type type))) + (`nil (setq base-len 0)) + (t (setq base-len (length base)))) + base-len)) + +(defun dashboard-shorten-path (path type) + "Shorten the PATH by TYPE." + (setq path (abbreviate-file-name path)) + (let ((dashboard-path-max-length + (if (and dashboard-path-style dashboard-shorten-by-window-width) + (- (window-width) (dashboard--get-base-length path type) + dashboard-shorten-path-offset) + dashboard-path-max-length))) + (cl-case dashboard-path-style + (truncate-beginning (dashboard-shorten-path-beginning path)) + (truncate-middle (dashboard-shorten-path-middle path)) + (truncate-end (dashboard-shorten-path-end path)) + (t path)))) + +(defun dashboard-shorten-paths (paths alist type) + "Shorten all path from PATHS by TYPE and store it to ALIST." + (let (lst-display abbrev (index 0)) + (setf (symbol-value alist) nil) ; reset + (dolist (item paths) + (setq abbrev (dashboard-shorten-path item type) + ;; Add salt here, and use for extraction. + ;; See function `dashboard-extract-key-path-alist'. + abbrev (format "%s|%s" index abbrev)) + ;; store `abbrev' as id; and `item' with value + (push (cons abbrev item) (symbol-value alist)) + (push abbrev lst-display) + (cl-incf index)) + (reverse lst-display))) + +(defun dashboard-extract-key-path-alist (key alist) + "Remove salt from KEY, and return true shorten path from ALIST." + (let* ((key (car (assoc key alist))) (split (split-string key "|"))) + (nth 1 split))) + +(defun dashboard-expand-path-alist (key alist) + "Get the full path (un-shorten) using KEY from ALIST." + (cdr (assoc key alist))) + +(defun dashboard--generate-align-format (fmt len) + "Return FMT after inserting align LEN." + (let ((pos (1+ (string-match-p "%s" fmt)))) + (concat (substring fmt 0 pos) + (concat "-" (number-to-string len)) + (substring fmt pos (length fmt))))) + +(defun dashboard--align-length-by-type (type) + "Return the align length by TYPE of the section." + (let ((len-item (cdr (assoc type dashboard-items))) (count 0) (align-length -1) + len-list base) + (cl-case type + (`recents + (require 'recentf) + (setq len-list (length recentf-list)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count recentf-list) + align-length (max align-length (length (dashboard-f-filename base)))) + (cl-incf count))) + (`bookmarks + (let ((bookmarks-lst (bookmark-all-names))) + (setq len-list (length bookmarks-lst)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count bookmarks-lst) + align-length (max align-length (length base))) + (cl-incf count)))) + (`projects + (let ((projects-lst (dashboard-projects-backend-load-projects))) + (setq len-list (length projects-lst)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count projects-lst) + align-length (max align-length (length (dashboard-f-base base)))) + (cl-incf count)))) + (t (error "Unknown type for align length: %s" type))) + align-length)) + +;; +;; Recentf +;; +(defcustom dashboard-recentf-show-base nil + "Show the base file name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-recentf-item-format "%s %s" + "Format to use when showing the base of the file name." + :type 'string + :group 'dashboard) + +(defvar dashboard-recentf-alist nil + "Alist records shorten's recent files and it's full paths.") + +(defvar dashboard--recentf-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-recents (list-size) + "Add the list of LIST-SIZE items from recently edited files." + (setq dashboard--recentf-cache-item-format nil) + (recentf-mode) + (dashboard-mute-apply (recentf-cleanup)) + (dashboard-insert-section + "Recent Files:" + (dashboard-shorten-paths recentf-list 'dashboard-recentf-alist 'recents) + list-size + 'recents + (dashboard-get-shortcut 'recents) + `(lambda (&rest _) + (find-file-existing (dashboard-expand-path-alist ,el dashboard-recentf-alist))) + (let* ((file (dashboard-expand-path-alist el dashboard-recentf-alist)) + (filename (dashboard-f-filename file)) + (path (dashboard-extract-key-path-alist el dashboard-recentf-alist))) + (cl-case dashboard-recentf-show-base + (`align + (unless dashboard--recentf-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'recents)) + (new-fmt (dashboard--generate-align-format + dashboard-recentf-item-format len-align))) + (setq dashboard--recentf-cache-item-format new-fmt))) + (format dashboard--recentf-cache-item-format filename path)) + (`nil path) + (t (format dashboard-recentf-item-format filename path)))))) + +;; +;; Bookmarks +;; +(defcustom dashboard-bookmarks-show-base t + "Show the base file name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-bookmarks-item-format "%s - %s" + "Format to use when showing the base of the file name." + :type 'string + :group 'dashboard) + +(defvar dashboard--bookmarks-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-bookmarks (list-size) + "Add the list of LIST-SIZE items of bookmarks." + (require 'bookmark) + (dashboard-insert-section + "Bookmarks:" + (dashboard-subseq (bookmark-all-names) list-size) + list-size + 'bookmarks + (dashboard-get-shortcut 'bookmarks) + `(lambda (&rest _) (bookmark-jump ,el)) + (if-let* ((filename el) + (path (bookmark-get-filename el)) + (path-shorten (dashboard-shorten-path path 'bookmarks))) + (cl-case dashboard-bookmarks-show-base + (`align + (unless dashboard--bookmarks-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'bookmarks)) + (new-fmt (dashboard--generate-align-format + dashboard-bookmarks-item-format len-align))) + (setq dashboard--bookmarks-cache-item-format new-fmt))) + (format dashboard--bookmarks-cache-item-format filename path-shorten)) + (`nil path-shorten) + (t (format dashboard-bookmarks-item-format filename path-shorten))) + el))) + +;; +;; Projects +;; +(defcustom dashboard-projects-switch-function + nil + "Custom function to switch to projects from dashboard. +If non-NIL, should be bound to a function with one argument. The function will +be called with the root directory of the project to switch to." + :type '(choice (const :tag "Default" nil) function) + :group 'dashboard) + +(defcustom dashboard-projects-show-base nil + "Show the project name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-projects-item-format "%s %s" + "Format to use when showing the base of the project name." + :type 'string + :group 'dashboard) + +(defvar dashboard-projects-alist nil + "Alist records the shorten's project paths and it's full paths.") + +(defvar dashboard--projects-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-projects (list-size) + "Add the list of LIST-SIZE items of projects." + (setq dashboard--projects-cache-item-format nil) + (dashboard-insert-section + "Projects:" + (dashboard-shorten-paths + (dashboard-subseq (dashboard-projects-backend-load-projects) list-size) + 'dashboard-projects-alist 'projects) + list-size + 'projects + (dashboard-get-shortcut 'projects) + `(lambda (&rest _) + (funcall (dashboard-projects-backend-switch-function) + (dashboard-expand-path-alist ,el dashboard-projects-alist))) + (let* ((file (dashboard-expand-path-alist el dashboard-projects-alist)) + (filename (dashboard-f-base file)) + (path (dashboard-extract-key-path-alist el dashboard-projects-alist))) + (cl-case dashboard-projects-show-base + (`align + (unless dashboard--projects-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'projects)) + (new-fmt (dashboard--generate-align-format + dashboard-projects-item-format len-align))) + (setq dashboard--projects-cache-item-format new-fmt))) + (format dashboard--projects-cache-item-format filename path)) + (`nil path) + (t (format dashboard-projects-item-format filename path)))))) + +(defun dashboard-projects-backend-load-projects () + "Depending on `dashboard-projects-backend' load corresponding backend. +Return function that returns a list of projects." + (cl-case dashboard-projects-backend + (`projectile + (require 'projectile) + (dashboard-mute-apply (projectile-cleanup-known-projects)) + (projectile-load-known-projects)) + (`project-el + (require 'project) + (dashboard-mute-apply (dashboard-funcall-fboundp #'project-forget-zombie-projects)) + (project-known-project-roots)) + (t + (display-warning '(dashboard) + "Invalid value for `dashboard-projects-backend'" + :error)))) + +(defun dashboard-projects-backend-switch-function () + "Return the function to switch to a project. +Custom variable `dashboard-projects-switch-function' variable takes preference +over custom backends." + (or dashboard-projects-switch-function + (cl-case dashboard-projects-backend + (`projectile 'projectile-switch-project-by-name) + (`project-el + (lambda (project) + "This function is used to switch to `PROJECT'." + (let ((default-directory project)) + (project-find-file)))) + (t + (display-warning '(dashboard) + "Invalid value for `dashboard-projects-backend'" + :error))))) + +;; +;; Org Agenda +;; +(defcustom dashboard-week-agenda t + "Show agenda weekly if its not nil." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-agenda-time-string-format "%Y-%m-%d" + "Format time of agenda entries." + :type 'string + :group 'dashboard) + +(defcustom dashboard-match-agenda-entry nil + "Match agenda to extra filter. +It is the MATCH attribute for `org-map-entries'" + :type 'string + :group 'dashboard) + +(defcustom dashboard-agenda-release-buffers nil + "If not nil use `org-release-buffers' after getting the entries." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-filter-agenda-entry 'dashboard-filter-agenda-by-time + "Function to filter `org-agenda' entries." + :type '(choice + (const :tag "No filter" dashboard-no-filter-agenda) + (const :tag "Filter by time" dashboard-filter-agenda-by-time) + (const :tag "Filter by todo" dashboard-filter-agenda-by-todo) + (function :tag "Custom function")) + :group 'dashboard) + +(defcustom dashboard-agenda-sort-strategy nil + "A list of strategies to sort the agenda. If nil agenda is not sorted." + :type '(repeat (choice (const time-up) (const time-down) + (const todo-state-up) (const todo-state-down))) + :group 'dashboard) + +(defcustom dashboard-agenda-prefix-format " %i %-12:c %s " + "Format for each entry in the agenda. +When the dashboard-agenda is created this format is inserted into +`org-agenda-prefix-format' as `dashboard-agenda' and compiled with +`org-compile-prefix-format' previous calling `dashboard-agenda-entry-format' for +each agenda entry." + :type 'string + :group 'dashboard) + +(defun dashboard-agenda-entry-format () + "Format agenda entry to show it on dashboard." + (let* ((scheduled-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (entry-time (or scheduled-time deadline-time)) + (item (org-agenda-format-item + (dashboard-agenda--formatted-time) + (dashboard-agenda--formatted-headline) + (org-outline-level) + (org-get-category) + (org-get-tags))) + (todo-state (org-get-todo-state)) + (todo-index (and todo-state + (length (member todo-state org-todo-keywords-1)))) + (entry-data (list 'dashboard-agenda-time entry-time + 'dashboard-agenda-todo-index todo-index + 'dashboard-agenda-file (buffer-file-name) + 'dashboard-agenda-loc (point)))) + (add-text-properties 0 (length item) entry-data item) + item)) + +(defun dashboard-agenda--formatted-headline () + "Set agenda faces to `HEADLINE' when face text property is nil." + (let* ((headline (org-get-heading t t t t)) + (todo (or (org-get-todo-state) "")) + (org-level-face (nth (- (org-outline-level) 1) org-level-faces)) + (todo-state (format org-agenda-todo-keyword-format todo))) + (when (null (get-text-property 0 'face headline)) + (add-face-text-property 0 (length headline) org-level-face t headline)) + (when (null (get-text-property 0 'face todo-state)) + (add-face-text-property 0 (length todo-state) (org-get-todo-face todo) t todo-state)) + (concat todo-state " " headline))) + +(defun dashboard-agenda--formatted-time () + "Get the scheduled or dead time of an entry. If no time is found return nil." + (when-let ((time (or (org-get-scheduled-time (point)) (org-get-deadline-time (point))))) + (format-time-string dashboard-agenda-time-string-format time))) + +(defun dashboard-due-date-for-agenda () + "Return due-date for agenda period." + (if dashboard-week-agenda + (time-add (current-time) (* 86400 8)) + (time-add (current-time) 86400))) + +(defun dashboard-filter-agenda-by-time () + "Include entry if it has a scheduled-time or deadline-time in the future. +An entry is included if this function returns nil and excluded if returns a +point." + (let ((scheduled-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (due-date (dashboard-due-date-for-agenda))) + (unless (and (not (org-entry-is-done-p)) + (not (org-in-archived-heading-p)) + (or (and scheduled-time + (org-time-less-p scheduled-time due-date)) + (and deadline-time + (org-time-less-p deadline-time due-date)))) + (point)))) + +(defun dashboard-filter-agenda-by-todo () + "Include entry if it is todo and not done. +An entry is included if this function returns nil and excluded +if returns a point." + (unless (and (org-entry-is-todo-p) + (not (org-entry-is-done-p)) + (not (org-in-archived-heading-p))) + (point))) + +(defun dashboard-no-filter-agenda () + "No filter agenda entries." + (when (org-entry-is-done-p) (point))) + +(defun dashboard-get-agenda () + "Get agenda items for today or for a week from now." + (if-let ((prefix-format (assoc 'dashboard-agenda org-agenda-prefix-format))) + (setcdr prefix-format dashboard-agenda-prefix-format) + (push (cons 'dashboard-agenda dashboard-agenda-prefix-format) org-agenda-prefix-format)) + (org-compile-prefix-format 'dashboard-agenda) + (prog1 (org-map-entries 'dashboard-agenda-entry-format + dashboard-match-agenda-entry + 'agenda + dashboard-filter-agenda-entry) + (dashboard-agenda--release-buffers))) + +(defun dashboard-agenda--release-buffers () + "Release agenda buffers buffers. +This is what `org-agenda-exit' do." + (when dashboard-agenda-release-buffers + (org-release-buffers org-agenda-new-buffers) + (setq org-agenda-new-buffers nil))) + +(defun dashboard-agenda--sorted-agenda () + "Return agenda sorted by time. +For now, it only works when dashboard-agenda has been filter by time +and dashboard-agenda-sort is not nil." + (let ((agenda (dashboard-get-agenda)) + (sort-function (dashboard-agenda--sort-function))) + (sort agenda sort-function))) + +(defun dashboard-agenda--sort-function () + "Get the function use to sorted the agenda. +Depending on the list `dashboard-agenda-sorting-strategy' use this strategies to +build a predicate to compare each enty. +This is similar as `org-entries-lessp' but with a different aproach." + (dashboard-agenda--build-sort-function dashboard-agenda-sort-strategy)) + +(defun dashboard-agenda--build-sort-function (strategies) + "Build a predicate to sort the dashboard agenda. +If `STRATEGIES' is nil then sort using the nil predicate. Look for the strategy +predicate, the attributes of the entry and compare entries. If no predicate is +found for the strategy it uses nil predicate." + (if (null strategies) (lambda (_dont _care) nil) + (let ((predicate (dashboard-agenda--build-sort-function-predicate + (car strategies))) + (attribute (dashboard-agenda--build-sort-function-attribute + (car strategies)))) + (if (null predicate) (lambda (_dont _care) nil) + (lambda (entry1 entry2) + (dashboard-agenda--compare-entries entry1 entry2 (cdr strategies) + predicate attribute)))))) + +(defun dashboard-agenda--build-sort-function-predicate (strategy) + "Return the predicate to compare two entryes depending on the `STRATEGY'." + (cl-case strategy + (`time-up 'org-time-less-p) + (`time-down (lambda (a b) (org-time-less-p b a))) + (`todo-state-up '>) + (`todo-state-down '<))) + +(defun dashboard-agenda--build-sort-function-attribute (strategy) + "Return the argument to compare two entries depending to the `STRATEGY'." + (cond + ((memq strategy '(time-up time-down)) 'dashboard-agenda-time) + ((memq strategy '(todo-state-up todo-state-down)) 'dashboard-agenda-todo-index) + (t nil))) + +(defun dashboard-agenda--compare-entries (entry1 entry2 strategies predicate attribute) + "Compare `ENTRY1' and `ENTRY2' by `ATTRIBUTE' using `PREDICATE'. +If both attributes are nil or equals the next strategy in `STRATEGIES' is used +to compare." + (let ((arg1 (get-text-property 0 attribute entry1)) + (arg2 (get-text-property 0 attribute entry2))) + (cond + ((or (and (null arg1) (null arg2)) (equal arg1 arg2)) + (apply (dashboard-agenda--build-sort-function strategies) (list entry1 entry2))) + ((null arg1) nil) + ((null arg2) t) + (t (apply predicate (list arg1 arg2)))))) + +(defun dashboard-insert-agenda (list-size) + "Add the list of LIST-SIZE items of agenda." + (require 'org-agenda) + (dashboard-insert-section + (if dashboard-week-agenda + "Agenda for the coming week:" + "Agenda for today:") + (dashboard-agenda--sorted-agenda) + list-size + 'agenda + (dashboard-get-shortcut 'agenda) + `(lambda (&rest _) + (let ((buffer (find-file-other-window (get-text-property 0 'dashboard-agenda-file ,el)))) + (with-current-buffer buffer + (goto-char (get-text-property 0 'dashboard-agenda-loc ,el)) + (switch-to-buffer buffer)))) + (format "%s" el))) + +;; +;; Registers +;; +(defun dashboard-insert-registers (list-size) + "Add the list of LIST-SIZE items of registers." + (require 'register) + (dashboard-insert-section + "Registers:" + register-alist + list-size + 'registers + (dashboard-get-shortcut 'registers) + (lambda (&rest _) (jump-to-register (car el))) + (format "%c - %s" (car el) (register-describe-oneline (car el))))) + +(provide 'dashboard-widgets) +;;; dashboard-widgets.el ends here diff --git a/code/elpa/dashboard-20220409.620/dashboard.el b/code/elpa/dashboard-20220409.620/dashboard.el new file mode 100644 index 0000000..9c8b80e --- /dev/null +++ b/code/elpa/dashboard-20220409.620/dashboard.el @@ -0,0 +1,472 @@ +;;; dashboard.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2022 emacs-dashboard maintainers +;; +;; Author : Rakan Al-Hneiti +;; Maintainer : Jesús Martínez +;; Shen, Jen-Chieh +;; URL : https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "26.1")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projects (projectile or project.el), org-agenda and more. + +;;; Code: + +(require 'ffap) +(require 'recentf) + +(require 'dashboard-widgets) + +(declare-function bookmark-get-filename "ext:bookmark.el") +(declare-function bookmark-all-names "ext:bookmark.el") +(declare-function dashboard-ls--dirs "ext:dashboard-ls.el") +(declare-function dashboard-ls--files "ext:dashboard-ls.el") +(declare-function page-break-lines-mode "ext:page-break-lines.el") +(declare-function project-forget-projects-under "ext:project.el") + +(defgroup dashboard nil + "Extensible startup screen." + :group 'applications) + +;; Custom splash screen +(defvar dashboard-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-p") 'dashboard-previous-line) + (define-key map (kbd "C-n") 'dashboard-next-line) + (define-key map (kbd "") 'dashboard-previous-line) + (define-key map (kbd "") 'dashboard-next-line) + (define-key map (kbd "k") 'dashboard-previous-line) + (define-key map (kbd "j") 'dashboard-next-line) + (define-key map [tab] 'widget-forward) + (define-key map (kbd "C-i") 'widget-forward) + (define-key map [backtab] 'widget-backward) + (define-key map (kbd "RET") 'dashboard-return) + (define-key map [mouse-1] 'dashboard-mouse-1) + (define-key map (kbd "}") #'dashboard-next-section) + (define-key map (kbd "{") #'dashboard-previous-section) + + (define-key map (kbd "") #'dashboard-remove-item-under) + (define-key map (kbd "") #'dashboard-remove-item-under) + (define-key map (kbd "DEL") #'dashboard-remove-item-under) + + (define-key map (kbd "1") #'dashboard-section-1) + (define-key map (kbd "2") #'dashboard-section-2) + (define-key map (kbd "3") #'dashboard-section-3) + (define-key map (kbd "4") #'dashboard-section-4) + (define-key map (kbd "5") #'dashboard-section-5) + (define-key map (kbd "6") #'dashboard-section-6) + (define-key map (kbd "7") #'dashboard-section-7) + (define-key map (kbd "8") #'dashboard-section-8) + (define-key map (kbd "9") #'dashboard-section-9) + map) + "Keymap for dashboard mode.") + +(defcustom dashboard-after-initialize-hook nil + "Hook that is run after dashboard buffer is initialized." + :group 'dashboard + :type 'hook) + +(define-derived-mode dashboard-mode special-mode "Dashboard" + "Dashboard major mode for startup screen." + :group 'dashboard + :syntax-table nil + :abbrev-table nil + (buffer-disable-undo) + (when (featurep 'whitespace) (whitespace-mode -1)) + (when (featurep 'linum) (linum-mode -1)) + (when (featurep 'display-line-numbers) (display-line-numbers-mode -1)) + (when (featurep 'page-break-lines) (page-break-lines-mode 1)) + (setq-local revert-buffer-function #'dashboard-refresh-buffer) + (setq inhibit-startup-screen t + buffer-read-only t + truncate-lines t)) + +(defcustom dashboard-center-content nil + "Whether to center content within the window." + :type 'boolean + :group 'dashboard) + +(defconst dashboard-buffer-name "*dashboard*" + "Dashboard's buffer name.") + +(defvar dashboard-force-refresh nil + "If non-nil, force refresh dashboard buffer.") + +(defvar dashboard--section-starts nil + "List of section starting positions.") + +;; +;; Util +;; +(defun dashboard--goto-line (line) + "Goto LINE." + (goto-char (point-min)) (forward-line (1- line))) + +(defmacro dashboard--save-excursion (&rest body) + "Execute BODY save window point." + (declare (indent 0) (debug t)) + `(let ((line (line-number-at-pos nil t)) + (column (current-column))) + ,@body + (dashboard--goto-line line) + (move-to-column column))) + +;; +;; Core +;; +(defun dashboard--current-section () + "Return section symbol in dashboard." + (save-excursion + (if (and (search-backward dashboard-page-separator nil t) + (search-forward dashboard-page-separator nil t)) + (let ((ln (thing-at-point 'line))) + (cond ((string-match-p "Recent Files:" ln) 'recents) + ((string-match-p "Bookmarks:" ln) 'bookmarks) + ((string-match-p "Projects:" ln) 'projects) + ((string-match-p "Agenda for " ln) 'agenda) + ((string-match-p "Registers:" ln) 'registers) + ((string-match-p "List Directories:" ln) 'ls-directories) + ((string-match-p "List Files:" ln) 'ls-files) + (t (user-error "Unknown section from dashboard")))) + (user-error "Failed searching dashboard section")))) + +;; +;; Navigation +;; +(defun dashboard-previous-section () + "Navigate back to previous section." + (interactive) + (let ((current-position (point)) current-section-start previous-section-start) + (dolist (elt dashboard--section-starts) + (when (and current-section-start (not previous-section-start)) + (setq previous-section-start elt)) + (when (and (not current-section-start) (< elt current-position)) + (setq current-section-start elt))) + (goto-char (if (eq current-position current-section-start) + previous-section-start + current-section-start)))) + +(defun dashboard-next-section () + "Navigate forward to next section." + (interactive) + (let ((current-position (point)) next-section-start + (section-starts (reverse dashboard--section-starts))) + (dolist (elt section-starts) + (when (and (not next-section-start) + (> elt current-position)) + (setq next-section-start elt))) + (when next-section-start + (goto-char next-section-start)))) + +(defun dashboard--section-lines () + "Return a list of integer represent the starting line number of each section." + (let (pb-lst) + (save-excursion + (goto-char (point-min)) + (while (search-forward dashboard-page-separator nil t) + (when (ignore-errors (dashboard--current-section)) + (push (line-number-at-pos) pb-lst)))) + (setq pb-lst (reverse pb-lst)) + pb-lst)) + +(defun dashboard--goto-section-by-index (index) + "Navigate to item section by INDEX." + (let* ((pg-lst (dashboard--section-lines)) + (items-id (1- index)) + (items-pg (nth items-id pg-lst)) + (items-len (length pg-lst))) + (when (and items-pg (< items-id items-len)) + (dashboard--goto-line items-pg)))) + +(defun dashboard-section-1 () + "Navigate to section 1." (interactive) (dashboard--goto-section-by-index 1)) +(defun dashboard-section-2 () + "Navigate to section 2." (interactive) (dashboard--goto-section-by-index 2)) +(defun dashboard-section-3 () + "Navigate to section 3." (interactive) (dashboard--goto-section-by-index 3)) +(defun dashboard-section-4 () + "Navigate to section 4." (interactive) (dashboard--goto-section-by-index 4)) +(defun dashboard-section-5 () + "Navigate to section 5." (interactive) (dashboard--goto-section-by-index 5)) +(defun dashboard-section-6 () + "Navigate to section 6." (interactive) (dashboard--goto-section-by-index 6)) +(defun dashboard-section-7 () + "Navigate to section 7." (interactive) (dashboard--goto-section-by-index 7)) +(defun dashboard-section-8 () + "Navigate to section 8." (interactive) (dashboard--goto-section-by-index 8)) +(defun dashboard-section-9 () + "Navigate to section 9." (interactive) (dashboard--goto-section-by-index 9)) + +(defun dashboard-previous-line (arg) + "Move point up and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + (interactive "^p") + (dashboard-next-line (- arg))) + +(defun dashboard-next-line (arg) + "Move point down and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + ;; code heavily inspired by `dired-next-line' + (interactive "^p") + (let (line-move-visual goal-column) + (line-move arg t)) + ;; We never want to move point into an invisible line. Dashboard doesn’t + ;; use invisible text currently but when it does we’re ready! + (while (and (invisible-p (point)) + (not (if (and arg (< arg 0)) (bobp) (eobp)))) + (forward-char (if (and arg (< arg 0)) -1 1))) + (beginning-of-line-text)) + +;; +;; ffap +;; +(defun dashboard--goto-section (section) + "Move to SECTION declares in variable `dashboard-item-shortcuts'." + (let ((fnc (intern (format "dashboard-jump-to-%s" section)))) + (dashboard-funcall-fboundp fnc))) + +(defun dashboard--current-index (section &optional pos) + "Return the idex by SECTION from POS." + (let (target-ln section-line) + (save-excursion + (when pos (goto-char pos)) + (setq target-ln (line-number-at-pos)) + (dashboard--goto-section section) + (setq section-line (line-number-at-pos))) + (- target-ln section-line))) + +(defun dashboard--section-list (section) + "Return the list from SECTION." + (cl-case section + (`recents recentf-list) + (`bookmarks (bookmark-all-names)) + (`projects (dashboard-projects-backend-load-projects)) + (`ls-directories (dashboard-ls--dirs)) + (`ls-files (dashboard-ls--files)) + (t (user-error "Unknown section for search: %s" section)))) + +(defun dashboard--current-item-in-path () + "Return the path from current dashboard section in path." + (let ((section (dashboard--current-section)) path) + (cl-case section + (`bookmarks (setq path (bookmark-get-filename path))) + (t + (let ((lst (dashboard--section-list section)) + (index (dashboard--current-index section))) + (setq path (nth index lst))))) + path)) + +(defun dashboard--on-path-item-p () + "Return non-nil if current point is on the item path from dashboard." + (save-excursion + (when (= (point) (line-end-position)) (ignore-errors (forward-char -1))) + (eq (get-char-property (point) 'face) 'dashboard-items-face))) + +(defun dashboard--ffap-guesser--adv (fnc &rest args) + "Advice execution around function `ffap-guesser'. + +Argument FNC is the adviced function. +Optional argument ARGS adviced function arguments." + (cl-case major-mode + (`dashboard-mode + (or (and (dashboard--on-path-item-p) + (dashboard--current-item-in-path)) + (apply fnc args))) ; fallback + (t (apply fnc args)))) +(advice-add 'ffap-guesser :around #'dashboard--ffap-guesser--adv) + +;; +;; Removal +;; +(defun dashboard-remove-item-under () + "Remove a item from the current item section." + (interactive) + (cl-case (dashboard--current-section) + (`recents (dashboard-remove-item-recentf)) + (`bookmarks (dashboard-remove-item-bookmarks)) + (`projects (dashboard-remove-item-projects)) + (`agenda (dashboard-remove-item-agenda)) + (`registers (dashboard-remove-item-registers))) + (dashboard--save-excursion (dashboard-refresh-buffer))) + +(defun dashboard-remove-item-recentf () + "Remove a file from `recentf-list'." + (interactive) + (let ((path (save-excursion (end-of-line) (ffap-guesser)))) + (setq recentf-list (delete path recentf-list))) + (dashboard-mute-apply (recentf-save-list))) + +(defun dashboard-remove-item-projects () + "Remove a path from `project--list'." + (interactive) + (let ((path (save-excursion (end-of-line) (ffap-guesser)))) + (dashboard-mute-apply + (cl-case dashboard-projects-backend + (`projectile ) ; TODO: .. + (`project-el (project-forget-projects-under path)))))) + +(defun dashboard-remove-item-bookmarks () + "Remove a bookmarks from `bookmark-alist'." + (interactive)) ; TODO: .. + +(defun dashboard-remove-item-agenda () + "Remove an agenda from `org-agenda-files'." + (interactive "P") + (let ((agenda-file (get-text-property (point) 'dashboard-agenda-file)) + (agenda-loc (get-text-property (point) 'dashboard-agenda-loc))) + (with-current-buffer (find-file-noselect agenda-file) + (goto-char agenda-loc) + (call-interactively 'org-todo)))) + +(defun dashboard-remove-item-registers () + "Remove a registers from `register-alist'." + (interactive)) ; TODO: .. + +;; +;; Confirmation +;; +(defun dashboard-return () + "Hit return key in dashboard buffer." + (interactive) + (let ((start-ln (line-number-at-pos)) (fd-cnt 0) diff-line entry-pt) + (save-excursion + (while (and (not diff-line) + (not (= (point) (point-min))) + (not (get-char-property (point) 'button)) + (not (= (point) (point-max)))) + (forward-char 1) + (setq fd-cnt (1+ fd-cnt)) + (unless (= start-ln (line-number-at-pos)) + (setq diff-line t))) + (unless (= (point) (point-max)) + (setq entry-pt (point)))) + (when (= fd-cnt 1) + (setq entry-pt (1- (point)))) + (if entry-pt + (widget-button-press entry-pt) + (call-interactively #'widget-button-press)))) + +(defun dashboard-mouse-1 () + "Key for keymap `mouse-1'." + (interactive) + (let ((old-track-mouse track-mouse)) + (when (call-interactively #'widget-button-click) + (setq track-mouse old-track-mouse)))) + +;; +;; Insertion +;; +(defun dashboard-maximum-section-length () + "For the just-inserted section, calculate the length of the longest line." + (let ((max-line-length 0)) + (save-excursion + (dashboard-previous-section) + (while (not (eobp)) + (setq max-line-length + (max max-line-length + (- (line-end-position) (line-beginning-position)))) + (forward-line 1))) + max-line-length)) + +(defun dashboard-insert-startupify-lists () + "Insert the list of widgets into the buffer." + (interactive) + (let ((buffer-exists (buffer-live-p (get-buffer dashboard-buffer-name))) + (recentf-is-on (recentf-enabled-p)) + (origial-recentf-list recentf-list) + (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0)) + (max-line-length 0)) + ;; disable recentf mode, so we don't flood the recent files list with org + ;; mode files do this by making a copy of the part of the list we'll use + ;; let dashboard widgets change that then restore the orginal list afterwards + ;; (this avoids many saves/loads that would result from disabling/enabling + ;; recentf-mode) + (when recentf-is-on + (setq recentf-list (dashboard-subseq recentf-list dashboard-num-recents))) + (when (or dashboard-force-refresh + (not (eq dashboard-buffer-last-width (window-width))) + (not buffer-exists)) + (setq dashboard-banner-length (window-width) + dashboard-buffer-last-width dashboard-banner-length) + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (let (buffer-read-only) + (erase-buffer) + (dashboard-insert-banner) + (dashboard-insert-page-break) + (setq dashboard--section-starts nil) + (mapc (lambda (els) + (let* ((el (or (car-safe els) els)) + (list-size + (or (cdr-safe els) + dashboard-items-default-length)) + (item-generator + (cdr-safe (assoc el dashboard-item-generators)))) + (add-to-list 'dashboard--section-starts (point)) + (funcall item-generator list-size) + (when recentf-is-on + (setq recentf-list origial-recentf-list)) + (setq max-line-length + (max max-line-length (dashboard-maximum-section-length))) + (dashboard-insert-page-break))) + dashboard-items) + (when dashboard-center-content + (when dashboard--section-starts + (goto-char (car (last dashboard--section-starts)))) + (let ((margin (floor (/ (max (- (window-width) max-line-length) 0) 2)))) + (while (not (eobp)) + (unless (string-suffix-p (thing-at-point 'line) dashboard-page-separator) + (insert (make-string margin ?\ ))) + (forward-line 1)))) + (dashboard-insert-footer)) + (goto-char (point-min)) + (dashboard-mode))) + (when recentf-is-on + (setq recentf-list origial-recentf-list)))) + +(add-hook 'window-setup-hook + (lambda () + (add-hook 'window-size-change-functions 'dashboard-resize-on-hook) + (dashboard-resize-on-hook))) + +(defun dashboard-refresh-buffer (&rest _) + "Refresh buffer." + (interactive) + (let ((dashboard-force-refresh t)) (dashboard-insert-startupify-lists)) + (switch-to-buffer dashboard-buffer-name)) + +(defun dashboard-resize-on-hook (&optional _) + "Re-render dashboard on window size change." + (let ((space-win (get-buffer-window dashboard-buffer-name)) + (frame-win (frame-selected-window))) + (when (and space-win + (not (window-minibuffer-p frame-win))) + (with-selected-window space-win + (dashboard-insert-startupify-lists))))) + +;;;###autoload +(defun dashboard-setup-startup-hook () + "Setup post initialization hooks. +If a command line argument is provided, assume a filename and skip displaying +Dashboard." + (when (< (length command-line-args) 2) + (add-hook 'after-init-hook (lambda () + ;; Display useful lists of items + (dashboard-insert-startupify-lists))) + (add-hook 'emacs-startup-hook (lambda () + (switch-to-buffer dashboard-buffer-name) + (goto-char (point-min)) + (redisplay) + (run-hooks 'dashboard-after-initialize-hook))))) + +(provide 'dashboard) +;;; dashboard.el ends here diff --git a/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el new file mode 100644 index 0000000..b45e7c2 --- /dev/null +++ b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el @@ -0,0 +1,23 @@ +;;; dashboard-project-status-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dashboard-project-status" "dashboard-project-status.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from dashboard-project-status.el + +(register-definition-prefixes "dashboard-project-status" '("dashboard-project-status")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dashboard-project-status-autoloads.el ends here diff --git a/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el new file mode 100644 index 0000000..9e680da --- /dev/null +++ b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from dashboard-project-status.el -*- no-byte-compile: t -*- +(define-package "dashboard-project-status" "20190202.1354" "Display a git project status in a dashboard widget." '((emacs "24") (git "0.1.1") (dashboard "1.2.5")) :commit "7675c138e9df8fe2c626e7ba9bbb8b6717671a41" :authors '(("Jason Duncan" . "jasond496@msn.com")) :maintainer '("Jason Duncan" . "jasond496@msn.com") :url "https://github.com/functionreturnfunction/dashboard-project-status") diff --git a/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el new file mode 100644 index 0000000..370f230 --- /dev/null +++ b/code/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el @@ -0,0 +1,99 @@ +;;; dashboard-project-status.el --- Display a git project status in a dashboard widget. -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Jason Duncan, all rights reserved + +;; Author: Jason Duncan +;; Version: 0.0.1 +;; Package-Version: 20190202.1354 +;; Package-Commit: 7675c138e9df8fe2c626e7ba9bbb8b6717671a41 +;; URL: https://github.com/functionreturnfunction/dashboard-project-status +;; Package-Requires: ((emacs "24") (git "0.1.1") (dashboard "1.2.5")) + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; Display a git project status in a dashboard widget. + +;; See README.org for installation and usage. + +;;; Code: + +(require 'git) +(require 'dashboard) + +(defun dashboard-project-status-git-local-is-behind? () + "Return non-nil if current `git-repo' is behind its remote." + (numberp + (string-match-p + (regexp-quote "Your branch is behind") + (git-run "status" "-uno")))) + +(defun dashboard-project-status-git-unstaged-files () + "Return list of unstaged files." + (git--lines + (git-run "diff" "--name-only"))) + +(defun dashboard-project-status-insert-heading () + "Insert a heading with project path and whether or not it is behind." + (dashboard-insert-heading "Project ") + (if (functionp 'magit-status) + (widget-create 'push-button + :action `(lambda (&rest ignore) (magit-status ,git-repo)) + :mouse-face 'highlight + :follow-link "\C-m" + :button-prefix "" + :button-suffix "" + :format "%[%t%]" + (abbreviate-file-name git-repo)) + (dashboard-insert-heading git-repo)) + (dashboard-insert-heading + (if (dashboard-project-status-git-local-is-behind?) + " is behind the remote. (use \"git pull\" to update)" + " is up-to-date."))) + +(defun dashboard-project-status-insert-body (limit) + "Insert lists of untracked, unstaged, and staged files LIMIT -ed as specified." + (let ((count 0)) + (dolist (section `(("Untracked Files:" . ,(git-untracked-files)) + ("Unstaged Files:" . ,(dashboard-project-status-git-unstaged-files)) + ("Staged Files:" . ,(git-staged-files)))) + (when (cdr section) + (let* ((items (cdr section)) + (items (if (> (+ count (length items)) limit) + (dashboard-subseq items 0 (- limit count)) + items))) + (when items + (setq count (+ count (length items))) + (insert hard-newline) + (dashboard-insert-recentf-list + (car section) + (reverse + (let (ret) + (dolist (cur items ret) + (setq ret (cons (expand-file-name + (concat (file-name-as-directory git-repo) cur)) + ret)))))))))))) + +(defun dashboard-project-status (project-dir &optional update) + "Return a function which will insert git status for PROJECT-DIR. +If UPDATE is non-nil, update the remote first with 'git remote update'." + `(lambda (list-size) + (let ((git-repo ,project-dir)) + (when ,update (git-run "remote" "update")) + (dashboard-project-status-insert-heading) + (dashboard-project-status-insert-body list-size)))) + +(provide 'dashboard-project-status) +;;; dashboard-project-status.el ends here diff --git a/code/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el b/code/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el deleted file mode 100644 index e441fc8..0000000 --- a/code/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el +++ /dev/null @@ -1,42 +0,0 @@ -;;; dired-collapse-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-collapse" "dired-collapse.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from dired-collapse.el - -(autoload 'dired-collapse-mode "dired-collapse" "\ -Toggle collapsing of unique nested paths in Dired. - -This is a minor mode. If called interactively, toggle the -`Dired-Collapse mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. - -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. - -To check whether the minor mode is enabled in the current buffer, -evaluate `dired-collapse-mode'. - -The mode's hook is called both when the mode is enabled and when -it is disabled. - -\(fn &optional ARG)" t nil) - -(register-definition-prefixes "dired-collapse" '("dired-collapse")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-collapse-autoloads.el ends here diff --git a/code/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el b/code/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el deleted file mode 100644 index 46cd3a8..0000000 --- a/code/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-collapse.el -*- no-byte-compile: t -*- -(define-package "dired-collapse" "20210403.1230" "Collapse unique nested paths in dired listing" '((dash "2.10.0") (f "0.19.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/code/elpa/dired-collapse-20210403.1230/dired-collapse.el b/code/elpa/dired-collapse-20210403.1230/dired-collapse.el deleted file mode 100644 index bb19891..0000000 --- a/code/elpa/dired-collapse-20210403.1230/dired-collapse.el +++ /dev/null @@ -1,162 +0,0 @@ -;;; dired-collapse.el --- Collapse unique nested paths in dired listing -*- lexical-binding: t -*- - -;; Copyright (C) 2017 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Version: 1.1.0 -;; Package-Version: 20210403.1230 -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Created: 15th July 2017 -;; Package-requires: ((dash "2.10.0") (f "0.19.0") (dired-hacks-utils "0.0.1")) -;; Keywords: files - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; Often times we find ourselves in a situation where a single file -;; or directory is nested in a chain of nested directories with no -;; other content. This is sometimes due to various mandatory -;; layouts demanded by packaging tools or tools generating these -;; deeply-nested "unique" paths to disambiguate architectures or -;; versions (but we often use only one anyway). If the user wants -;; to access these directories they have to quite needlessly -;; drill-down through varying number of "uninteresting" directories -;; to get to the content. - -;; This minor mode is in main inspired by how GitHub renders these -;; paths: if there is a chain of directories where each one only has -;; one child, they are concatenated together and shown on the first -;; level in this collapsed form. When the user clicks this -;; collapsed directory they are immediately brought to the deepest -;; directory with some actual content. - -;; To enable or disable this functionality use `dired-collapse-mode' -;; to toggle it for the current dired buffer. - -;; If the deepest directory contains only a single file this file is -;; displayed instead of the last directory. This way we can get -;; directly to the file itself. This is often helpful with config -;; files which are stored in their own directories, for example in -;; `~/.config/foo/config' and similar situations. - -;; The files or directories re-inserted in this manner will also -;; have updated permissions, file sizes and modification dates so -;; they truly correspond to the properties of the file being shown. - -;; The path to the deepest file is dimmed with the `shadow' face so -;; that it does not distract but at the same time is still available -;; for inspection. - -;; The mode is integrated with `dired-rainbow' so the nested files -;; are properly colored according to user's rules. - -;;; Code: - -(require 'dash) -(require 'dired) -(require 'f) -(require 'dired-hacks-utils) - -(defgroup dired-collapse () - "Collapse unique nested paths in dired listing." - :group 'dired-hacks - :prefix "dired-collapse-") - -(defcustom dired-collapse-remote nil - "If non-nil, enable `dired-collapse' in remote (TRAMP) buffers." - :type 'boolean - :group 'dired-collapse) - -;;;###autoload -(define-minor-mode dired-collapse-mode - "Toggle collapsing of unique nested paths in Dired." - :group 'dired-collapse - :lighter "" - (if dired-collapse-mode - (progn - (add-hook 'dired-after-readin-hook 'dired-collapse 'append 'local) - (add-hook 'dired-subtree-after-insert-hook 'dired-collapse 'append 'local) - ;; collapse the buffer only if it is not empty (= we haven't - ;; yet read in the current directory) - (unless (= (buffer-size) 0) - (dired-collapse))) - (remove-hook 'dired-after-readin-hook 'dired-collapse 'local) - (remove-hook 'dired-subtree-after-insert-hook 'dired-collapse 'local) - (revert-buffer))) - -(defun dired-collapse--replace-file (file) - "Replace file on the current line with FILE." - (delete-region (line-beginning-position) (1+ (line-end-position))) - (insert " ") - (insert-directory file dired-listing-switches nil nil) - (forward-line -1) - (dired-align-file (line-beginning-position) (1+ (line-end-position))) - (-when-let (replaced-file (dired-utils-get-filename)) - (when (file-remote-p replaced-file) - (while (search-forward (dired-current-directory) (line-end-position) t) - (replace-match ""))))) - -(defun dired-collapse--create-ov (&optional to-eol) - "Create the shadow overlay which marks the collapsed path. - -If TO-EOL is non-nil, extend the overlay over the whole -filename (for example when the final directory is empty)." - (save-excursion - (dired-move-to-filename) - (let* ((beg (point)) - (end (save-excursion - (dired-move-to-end-of-filename) - (if to-eol - (point) - (1+ (search-backward "/"))))) - (ov (make-overlay beg end))) - (overlay-put ov 'face 'shadow) - ov))) - -(defun dired-collapse () - "Collapse unique nested paths in dired listing." - (when (or (not (file-remote-p default-directory)) dired-collapse-remote) - (-let* (;; dired-hide-details-mode hides details by assigning a special invisibility text property - ;; to them, while dired-collapse requires all the details. So we disable invisibility here - ;; temporarily. - (buffer-invisibility-spec nil) - (inhibit-read-only t)) - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (when (and (looking-at-p dired-re-dir) - (not (member (dired-utils-get-filename 'no-dir) (list "." ".."))) - (not (eolp))) - (let ((path (dired-utils-get-filename)) - files) - (while (and (file-directory-p path) - (file-accessible-directory-p path) - (setq files (f-entries path)) - (= 1 (length files))) - (setq path (car files))) - (if (and (not files) - (equal path (dired-utils-get-filename))) - (dired-collapse--create-ov 'to-eol) - (setq path (s-chop-prefix (dired-current-directory) path)) - (when (string-match-p "/" path) - (let ((default-directory (dired-current-directory))) - (dired-collapse--replace-file path)) - (dired-insert-set-properties (line-beginning-position) (line-end-position)) - (dired-collapse--create-ov (= 0 (length files))))))) - (forward-line 1)))))) - -(provide 'dired-collapse) -;;; dired-collapse.el ends here diff --git a/code/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el b/code/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el index 0c1de1a..3d91d8d 100644 --- a/code/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el +++ b/code/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el @@ -1,2 +1,2 @@ -;;; Generated package description from dired-hacks-utils.el -*- no-byte-compile: t -*- -(define-package "dired-hacks-utils" "20201005.2318" "Utilities and helpers for dired-hacks collection" '((dash "2.5.0")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) +;;; Generated package description from dired-hacks-utils.el -*- no-byte-compile: t -*- +(define-package "dired-hacks-utils" "20201005.2318" "Utilities and helpers for dired-hacks collection" '((dash "2.5.0")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/code/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el b/code/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el index 648e6bb..3048ef0 100644 --- a/code/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el +++ b/code/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el @@ -1,2 +1,2 @@ -;;; Generated package description from dired-rainbow.el -*- no-byte-compile: t -*- -(define-package "dired-rainbow" "20190722.1109" "Extended file highlighting according to its type" '((dash "2.5.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matus Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matus Goljer" . "matus.goljer@gmail.com") :keywords '("files")) +;;; Generated package description from dired-rainbow.el -*- no-byte-compile: t -*- +(define-package "dired-rainbow" "20190722.1109" "Extended file highlighting according to its type" '((dash "2.5.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matus Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matus Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/code/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el b/code/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el deleted file mode 100644 index f128edd..0000000 --- a/code/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el +++ /dev/null @@ -1,73 +0,0 @@ -;;; dired-ranger-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-ranger" "dired-ranger.el" (0 0 0 0)) -;;; Generated autoloads from dired-ranger.el - -(autoload 'dired-ranger-copy "dired-ranger" "\ -Place the marked items in the copy ring. - -With non-nil prefix argument, add the marked items to the current -selection. This allows you to gather files from multiple dired -buffers for a single paste. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-paste "dired-ranger" "\ -Copy the items from copy ring to current directory. - -With raw prefix argument \\[universal-argument], do not remove -the selection from the stack so it can be copied again. - -With numeric prefix argument, copy the n-th selection from the -copy ring. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-move "dired-ranger" "\ -Move the items from copy ring to current directory. - -This behaves like `dired-ranger-paste' but moves the files -instead of copying them. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-bookmark "dired-ranger" "\ -Bookmark current dired buffer. - -CHAR is a single character (a-zA-Z0-9) representing the bookmark. -Reusing a bookmark replaces the content. These bookmarks are not -persistent, they are used for quick jumping back and forth -between currently used directories. - -\(fn CHAR)" t nil) - -(autoload 'dired-ranger-bookmark-visit "dired-ranger" "\ -Visit bookmark CHAR. - -If the associated dired buffer was killed, we try to reopen it -according to the setting `dired-ranger-bookmark-reopen'. - -The special bookmark `dired-ranger-bookmark-LRU' always jumps to -the least recently visited dired buffer. - -See also `dired-ranger-bookmark'. - -\(fn CHAR)" t nil) - -(register-definition-prefixes "dired-ranger" '("dired-ranger-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-ranger-autoloads.el ends here diff --git a/code/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el b/code/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el deleted file mode 100644 index 634fa93..0000000 --- a/code/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-ranger.el -*- no-byte-compile: t -*- -(define-package "dired-ranger" "20180401.2206" "Implementation of useful ranger features for dired" '((dash "2.7.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/code/elpa/dired-ranger-20180401.2206/dired-ranger.el b/code/elpa/dired-ranger-20180401.2206/dired-ranger.el deleted file mode 100644 index a36b218..0000000 --- a/code/elpa/dired-ranger-20180401.2206/dired-ranger.el +++ /dev/null @@ -1,299 +0,0 @@ -;;; dired-ranger.el --- Implementation of useful ranger features for dired - -;; Copyright (C) 2014-2015 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Version: 0.0.1 -;; Package-Version: 20180401.2206 -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Created: 17th June 2014 -;; Package-requires: ((dash "2.7.0") (dired-hacks-utils "0.0.1")) -;; Keywords: files - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This package implements useful features present in the -;; [ranger](http://ranger.github.io/) file manager which are missing -;; in dired. - -;; Multi-stage copy/pasting of files -;; --------------------------------- - -;; A feature present in most orthodox file managers is a "two-stage" -;; copy/paste process. Roughly, the user first selects some files, -;; "copies" them into a clipboard and then pastes them to the target -;; location. This workflow is missing in dired. - -;; In dired, user first marks the files, then issues the -;; `dired-do-copy' command which prompts for the destination. The -;; files are then copied there. The `dired-dwim-target' option makes -;; this a bit friendlier---if two dired windows are opened, the other -;; one is automatically the default target. - -;; With the multi-stage operations, you can gather files from -;; *multiple* dired buffers into a single "clipboard", then copy or -;; move all of them to the target location. Another huge advantage is -;; that if the target dired buffer is already opened, switching to it -;; via ido or ibuffer is often faster than selecting the path. - -;; Call `dired-ranger-copy' to add marked files (or the file under -;; point if no files are marked) to the "clipboard". With non-nil -;; prefix argument, add the marked files to the current clipboard. - -;; Past clipboards are stored in `dired-ranger-copy-ring' so you can -;; repeat the past pastes. - -;; Call `dired-ranger-paste' or `dired-ranger-move' to copy or move -;; the files in the current clipboard to the current dired buffer. -;; With raw prefix argument (usually C-u), the clipboard is not -;; cleared, so you can repeat the copy operation in another dired -;; buffer. - -;; Bookmarks -;; --------- - -;; Use `dired-ranger-bookmark' to bookmark current dired buffer. You -;; can later quickly revisit it by calling -;; `dired-ranger-bookmark-visit'. - -;; A bookmark name is any single character, letter, digit or a symbol. - -;; A special bookmark with name `dired-ranger-bookmark-LRU' represents -;; the least recently used dired buffer. Its default value is `. If -;; you bind `dired-ranger-bookmark-visit' to the same keybinding, -;; hitting `` will instantly bring you to the previously used dired -;; buffer. This can be used to toggle between two dired buffers in a -;; very fast way. - -;; These bookmarks are not persistent. If you want persistent -;; bookmarks use the bookmarks provided by emacs, see (info "(emacs) -;; Bookmarks"). - -;;; Code: - -(require 'dired-hacks-utils) -(require 'dash) -(require 'ring) - -(defgroup dired-ranger () - "Implementation of useful ranger features for dired." - :group 'dired-hacks - :prefix "dired-ranger-") - - -;; multi-stage copy/paste operations -(defcustom dired-ranger-copy-ring-size 10 - "Specifies how many filesets for copy/paste operations should be stored." - :type 'integer - :group 'dired-ranger) - -(defvar dired-ranger-copy-ring (make-ring dired-ranger-copy-ring-size)) - -;;;###autoload -(defun dired-ranger-copy (arg) - "Place the marked items in the copy ring. - -With non-nil prefix argument, add the marked items to the current -selection. This allows you to gather files from multiple dired -buffers for a single paste." - (interactive "P") - ;; TODO: add dired+ `dired-get-marked-files' support? - (let ((marked (dired-get-marked-files))) - (if (or (not arg) - (ring-empty-p dired-ranger-copy-ring)) - (progn - (ring-insert - dired-ranger-copy-ring - (cons (list (current-buffer)) marked)) - ;; TODO: abstract the message/plural detection somewhere - ;; (e.g. give it a verb and number to produce the correct - ;; string.) - (message (format "Copied %d item%s into copy ring." - (length marked) - (if (> (length marked) 1) "s" "")))) - (let ((current (ring-remove dired-ranger-copy-ring 0))) - (ring-insert - dired-ranger-copy-ring - (cons (-distinct (cons (current-buffer) (car current))) - (-distinct (-concat (dired-get-marked-files) (cdr current))))) - (message (format "Added %d item%s into copy ring." - (length marked) - (if (> (length marked) 1) "s" ""))))))) - -(defun dired-ranger--revert-target (char target-directory files) - "Revert the target buffer and mark the new files. - -CHAR is the temporary value for `dired-marker-char'. - -TARGET-DIRECTORY is the current dired directory. - -FILES is the list of files (from the `dired-ranger-copy-ring') we -operated on." - (let ((current-file (dired-utils-get-filename))) - (revert-buffer) - (let ((dired-marker-char char)) - (--each (-map 'file-name-nondirectory files) - (dired-utils-goto-line (concat target-directory it)) - (dired-mark 1))) - (dired-utils-goto-line current-file))) - -;;;###autoload -(defun dired-ranger-paste (arg) - "Copy the items from copy ring to current directory. - -With raw prefix argument \\[universal-argument], do not remove -the selection from the stack so it can be copied again. - -With numeric prefix argument, copy the n-th selection from the -copy ring." - (interactive "P") - (let* ((index (if (numberp arg) arg 0)) - (data (ring-ref dired-ranger-copy-ring index)) - (files (cdr data)) - (target-directory (dired-current-directory)) - (copied-files 0)) - (--each files (when (file-exists-p it) - (if (file-directory-p it) - (copy-directory it target-directory) - (condition-case err - (copy-file it target-directory 0) - (file-already-exists nil))) - (cl-incf copied-files))) - (dired-ranger--revert-target ?P target-directory files) - (unless arg (ring-remove dired-ranger-copy-ring 0)) - (message (format "Pasted %d/%d item%s from copy ring." - copied-files - (length files) - (if (> (length files) 1) "s" ""))))) - -;;;###autoload -(defun dired-ranger-move (arg) - "Move the items from copy ring to current directory. - -This behaves like `dired-ranger-paste' but moves the files -instead of copying them." - (interactive "P") - (let* ((index (if (numberp arg) arg 0)) - (data (ring-ref dired-ranger-copy-ring index)) - (buffers (car data)) - (files (cdr data)) - (target-directory (dired-current-directory)) - (copied-files 0)) - (--each files (when (file-exists-p it) - (condition-case err - (rename-file it target-directory 0) - (file-already-exists nil)) - (cl-incf copied-files))) - (dired-ranger--revert-target ?M target-directory files) - (--each buffers - (when (buffer-live-p it) - (with-current-buffer it (revert-buffer)))) - (unless arg (ring-remove dired-ranger-copy-ring 0)) - (message (format "Moved %d/%d item%s from copy ring." - copied-files - (length files) - (if (> (length files) 1) "s" ""))))) - - -;; bookmarks -(defcustom dired-ranger-bookmark-reopen 'ask - "Should we reopen closed dired buffer when visiting a bookmark? - -This does only correctly reopen regular dired buffers listing one -directory. Special dired buffers like the output of `find-dired' -or `ag-dired', virtual dired buffers and subdirectories can not -be recreated. - -The value 'never means never reopen the directory. - -The value 'always means always reopen the directory. - -The value 'ask will ask if we should reopen or not. Reopening a -dired buffer for a directory that is already opened in dired will -bring that up, which might be unexpected as that directory might -come from a non-standard source (i.e. not be file-system -backed)." - :type '(radio - (const :tag "Never reopen automatically." never) - (const :tag "Always reopen automatically." always) - (const :tag "Reopen automatically only in standard dired buffers, ask otherwise." ask)) - :group 'dired-ranger) - -(defcustom dired-ranger-bookmark-LRU ?` - "Bookmark representing the least recently used/visited dired buffer. - -If a dired buffer is currently active, select the one visited -before. If a non-dired buffer is active, visit the least -recently visited dired buffer." - :type 'char - :group 'dired-ranger) - -(defvar dired-ranger-bookmarks nil - "An alist mapping bookmarks to dired buffers and locations.") - -;;;###autoload -(defun dired-ranger-bookmark (char) - "Bookmark current dired buffer. - -CHAR is a single character (a-zA-Z0-9) representing the bookmark. -Reusing a bookmark replaces the content. These bookmarks are not -persistent, they are used for quick jumping back and forth -between currently used directories." - (interactive "cBookmark name: ") - (let ((dir (file-truename default-directory))) - (-if-let (value (cdr (assoc char dired-ranger-bookmarks))) - (setf (cdr (assoc char dired-ranger-bookmarks)) (cons dir (current-buffer))) - (push (-cons* char dir (current-buffer)) dired-ranger-bookmarks)) - (message "Bookmarked directory %s as `%c'" dir char))) - -;;;###autoload -(defun dired-ranger-bookmark-visit (char) - "Visit bookmark CHAR. - -If the associated dired buffer was killed, we try to reopen it -according to the setting `dired-ranger-bookmark-reopen'. - -The special bookmark `dired-ranger-bookmark-LRU' always jumps to -the least recently visited dired buffer. - -See also `dired-ranger-bookmark'." - (interactive "cBookmark name: ") - (if (eq char dired-ranger-bookmark-LRU) - (progn - (let ((buffers (buffer-list))) - (when (eq (with-current-buffer (car buffers) major-mode) 'dired-mode) - (pop buffers)) - (switch-to-buffer (--first (eq (with-current-buffer it major-mode) 'dired-mode) buffers)))) - (-if-let* ((value (cdr (assoc char dired-ranger-bookmarks))) - (dir (car value)) - (buffer (cdr value))) - (if (buffer-live-p buffer) - (switch-to-buffer buffer) - (when - ;; TODO: abstract this never/always/ask pattern. It is - ;; also used in filter. - (cond - ((eq dired-ranger-bookmark-reopen 'never) nil) - ((eq dired-ranger-bookmark-reopen 'always) t) - ((eq dired-ranger-bookmark-reopen 'ask) - (y-or-n-p (format "The dired buffer referenced by this bookmark does not exist. Should we try to reopen `%s'?" dir)))) - (find-file dir) - (setf (cdr (assoc char dired-ranger-bookmarks)) (cons dir (current-buffer))))) - (message "Bookmark `%c' does not exist." char)))) - -(provide 'dired-ranger) -;;; dired-ranger.el ends here diff --git a/code/elpa/dired-single-20211101.2319/dired-single-pkg.el b/code/elpa/dired-single-20211101.2319/dired-single-pkg.el index cc8a0b8..b70590e 100644 --- a/code/elpa/dired-single-20211101.2319/dired-single-pkg.el +++ b/code/elpa/dired-single-20211101.2319/dired-single-pkg.el @@ -1,2 +1,2 @@ -;;; Generated package description from dired-single.el -*- no-byte-compile: t -*- -(define-package "dired-single" "20211101.2319" "Reuse the current dired buffer to visit a directory" 'nil :commit "b254f9b7bfc96a5eab5760a56811f2872d2c590a" :keywords '("dired" "reuse" "buffer") :url "https://github.com/crocket/dired-single") +;;; Generated package description from dired-single.el -*- no-byte-compile: t -*- +(define-package "dired-single" "20211101.2319" "Reuse the current dired buffer to visit a directory" 'nil :commit "b254f9b7bfc96a5eab5760a56811f2872d2c590a" :keywords '("dired" "reuse" "buffer") :url "https://github.com/crocket/dired-single") diff --git a/code/elpa/git-20140128.1041/git-autoloads.el b/code/elpa/git-20140128.1041/git-autoloads.el new file mode 100644 index 0000000..219c6d3 --- /dev/null +++ b/code/elpa/git-20140128.1041/git-autoloads.el @@ -0,0 +1,22 @@ +;;; git-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "git" "git.el" (0 0 0 0)) +;;; Generated autoloads from git.el + +(register-definition-prefixes "git" '("git-")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; git-autoloads.el ends here diff --git a/code/elpa/git-20140128.1041/git-pkg.el b/code/elpa/git-20140128.1041/git-pkg.el new file mode 100644 index 0000000..6e88e5c --- /dev/null +++ b/code/elpa/git-20140128.1041/git-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from git.el -*- no-byte-compile: t -*- +(define-package "git" "20140128.1041" "An Elisp API for programmatically using Git" '((s "1.7.0") (dash "2.2.0") (f "0.10.0")) :commit "a3396a7027a7d986598c6a2d6d5599bac918f3da" :authors '(("Johan Andersson" . "johan.rejeep@gmail.com")) :maintainer '("Johan Andersson" . "johan.rejeep@gmail.com") :keywords '("git") :url "http://github.com/rejeep/git.el") diff --git a/code/elpa/git-20140128.1041/git.el b/code/elpa/git-20140128.1041/git.el new file mode 100644 index 0000000..f1569bd --- /dev/null +++ b/code/elpa/git-20140128.1041/git.el @@ -0,0 +1,280 @@ +;;; git.el --- An Elisp API for programmatically using Git + +;; Copyright (C) 2013 Johan Andersson + +;; Author: Johan Andersson +;; Maintainer: Johan Andersson +;; Version: 0.1.1 +;; Package-Version: 20140128.1041 +;; Package-Commit: a3396a7027a7d986598c6a2d6d5599bac918f3da +;; Keywords: git +;; URL: http://github.com/rejeep/git.el +;; Package-Requires: ((s "1.7.0") (dash "2.2.0") (f "0.10.0")) + +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code: + +;; Todo: no-pager + +(require 's) +(require 'dash) +(require 'f) + +(defvar git-executable + (executable-find "git") + "Git executable.") + +(defvar git-repo nil + "Path to current working repo.") + +(defvar git-args nil + "List of args to include when running git command.") + +(defconst git-stash-re "^\\(.+?\\): \\(?:WIP on\\|On\\) \\(.+\\): \\(.+\\)$" + "Regular expression matching a stash.") + +(put 'git-error 'error-conditions '(error git-error)) +(put 'git-error 'error-message "GIT Error") + +(defun git-error (string &rest args) + "Signal a GIT error. + +Signal an error with `git-error' type. + +STRING is a `format' string, and ARGS are the formatted objects." + (signal 'git-error (list (apply #'format string args)))) + +(defun git-run (command &rest args) + "Run git COMMAND with ARGS." + (let ((default-directory (f-full git-repo))) + (with-temp-buffer + (let ((exit-code + (apply + 'call-process + (append + (list git-executable nil (current-buffer) nil) + (git--args command args))))) + (if (zerop exit-code) + (buffer-string) + (git-error + "Error running command: %s %s\n%s" + git-executable + (s-join " " (git--args command args)) + (buffer-string))))))) + +(defun git-repo? (directory) + "Return true if there is a git repo in DIRECTORY, false otherwise." + (or + (f-dir? (f-expand ".git" directory)) + (and + (f-dir? (f-expand "info" directory)) + (f-dir? (f-expand "objects" directory)) + (f-dir? (f-expand "refs" directory)) + (f-file? (f-expand "HEAD" directory))))) + +(defun git-branch? (branch) + "Return true if there's a branch called BRANCH." + (-contains? (git-branches) branch)) + +(defun git-tag? (tag) + "Return true if there's a tag called TAG." + (-contains? (git-tags) tag)) + +(defun git-on-branch () + "Return currently active branch." + (condition-case err + (git--clean (git-run "rev-parse" "--abbrev-ref" "HEAD")) + (git-error + (git-error "Repository not initialized")))) + +(defun git-on-branch? (branch) + "Return true if BRANCH is currently active." + (equal branch (git-on-branch))) + +(defun git-add (&rest files) + "Add PATH or everything." + (git-run "add" (or files "."))) + +(defun git-branch (branch) + "Create BRANCH." + (if (git-branch? branch) + (git-error "Branch already exists %s" branch) + (git-run "branch" branch))) + +(defun git-branches () + "List all available branches." + (-map + (lambda (line) + (if (s-starts-with? "*" line) + (substring line 2) + line)) + (git--lines (git-run "branch")))) + +(defun git-checkout (ref) + "Checkout REF." + (git-run "checkout" ref)) + +(defun git-clone (url &optional dir) + "Clone URL to DIR (if present)." + (git-run "clone" url dir)) + +(defun git-commit (message &rest files) + "Commit FILES (or added files) with MESSAGE." + (git-run "commit" (or files "-a") "--message" message files)) + +(defun git-fetch (&optional repo) + "Fetch REPO." + (git-run "fetch" repo)) + +(defun git-init (&optional dir bare) + "Create new Git repo at DIR (or `git-repo'). + +If BARE is true, create a bare repo." + (let ((git-repo (or dir git-repo))) + (git-run "init" (and bare "--bare")))) + +;; Todo: The solution used here is not bulletproof. For example if the +;; message contains a pipe, the :message will only include everything +;; before that pipe. Figure out a good solution for this. +(defun git-log (&optional branch) + "Log history on BRANCH." + (let ((logs (git--lines (git-run "log" "--format=%h|%an|%ae|%cn|%ce|%ad|%s")))) + (-map + (lambda (log) + (let ((data (s-split "|" log))) + (list + :commit (nth 0 data) + :author-name (nth 1 data) + :author-email (nth 2 data) + :comitter-name (nth 3 data) + :comitter-email (nth 4 data) + :date (nth 5 data) + :message (nth 6 data)))) + logs))) + +(defun git-config (option &optional value) + "Set or get config OPTION. Set to VALUE if present." + (condition-case err + (git--clean (git-run "config" option value)) + (git-error))) + +(defun git-pull (&optional repo ref) + "Pull REF from REPO." + (git-run "pull" repo ref)) + +(defun git-push (&optional repo ref) + "Push REF to REPO." + (git-run "push" repo ref)) + +(defun git-remote? (name) + "Return true if remote with NAME exists, false otherwise." + (-contains? (git-remotes) name)) + +(defun git-remotes () + "Return list of all remotes." + (git--lines (git-run "remote"))) + +(defun git-remote-add (name url) + "Add remote with NAME and URL." + (git-run "remote" "add" name url)) + +(defun git-remote-remove (name) + "Remove remote with NAME." + (if (git-remote? name) + (git-run "remote" "remove" name) + (git-error "No such remote %s" name))) + +(defun git-reset (&optional commit mode) + "Reset to COMMIT with MODE." + (git-run "reset" (if mode (concat "--" (symbol-name mode))) commit)) + +(defun git-rm (path &optional recursive) + "Remove PATH. + +To remove directory, use RECURSIVE argument." + (git-run "rm" path (and recursive "-r"))) + +(defun git-stash (&optional message) + "Stash changes in a dirty tree with MESSAGE. + +If a stash was created, the name of the stash is returned, +otherwise nil is returned." + (let ((before-stashes (git-stashes)) after-stashes) + (git-run "stash" "save" message) + (setq after-stashes (git-stashes)) + (if (> (length after-stashes) (length before-stashes)) + (plist-get (car after-stashes) :name)))) + +(defun git-stashes () + "Return list of stashes." + (let ((stashes (git--lines (git-run "stash" "list")))) + (-map + (lambda (stash) + (let ((matches (s-match git-stash-re stash))) + (list :name (nth 1 matches) + :branch (nth 2 matches) + :message (nth 3 matches)))) + stashes))) + +(defun git-stash-pop (&optional name) + "Apply and remove stash with NAME (or first stash)." + (git-run "stash" "pop" name)) + +(defun git-stash-apply (&optional name) + "Apply and keep stash with NAME (or first stash)." + (git-run "stash" "apply" name)) + +(defun git-tag (tag) + "Create TAG." + (if (git-tag? tag) + (git-error "Tag already exists %s" tag) + (git-run "tag" tag))) + +(defun git-tags () + "Return list of all tags." + (git--lines (git-run "tag"))) + +(defun git-untracked-files () + "Return list of untracked files." + (git--lines + (git-run "ls-files" "--other" "--exclude-standard"))) + +(defun git-staged-files () + "Return list of staged files." + (git--lines + (git-run "diff" "--cached" "--name-only"))) + + +;;;; Helpers + +(defun git--lines (string) + (-reject 's-blank? (-map 's-trim (s-lines string)))) + +(defun git--clean (string) + (s-presence (s-trim string))) + +(defun git--args (command &rest args) + (-flatten (-reject 'null (append (list "--no-pager" command) args git-args)))) + + +(provide 'git) + +;;; git.el ends here diff --git a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-autoloads.el b/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-autoloads.el deleted file mode 100644 index 513daa9..0000000 --- a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-autoloads.el +++ /dev/null @@ -1,43 +0,0 @@ -;;; all-the-icons-dired-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "all-the-icons-dired" "all-the-icons-dired.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from all-the-icons-dired.el - -(autoload 'all-the-icons-dired-mode "all-the-icons-dired" "\ -Display all-the-icons icon for each file in a dired buffer. - -This is a minor mode. If called interactively, toggle the -`All-The-Icons-Dired mode' mode. If the prefix argument is -positive, enable the mode, and if it is zero or negative, disable -the mode. - -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. - -To check whether the minor mode is enabled in the current buffer, -evaluate `all-the-icons-dired-mode'. - -The mode's hook is called both when the mode is enabled and when -it is disabled. - -\(fn &optional ARG)" t nil) - -(register-definition-prefixes "all-the-icons-dired" '("all-the-icons-dired-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; all-the-icons-dired-autoloads.el ends here diff --git a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el b/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el deleted file mode 100644 index a6ce0d7..0000000 --- a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from all-the-icons-dired.el -*- no-byte-compile: t -*- -(define-package "all-the-icons-dired" "20220304.1638" "Shows icons for each file in dired mode" '((emacs "24.4") (all-the-icons "2.2.0")) :commit "147ed0dfd1034a686795a08dc63e2c293128597e" :authors '(("jtbm37")) :maintainer '("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") :keywords '("files" "icons" "dired") :url "https://github.com/wyuenho/all-the-icons-dired") diff --git a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired.el b/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired.el deleted file mode 100644 index 5c10ac4..0000000 --- a/org/elpa/all-the-icons-dired-20220304.1638/all-the-icons-dired.el +++ /dev/null @@ -1,159 +0,0 @@ -;;; all-the-icons-dired.el --- Shows icons for each file in dired mode -*- lexical-binding: t; -*- - -;; Copyright (C) 2016-2020 jtbm37 -;; Copyright (C) 2021 Jimmy Yuen Ho Wong - -;; Author: jtbm37 -;; Maintainer: Jimmy Yuen Ho Wong -;; Version: 2.0 -;; Package-Version: 20220304.1638 -;; Package-Commit: 147ed0dfd1034a686795a08dc63e2c293128597e -;; Keywords: files icons dired -;; Package-Requires: ((emacs "24.4") (all-the-icons "2.2.0")) -;; URL: https://github.com/wyuenho/all-the-icons-dired - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: -;; To use this package, simply add this to your init.el: -;; (add-hook 'dired-mode-hook 'all-the-icons-dired-mode) - -;; To manually install, add this to your init.el before the hook mentioned above. -;; (add-to-load-path (expand-file-name "~/path/to/all-the-icons-dired")) -;; (load "all-the-icons-dired.el") - - -;;; Code: - -(require 'cl-lib) -(require 'dired) -(require 'all-the-icons) -(require 'subr-x) - -(defface all-the-icons-dired-dir-face - '((((background dark)) :foreground "white") - (((background light)) :foreground "black")) - "Face for the directory icon" - :group 'all-the-icons-faces) - -(defcustom all-the-icons-dired-v-adjust 0.01 - "The default vertical adjustment of the icon in the dired buffer." - :group 'all-the-icons - :type 'number) - -(defcustom all-the-icons-dired-monochrome t - "Whether to show the icons as the same color as the text on the same line." - :group 'all-the-icons - :type 'boolean) - -(defvar all-the-icons-dired-mode) - -(defun all-the-icons-dired--add-overlay (pos string) - "Add overlay to display STRING at POS." - (let ((ov (make-overlay (1- pos) pos))) - (overlay-put ov 'all-the-icons-dired-overlay t) - (overlay-put ov 'after-string string))) - -(defun all-the-icons-dired--overlays-in (beg end) - "Get all all-the-icons-dired overlays between BEG to END." - (cl-remove-if-not - (lambda (ov) - (overlay-get ov 'all-the-icons-dired-overlay)) - (overlays-in beg end))) - -(defun all-the-icons-dired--overlays-at (pos) - "Get all-the-icons-dired overlays at POS." - (apply #'all-the-icons-dired--overlays-in `(,pos ,pos))) - -(defun all-the-icons-dired--remove-all-overlays () - "Remove all `all-the-icons-dired' overlays." - (save-restriction - (widen) - (mapc #'delete-overlay - (all-the-icons-dired--overlays-in (point-min) (point-max))))) - -(defun all-the-icons-dired--refresh () - "Display the icons of files in a dired buffer." - (all-the-icons-dired--remove-all-overlays) - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (when (dired-move-to-filename nil) - (let ((case-fold-search t)) - (when-let* ((file (dired-get-filename 'relative 'noerror)) - (icon (if (file-directory-p file) - (all-the-icons-icon-for-dir file - :face 'all-the-icons-dired-dir-face - :v-adjust all-the-icons-dired-v-adjust) - (apply 'all-the-icons-icon-for-file file - (append - `(:v-adjust ,all-the-icons-dired-v-adjust) - (when all-the-icons-dired-monochrome - `(:face ,(face-at-point)))))))) - (if (member file '("." "..")) - (all-the-icons-dired--add-overlay (dired-move-to-filename) " \t") - (all-the-icons-dired--add-overlay (dired-move-to-filename) (concat icon "\t")))))) - (forward-line 1)))) - -(defun all-the-icons-dired--refresh-advice (fn &rest args) - "Advice function for FN with ARGS." - (prog1 (apply fn args) - (when all-the-icons-dired-mode - (all-the-icons-dired--refresh)))) - -(defvar all-the-icons-dired-advice-alist - '((dired-aux dired-do-redisplay all-the-icons-dired--refresh-advice) - (dired-aux dired-create-directory all-the-icons-dired--refresh-advice) - (dired-aux dired-do-create-files all-the-icons-dired--refresh-advice) - (dired-aux dired-do-kill-lines all-the-icons-dired--refresh-advice) - (dired-aux dired-do-rename all-the-icons-dired--refresh-advice) - (dired-aux dired-insert-subdir all-the-icons-dired--refresh-advice) - (dired-aux dired-kill-subdir all-the-icons-dired--refresh-advice) - (dired wdired-abort-changes all-the-icons-dired--refresh-advice) - (dired dired-internal-do-deletions all-the-icons-dired--refresh-advice) - (dired-narrow dired-narrow--internal all-the-icons-dired--refresh-advice) - (dired-subtree dired-subtree-insert all-the-icons-dired--refresh-advice) - (dired-subtree dired-subtree-remove all-the-icons-dired--refresh-advice) - (dired dired-readin all-the-icons-dired--refresh-advice) - (dired dired-revert all-the-icons-dired--refresh-advice) - (find-dired find-dired-sentinel all-the-icons-dired--refresh-advice)) - "A list of file, adviced function, and advice function.") - -(defun all-the-icons-dired--setup () - "Setup `all-the-icons-dired'." - (setq-local tab-width 1) - (pcase-dolist (`(,file ,sym ,fn) all-the-icons-dired-advice-alist) - (with-eval-after-load file - (advice-add sym :around fn))) - (all-the-icons-dired--refresh)) - -(defun all-the-icons-dired--teardown () - "Functions used as advice when redisplaying buffer." - (kill-local-variable 'tab-width) - (pcase-dolist (`(,file ,sym ,fn) all-the-icons-dired-advice-alist) - (with-eval-after-load file - (advice-remove sym fn))) - (all-the-icons-dired--remove-all-overlays)) - -;;;###autoload -(define-minor-mode all-the-icons-dired-mode - "Display all-the-icons icon for each file in a dired buffer." - :lighter " all-the-icons-dired-mode" - (when (derived-mode-p 'dired-mode) - (if all-the-icons-dired-mode - (all-the-icons-dired--setup) - (all-the-icons-dired--teardown)))) - -(provide 'all-the-icons-dired) -;;; all-the-icons-dired.el ends here diff --git a/org/elpa/dashboard-20220409.620/banners/1.txt b/org/elpa/dashboard-20220409.620/banners/1.txt new file mode 100644 index 0000000..8bd71a7 --- /dev/null +++ b/org/elpa/dashboard-20220409.620/banners/1.txt @@ -0,0 +1,8 @@ + +######## ## ## ### ###### ###### +## ### ### ## ## ## ## ## ## +## #### #### ## ## ## ## +###### ## ### ## ## ## ## ###### +## ## ## ######### ## ## +## ## ## ## ## ## ## ## ## +######## ## ## ## ## ###### ###### diff --git a/org/elpa/dashboard-20220409.620/banners/2.txt b/org/elpa/dashboard-20220409.620/banners/2.txt new file mode 100644 index 0000000..73b761b --- /dev/null +++ b/org/elpa/dashboard-20220409.620/banners/2.txt @@ -0,0 +1,6 @@ + _______ .___ ___. ___ ______ _______. +| ____|| \/ | / \ / | / | +| |__ | \ / | / ^ \ | ,----' | (----` +| __| | |\/| | / /_\ \ | | \ \ +| |____ | | | | / _____ \ | `----.----) | +|_______||__| |__| /__/ \__\ \______|_______/ diff --git a/org/elpa/dashboard-20220409.620/banners/3.txt b/org/elpa/dashboard-20220409.620/banners/3.txt new file mode 100644 index 0000000..3abfd82 --- /dev/null +++ b/org/elpa/dashboard-20220409.620/banners/3.txt @@ -0,0 +1,8 @@ + _______ _____ ______ ________ ________ ________ +|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\ +\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_ + \ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \ + \ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \ + \ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \ + \|_______|\|__| \|__|\|__|\|__|\|_______|\_________\ + \|_________| diff --git a/org/elpa/dashboard-20220409.620/banners/4.txt b/org/elpa/dashboard-20220409.620/banners/4.txt new file mode 100644 index 0000000..d82d67c --- /dev/null +++ b/org/elpa/dashboard-20220409.620/banners/4.txt @@ -0,0 +1,17 @@ +_ ___ _ _ +_ ___ __ ___ __ _ ___ +__ _ ___ __ ___ + _ ___ _ + _ _ __ _ + ___ __ _ + __ _ + _ _ _ + _ _ _ + _ _ _ + __ ___ + _ _ _ _ + _ _ + _ _ + _ _ + _ +__ diff --git a/org/elpa/dashboard-20220409.620/banners/emacs.png b/org/elpa/dashboard-20220409.620/banners/emacs.png new file mode 100644 index 0000000..718b071 Binary files /dev/null and b/org/elpa/dashboard-20220409.620/banners/emacs.png differ diff --git a/org/elpa/dashboard-20220409.620/banners/logo.png b/org/elpa/dashboard-20220409.620/banners/logo.png new file mode 100644 index 0000000..c9de00c Binary files /dev/null and b/org/elpa/dashboard-20220409.620/banners/logo.png differ diff --git a/org/elpa/dashboard-20220409.620/dashboard-autoloads.el b/org/elpa/dashboard-20220409.620/dashboard-autoloads.el new file mode 100644 index 0000000..6d2d64a --- /dev/null +++ b/org/elpa/dashboard-20220409.620/dashboard-autoloads.el @@ -0,0 +1,39 @@ +;;; dashboard-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dashboard" "dashboard.el" (0 0 0 0)) +;;; Generated autoloads from dashboard.el + +(autoload 'dashboard-setup-startup-hook "dashboard" "\ +Setup post initialization hooks. +If a command line argument is provided, assume a filename and skip displaying +Dashboard." nil nil) + +(register-definition-prefixes "dashboard" '("dashboard-")) + +;;;*** + +;;;### (autoloads nil "dashboard-widgets" "dashboard-widgets.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from dashboard-widgets.el + +(register-definition-prefixes "dashboard-widgets" '("dashboard-" "org-time-less-p" "recentf-list")) + +;;;*** + +;;;### (autoloads nil nil ("dashboard-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dashboard-autoloads.el ends here diff --git a/org/elpa/dashboard-20220409.620/dashboard-pkg.el b/org/elpa/dashboard-20220409.620/dashboard-pkg.el new file mode 100644 index 0000000..6b8e0da --- /dev/null +++ b/org/elpa/dashboard-20220409.620/dashboard-pkg.el @@ -0,0 +1,12 @@ +(define-package "dashboard" "20220409.620" "A startup screen extracted from Spacemacs" + '((emacs "26.1")) + :commit "09290bf700cc269ad3c07d9518cd758b90971fcd" :authors + '(("Rakan Al-Hneiti" . "rakan.alhneiti@gmail.com")) + :maintainer + '("Jesús Martínez" . "jesusmartinez93@gmail.com") + :keywords + '("startup" "screen" "tools" "dashboard") + :url "https://github.com/emacs-dashboard/emacs-dashboard") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/org/elpa/dashboard-20220409.620/dashboard-widgets.el b/org/elpa/dashboard-20220409.620/dashboard-widgets.el new file mode 100644 index 0000000..8168afe --- /dev/null +++ b/org/elpa/dashboard-20220409.620/dashboard-widgets.el @@ -0,0 +1,1267 @@ +;;; dashboard-widgets.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2022 emacs-dashboard maintainers +;; +;; Author : Rakan Al-Hneiti +;; Maintainer : Jesús Martínez +;; Shen, Jen-Chieh +;; URL : https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "26.1")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projects (projectile or project.el), org-agenda and more. + +;;; Code: + +(require 'cl-lib) +(require 'subr-x) +(require 'image) + +;; Compiler pacifier +(declare-function all-the-icons-icon-for-dir "ext:all-the-icons.el") +(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") +(declare-function all-the-icons-fileicon "ext:data-fileicons.el") +(declare-function all-the-icons-octicon "ext:data-octicons.el") +(declare-function bookmark-get-filename "ext:bookmark.el") +(declare-function bookmark-all-names "ext:bookmark.el") +(declare-function calendar-date-compare "ext:calendar.el") +(declare-function projectile-cleanup-known-projects "ext:projectile.el") +(declare-function projectile-load-known-projects "ext:projectile.el") +(declare-function projectile-mode "ext:projectile.el") +(declare-function projectile-relevant-known-projects "ext:projectile.el") +;;; project.el in Emacs 26 does not contain this function +(declare-function project-known-project-roots "ext:project.el" nil t) +(declare-function project-forget-zombie-projects "ext:project.el" nil t) +(declare-function org-agenda-format-item "ext:org-agenda.el") +(declare-function org-compile-prefix-format "ext:org-agenda.el") +(declare-function org-entry-is-done-p "ext:org.el") +(declare-function org-in-archived-heading-p "ext:org.el") +(declare-function org-get-category "ext:org.el") +(declare-function org-get-deadline-time "ext:org.el") +(declare-function org-get-heading "ext:org.el") +(declare-function org-get-scheduled-time "ext:org.el") +(declare-function org-get-tags "ext:org.el") +(declare-function org-map-entries "ext:org.el") +(declare-function org-outline-level "ext:org.el") +(declare-function org-today "ext:org.el") +(declare-function org-get-todo-face "ext:org.el") +(declare-function org-get-todo-state "ext:org.el") +(declare-function org-entry-is-todo-p "ext:org.el") +(declare-function org-release-buffers "ext:org.el") +(declare-function recentf-cleanup "ext:recentf.el") +(defalias 'org-time-less-p 'time-less-p) +(defvar org-level-faces) +(defvar org-agenda-new-buffers) +(defvar org-agenda-prefix-format) +(defvar org-agenda-todo-keyword-format) +(defvar org-todo-keywords-1) +(defvar all-the-icons-dir-icon-alist) +(defvar package-activated-list) + +(defcustom dashboard-page-separator "\n\n" + "Separator to use between the different pages." + :type 'string + :group 'dashboard) + +(defcustom dashboard-image-banner-max-height 0 + "Maximum height of banner image. + +This setting applies only if Emacs supports image transforms or +compiled with Imagemagick support. When value is non-zero the image +banner will be resized to the specified height in pixels, with aspect +ratio preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-image-banner-max-width 0 + "Maximum width of banner image. + +This setting applies if Emacs supports image transforms or compiled +with Imagemagick support. When value is non-zero the image banner +will be resized to the specified width in pixels, with aspect ratio +preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-set-heading-icons nil + "When non nil, heading sections will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-file-icons nil + "When non nil, file lists will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-navigator nil + "When non nil, a navigator will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-init-info t + "When non nil, init info will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-footer t + "When non nil, a footer will be displayed at the bottom." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-footer-messages + '("The one true editor, Emacs!" + "Who the hell uses VIM anyway? Go Evil!" + "Free as free speech, free as free Beer" + "Happy coding!" + "Vi Vi Vi, the editor of the beast" + "Welcome to the church of Emacs" + "While any text editor can save your files, only Emacs can save your soul" + "I showed you my source code, pls respond") + "A list of messages, one of which dashboard chooses to display." + :type 'list + :group 'dashboard) + +(defcustom dashboard-show-shortcuts t + "Whether to show shortcut keys for each section." + :type 'boolean + :group 'dashboard) + +(defconst dashboard-banners-directory + (concat (file-name-directory (locate-library "dashboard")) "banners/") + "Default banner directory.") + +(defconst dashboard-banner-official-png + (concat dashboard-banners-directory "emacs.png") + "Emacs banner image.") + +(defconst dashboard-banner-logo-png + (concat dashboard-banners-directory "logo.png") + "Emacs banner image.") + +(defconst dashboard-banner-length 75 + "Width of a banner.") + +(defcustom dashboard-banner-logo-title "Welcome to Emacs!" + "Specify the startup banner." + :type 'string + :group 'dashboard) + +(defcustom dashboard-navigator-buttons nil + "Specify the navigator buttons. +The format is: 'icon title help action face prefix suffix'. + +Example: +'((\"☆\" \"Star\" \"Show stars\" (lambda (&rest _) + (show-stars)) 'warning \"[\" \"]\"))" + :type '(repeat (repeat (list string string string function symbol string string))) + :group 'dashboard) + +(defcustom dashboard-init-info + (lambda () + (let ((package-count 0) (time (emacs-init-time))) + (when (bound-and-true-p package-alist) + (setq package-count (length package-activated-list))) + (when (boundp 'straight--profile-cache) + (setq package-count (+ (hash-table-count straight--profile-cache) package-count))) + (if (zerop package-count) + (format "Emacs started in %s" time) + (format "%d packages loaded in %s" package-count time)))) + "Init info with packages loaded and init time." + :type '(function string) + :group 'dashboard) + +(defcustom dashboard-footer + (nth (random (1- (1+ (length dashboard-footer-messages)))) dashboard-footer-messages) + "A footer with some short message." + :type 'string + :group 'dashboard) + +(defcustom dashboard-footer-icon + (if (and (display-graphic-p) + (or (fboundp 'all-the-icons-fileicon) + (require 'all-the-icons nil 'noerror))) + (all-the-icons-fileicon "emacs" + :height 1.1 + :v-adjust -0.05 + :face 'font-lock-keyword-face) + (propertize ">" 'face 'dashboard-footer)) + "Footer's icon." + :type 'string + :group 'dashboard) + +(defcustom dashboard-startup-banner 'official + "Specify the startup banner. +Default value is `official', it displays the Emacs logo. `logo' displays Emacs +alternative logo. An integer value is the index of text banner. A string +value must be a path to a .PNG or .TXT file. If the value is nil then no banner +is displayed." + :type '(choice (const :tag "offical" official) + (const :tag "logo" logo) + (string :tag "a png or txt path")) + :group 'dashboard) + +(defcustom dashboard-buffer-last-width nil + "Previous width of dashboard-buffer." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-item-generators + '((recents . dashboard-insert-recents) + (bookmarks . dashboard-insert-bookmarks) + (projects . dashboard-insert-projects) + (agenda . dashboard-insert-agenda) + (registers . dashboard-insert-registers)) + "Association list of items to how to generate in the startup buffer. +Will be of the form `(list-type . list-function)'. +Possible values for list-type are: `recents', `bookmarks', `projects', +`agenda' ,`registers'." + :type '(repeat (alist :key-type symbol :value-type function)) + :group 'dashboard) + +(defcustom dashboard-projects-backend 'projectile + "The package that supplies the list of recent projects. +With the value `projectile', the projects widget uses the package +projectile (available in MELPA). With the value `project-el', +the widget uses the package project (available in GNU ELPA). + +To activate the projects widget, add e.g. `(projects . 10)' to +`dashboard-items' after making sure the necessary package is +installed." + :type '(choice (const :tag "Use projectile" projectile) + (const :tag "Use project.el" project-el)) + :group 'dashboard) + +(defcustom dashboard-items + '((recents . 5) + (bookmarks . 5) + (agenda . 5)) + "Association list of items to show in the startup buffer. +Will be of the form `(list-type . list-size)'. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'." + :type '(repeat (alist :key-type symbol :value-type integer)) + :group 'dashboard) + +(defcustom dashboard-item-shortcuts + '((recents . "r") + (bookmarks . "m") + (projects . "p") + (agenda . "a") + (registers . "e")) + "Association list of items and their corresponding shortcuts. +Will be of the form `(list-type . keys)' as understood by `(kbd keys)'. +If nil, shortcuts are disabled. If an entry's value is nil, that item's +shortcut is disbaled. See `dashboard-items' for possible values of list-type.'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defcustom dashboard-item-names nil + "Association list of item heading names. +When an item is nil or not present, the default name is used. +Will be of the form `(default-name . new-name)'." + :type '(alist :key-type string :value-type string) + :options '("Recent Files:" "Bookmarks:" "Agenda for today:" + "Agenda for the coming week:" "Registers:" "Projects:") + :group 'dashboard) + +(defcustom dashboard-items-default-length 20 + "Length used for startup lists with otherwise unspecified bounds. +Set to nil for unbounded." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-heading-icons + '((recents . "history") + (bookmarks . "bookmark") + (agenda . "calendar") + (projects . "rocket") + (registers . "database")) + "Association list for the icons of the heading sections. +Will be of the form `(list-type . icon-name-string)`. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defcustom dashboard-path-style nil + "Style to display path." + :type '(choice + (const :tag "No specify" nil) + (const :tag "Truncate the beginning part of the path" truncate-beginning) + (const :tag "Truncate the middle part of the path" truncate-middle) + (const :tag "Truncate the end part of the path" truncate-end)) + :group 'dashboard) + +(defcustom dashboard-path-max-length 70 + "Maximum length for path to display." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-path-shorten-string "..." + "String the that displays in the center of the path." + :type 'string + :group 'dashboard) + +(defvar recentf-list nil) + +(defvar dashboard-buffer-name) + +;; +;; Faces +;; +(defface dashboard-text-banner + '((t (:inherit font-lock-keyword-face))) + "Face used for text banners." + :group 'dashboard) + +(defface dashboard-banner-logo-title + '((t :inherit default)) + "Face used for the banner title." + :group 'dashboard) + +(defface dashboard-navigator + '((t (:inherit font-lock-keyword-face))) + "Face used for the navigator." + :group 'dashboard) + +(defface dashboard-heading + '((t (:inherit font-lock-keyword-face))) + "Face used for widget headings." + :group 'dashboard) + +(defface dashboard-items-face + '((t (:inherit widget-button))) + "Face used for items." + :group 'dashboard) + +(defface dashboard-no-items-face + '((t (:inherit widget-button))) + "Face used for no items." + :group 'dashboard) + +(defface dashboard-footer + '((t (:inherit font-lock-doc-face))) + "Face used for widget headings." + :group 'dashboard) + +(define-obsolete-face-alias + 'dashboard-text-banner-face 'dashboard-text-banner "1.2.6") +(define-obsolete-face-alias + 'dashboard-banner-logo-title-face 'dashboard-banner-logo-title "1.2.6") +(define-obsolete-face-alias + 'dashboard-heading-face 'dashboard-heading "1.2.6") + +;; +;; Util +;; +(defmacro dashboard-mute-apply (&rest body) + "Execute BODY without message." + (declare (indent 0) (debug t)) + `(let (message-log-max) + (with-temp-message (or (current-message) nil) + (let ((inhibit-message t)) ,@body)))) + +(defun dashboard-funcall-fboundp (fnc &rest args) + "Call FNC with ARGS if exists." + (when (fboundp fnc) (if args (funcall fnc args) (funcall fnc)))) + +;; +;; Generic widget helpers +;; +(defun dashboard-subseq (seq end) + "Return the subsequence of SEQ from 0 to END." + (let ((len (length seq))) + (butlast seq (- len (min len end))))) + +(defun dashboard-get-shortcut-name (item) + "Get the shortcut name to be used for ITEM." + (let ((elem (rassoc item dashboard-item-shortcuts))) + (and elem (car elem)))) + +(defun dashboard-get-shortcut (item) + "Get the shortcut to be used for ITEM." + (let ((elem (assq item dashboard-item-shortcuts))) + (and elem (cdr elem)))) + +(defmacro dashboard-insert-shortcut (shortcut-id + shortcut-char + search-label + &optional no-next-line) + "Insert a shortcut SHORTCUT-CHAR for a given SEARCH-LABEL. +Optionally, provide NO-NEXT-LINE to move the cursor forward a line." + (let* (;; Ensure punctuation and upper case in search string is not + ;; used to construct the `defun' + (name (downcase (replace-regexp-in-string "[[:punct:]]+" "" (format "%s" search-label)))) + ;; remove symbol quote + (sym (intern (replace-regexp-in-string "'" "" (format "dashboard-jump-to-%s" shortcut-id))))) + `(progn + (eval-when-compile (defvar dashboard-mode-map)) + (defun ,sym nil + ,(concat "Jump to " name ". This code is dynamically generated in `dashboard-insert-shortcut'.") + (interactive) + (unless (search-forward ,search-label (point-max) t) + (search-backward ,search-label (point-min) t)) + ,@(unless no-next-line '((forward-line 1))) + (back-to-indentation)) + (eval-after-load 'dashboard + (define-key dashboard-mode-map ,shortcut-char ',sym))))) + +(defun dashboard-append (msg &optional _messagebuf) + "Append MSG to dashboard buffer. +If MESSAGEBUF is not nil then MSG is also written in message buffer." + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (goto-char (point-max)) + (let (buffer-read-only) (insert msg)))) + +(defun dashboard-modify-heading-icons (alist) + "Append ALIST items to `dashboard-heading-icons' to modify icons." + (dolist (icon alist) + (add-to-list 'dashboard-heading-icons icon))) + +(defun dashboard-insert-page-break () + "Insert a page break line in dashboard buffer." + (dashboard-append dashboard-page-separator)) + +(defun dashboard-insert-heading (heading &optional shortcut) + "Insert a widget HEADING in dashboard buffer, adding SHORTCUT if provided." + (when (and (display-graphic-p) dashboard-set-heading-icons) + ;; Try loading `all-the-icons' + (unless (or (fboundp 'all-the-icons-octicon) + (require 'all-the-icons nil 'noerror)) + (error "Package `all-the-icons' isn't installed")) + + (insert (cond + ((string-equal heading "Recent Files:") + (all-the-icons-octicon (cdr (assoc 'recents dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Bookmarks:") + (all-the-icons-octicon (cdr (assoc 'bookmarks dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((or (string-equal heading "Agenda for today:") + (string-equal heading "Agenda for the coming week:")) + (all-the-icons-octicon (cdr (assoc 'agenda dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Registers:") + (all-the-icons-octicon (cdr (assoc 'registers dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Projects:") + (all-the-icons-octicon (cdr (assoc 'projects dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + (t " "))) + (insert " ")) + + (insert (propertize heading 'face 'dashboard-heading)) + + ;; Turn the inserted heading into an overlay, so that we may freely change + ;; its name without breaking any of the functions that expect the default name. + ;; If there isn't a suitable entry in `dashboard-item-names', + ;; we fallback to using HEADING. In that case we still want it to be an + ;; overlay to maintain consistent behavior (such as the point movement) + ;; between modified and default headings. + (let ((ov (make-overlay (- (point) (length heading)) (point) nil t))) + (overlay-put ov 'display (or (cdr (assoc heading dashboard-item-names)) heading)) + (overlay-put ov 'face 'dashboard-heading)) + (when shortcut (insert (format " (%s)" shortcut)))) + +(defun dashboard-center-line (string) + "Center a STRING accoring to it's size." + (insert (make-string (max 0 (floor (/ (- dashboard-banner-length + (+ (length string) 1)) 2))) ?\ ))) + +;; +;; BANNER +;; +(defun dashboard-insert-ascii-banner-centered (file) + "Insert banner from FILE." + (let ((ascii-banner + (with-temp-buffer + (insert-file-contents file) + (let ((banner-width 0)) + (while (not (eobp)) + (let ((line-length (- (line-end-position) (line-beginning-position)))) + (if (< banner-width line-length) + (setq banner-width line-length))) + (forward-line 1)) + (goto-char 0) + (let ((margin + (max 0 (floor (/ (- dashboard-banner-length banner-width) 2))))) + (while (not (eobp)) + (insert (make-string margin ?\ )) + (forward-line 1)))) + (buffer-string)))) + (put-text-property 0 (length ascii-banner) 'face 'dashboard-text-banner ascii-banner) + (insert ascii-banner))) + +(defun dashboard--type-is-gif-p (image-path) + "Return if image is a gif. +String -> bool. +Argument IMAGE-PATH path to the image." + (eq 'gif (image-type image-path))) + +(defun dashboard-insert-image-banner (banner) + "Display an image BANNER." + (when (file-exists-p banner) + (let* ((title dashboard-banner-logo-title) + (size-props + (append (when (> dashboard-image-banner-max-width 0) + (list :max-width dashboard-image-banner-max-width)) + (when (> dashboard-image-banner-max-height 0) + (list :max-height dashboard-image-banner-max-height)))) + (spec + (cond ((dashboard--type-is-gif-p banner) + (create-image banner)) + ((image-type-available-p 'imagemagick) + (apply 'create-image banner 'imagemagick nil size-props)) + (t + (apply 'create-image banner nil nil + (when (and (fboundp 'image-transforms-p) + (memq 'scale (funcall 'image-transforms-p))) + size-props))))) + ;; TODO: For some reason, `elisp-lint' is reporting error void + ;; function `image-size'. + (size (when (fboundp 'image-size) (image-size spec))) + (width (car size)) + (left-margin (max 0 (floor (- dashboard-banner-length width) 2)))) + (goto-char (point-min)) + (insert "\n") + (insert (make-string left-margin ?\ )) + (insert-image spec) + (when (dashboard--type-is-gif-p banner) (image-animate spec 0 t)) + (insert "\n\n") + (when title + (dashboard-center-line title) + (insert (format "%s\n\n" (propertize title 'face 'dashboard-banner-logo-title))))))) + +;; +;; INIT INFO +;; +(defun dashboard-insert-init-info () + "Insert init info when `dashboard-set-init-info' is t." + (when dashboard-set-init-info + (let ((init-info (if (functionp dashboard-init-info) + (funcall dashboard-init-info) + dashboard-init-info))) + (dashboard-center-line init-info) + (insert (propertize init-info 'face 'font-lock-comment-face))))) + +(defun dashboard-get-banner-path (index) + "Return the full path to banner with index INDEX." + (concat dashboard-banners-directory (format "%d.txt" index))) + +(defun dashboard-choose-banner () + "Return the full path of a banner based on the dotfile value." + (when dashboard-startup-banner + (cond ((eq 'official dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-official-png + (dashboard-get-banner-path 1))) + ((eq 'logo dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-logo-png + (dashboard-get-banner-path 1))) + ((integerp dashboard-startup-banner) + (dashboard-get-banner-path dashboard-startup-banner)) + ((stringp dashboard-startup-banner) + (if (and (file-exists-p dashboard-startup-banner) + (or (string-suffix-p ".txt" dashboard-startup-banner) + (and (display-graphic-p) + (image-type-available-p (intern (file-name-extension + dashboard-startup-banner)))))) + dashboard-startup-banner + (message "could not find banner %s, use default instead" dashboard-startup-banner) + (dashboard-get-banner-path 1))) + (t (dashboard-get-banner-path 1))))) + +(defun dashboard-insert-banner () + "Insert Banner at the top of the dashboard." + (goto-char (point-max)) + (let ((banner (dashboard-choose-banner)) buffer-read-only) + (when banner + (if (image-type-available-p (intern (file-name-extension banner))) + (dashboard-insert-image-banner banner) + (dashboard-insert-ascii-banner-centered banner)) + (dashboard-insert-navigator) + (dashboard-insert-init-info)))) + +(defun dashboard-insert-navigator () + "Insert Navigator of the dashboard." + (when (and dashboard-set-navigator dashboard-navigator-buttons) + (dolist (line dashboard-navigator-buttons) + (dolist (btn line) + (let* ((icon (car btn)) + (title (cadr btn)) + (help (or (cadr (cdr btn)) "")) + (action (or (cadr (cddr btn)) #'ignore)) + (face (or (cadr (cddr (cdr btn))) 'dashboard-navigator)) + (prefix (or (cadr (cddr (cddr btn))) (propertize "[" 'face face))) + (suffix (or (cadr (cddr (cddr (cdr btn)))) (propertize "]" 'face face)))) + (widget-create 'item + :tag (concat + (when icon + (propertize icon 'face + (let ((prop-face (get-text-property 0 'face icon))) + (if prop-face + `(:inherit ,prop-face :inherit ,face) + `(:inherit ,face))))) + (when (and icon title + (not (string-equal icon "")) + (not (string-equal title ""))) + (propertize " " 'face 'variable-pitch)) + (when title (propertize title 'face face))) + :help-echo help + :action action + :button-face 'dashboard-items-face + :mouse-face 'highlight + :button-prefix prefix + :button-suffix suffix + :format "%[%t%]") + (insert " "))) + (let* ((width (current-column))) + (beginning-of-line) + (dashboard-center-line (make-string width ?\s)) + (end-of-line)) + (insert "\n")) + (insert "\n"))) + +(defmacro dashboard-insert-section (section-name list list-size shortcut-id shortcut-char action &rest widget-params) + "Add a section with SECTION-NAME and LIST of LIST-SIZE items to the dashboard. +SHORTCUT-CHAR is the keyboard shortcut used to access the section. +ACTION is theaction taken when the user activates the widget button. +WIDGET-PARAMS are passed to the \"widget-create\" function." + `(progn + (dashboard-insert-heading ,section-name + (if (and ,list ,shortcut-char dashboard-show-shortcuts) ,shortcut-char)) + (if ,list + (when (and (dashboard-insert-section-list + ,section-name + (dashboard-subseq ,list ,list-size) + ,action + ,@widget-params) + ,shortcut-id ,shortcut-char) + (dashboard-insert-shortcut ,shortcut-id ,shortcut-char ,section-name)) + (insert (propertize "\n --- No items ---" 'face 'dashboard-no-items-face))))) + +;; +;; Section list +;; +(defmacro dashboard-insert-section-list (section-name list action &rest rest) + "Insert into SECTION-NAME a LIST of items, expanding ACTION and passing REST +to widget creation." + `(when (car ,list) + (mapc + (lambda (el) + (let ((tag ,@rest)) + (insert "\n ") + + (when (and (display-graphic-p) + dashboard-set-file-icons + (or (fboundp 'all-the-icons-icon-for-dir) + (require 'all-the-icons nil 'noerror))) + (let* ((path (car (last (split-string ,@rest " - ")))) + (icon (if (and (not (file-remote-p path)) + (file-directory-p path)) + (all-the-icons-icon-for-dir path nil "") + (cond + ((or (string-equal ,section-name "Agenda for today:") + (string-equal ,section-name "Agenda for the coming week:")) + (all-the-icons-octicon "primitive-dot" :height 1.0 :v-adjust 0.01)) + ((file-remote-p path) + (all-the-icons-octicon "radio-tower" :height 1.0 :v-adjust 0.01)) + (t (all-the-icons-icon-for-file (file-name-nondirectory path) + :v-adjust -0.05)))))) + (setq tag (concat icon " " ,@rest)))) + + (widget-create 'item + :tag tag + :action ,action + :button-face 'dashboard-items-face + :mouse-face 'highlight + :button-prefix "" + :button-suffix "" + :format "%[%t%]"))) + ,list))) + +;; Footer +(defun dashboard-random-footer () + "Return a random footer from `dashboard-footer-messages'." + (nth (random (length dashboard-footer-messages)) dashboard-footer-messages)) + +(defun dashboard-insert-footer () + "Insert footer of dashboard." + (when-let ((footer (and dashboard-set-footer (dashboard-random-footer)))) + (insert "\n") + (dashboard-center-line footer) + (insert dashboard-footer-icon) + (insert " ") + (insert (propertize footer 'face 'dashboard-footer)) + (insert "\n"))) + +;; +;; Truncate +;; +(defcustom dashboard-shorten-by-window-width nil + "Shorten path by window edges." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-shorten-path-offset 0 + "Shorten path offset on the edges." + :type 'integer + :group 'dashboard) + +(defun dashboard-f-filename (path) + "Return file name from PATH." + (file-name-nondirectory path)) + +(defun dashboard-f-base (path) + "Return directory name from PATH." + (file-name-nondirectory (directory-file-name (file-name-directory path)))) + +(defun dashboard-shorten-path-beginning (path) + "Shorten PATH from beginning if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + front) + (if (<= len-path dashboard-path-max-length) path + (setq front (ignore-errors (substring path (- len-path len-total) len-path))) + (if front (concat dashboard-path-shorten-string front) "")))) + +(defun dashboard-shorten-path-middle (path) + "Shorten PATH from middle if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + (center (/ len-total 2)) + (end-back center) + (start-front (- len-path center)) + back front) + (if (<= len-path dashboard-path-max-length) path + (setq back (substring path 0 end-back) + front (ignore-errors (substring path start-front len-path))) + (if front (concat back dashboard-path-shorten-string front) "")))) + +(defun dashboard-shorten-path-end (path) + "Shorten PATH from end if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + back) + (if (<= len-path dashboard-path-max-length) path + (setq back (ignore-errors (substring path 0 len-total))) + (if (and back (< 0 dashboard-path-max-length)) + (concat back dashboard-path-shorten-string) "")))) + +(defun dashboard--get-base-length (path type) + "Return the length of the base from the PATH by TYPE." + (let* ((is-dir (file-directory-p path)) + (base (if is-dir (dashboard-f-base path) (dashboard-f-filename path))) + (option (cl-case type + (recents 'dashboard-recentf-show-base) + (bookmarks 'dashboard-bookmarks-show-base) + (projects 'dashboard-projects-show-base))) + (option-val (symbol-value option)) + base-len) + (cl-case option-val + (`align (setq base-len (dashboard--align-length-by-type type))) + (`nil (setq base-len 0)) + (t (setq base-len (length base)))) + base-len)) + +(defun dashboard-shorten-path (path type) + "Shorten the PATH by TYPE." + (setq path (abbreviate-file-name path)) + (let ((dashboard-path-max-length + (if (and dashboard-path-style dashboard-shorten-by-window-width) + (- (window-width) (dashboard--get-base-length path type) + dashboard-shorten-path-offset) + dashboard-path-max-length))) + (cl-case dashboard-path-style + (truncate-beginning (dashboard-shorten-path-beginning path)) + (truncate-middle (dashboard-shorten-path-middle path)) + (truncate-end (dashboard-shorten-path-end path)) + (t path)))) + +(defun dashboard-shorten-paths (paths alist type) + "Shorten all path from PATHS by TYPE and store it to ALIST." + (let (lst-display abbrev (index 0)) + (setf (symbol-value alist) nil) ; reset + (dolist (item paths) + (setq abbrev (dashboard-shorten-path item type) + ;; Add salt here, and use for extraction. + ;; See function `dashboard-extract-key-path-alist'. + abbrev (format "%s|%s" index abbrev)) + ;; store `abbrev' as id; and `item' with value + (push (cons abbrev item) (symbol-value alist)) + (push abbrev lst-display) + (cl-incf index)) + (reverse lst-display))) + +(defun dashboard-extract-key-path-alist (key alist) + "Remove salt from KEY, and return true shorten path from ALIST." + (let* ((key (car (assoc key alist))) (split (split-string key "|"))) + (nth 1 split))) + +(defun dashboard-expand-path-alist (key alist) + "Get the full path (un-shorten) using KEY from ALIST." + (cdr (assoc key alist))) + +(defun dashboard--generate-align-format (fmt len) + "Return FMT after inserting align LEN." + (let ((pos (1+ (string-match-p "%s" fmt)))) + (concat (substring fmt 0 pos) + (concat "-" (number-to-string len)) + (substring fmt pos (length fmt))))) + +(defun dashboard--align-length-by-type (type) + "Return the align length by TYPE of the section." + (let ((len-item (cdr (assoc type dashboard-items))) (count 0) (align-length -1) + len-list base) + (cl-case type + (`recents + (require 'recentf) + (setq len-list (length recentf-list)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count recentf-list) + align-length (max align-length (length (dashboard-f-filename base)))) + (cl-incf count))) + (`bookmarks + (let ((bookmarks-lst (bookmark-all-names))) + (setq len-list (length bookmarks-lst)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count bookmarks-lst) + align-length (max align-length (length base))) + (cl-incf count)))) + (`projects + (let ((projects-lst (dashboard-projects-backend-load-projects))) + (setq len-list (length projects-lst)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count projects-lst) + align-length (max align-length (length (dashboard-f-base base)))) + (cl-incf count)))) + (t (error "Unknown type for align length: %s" type))) + align-length)) + +;; +;; Recentf +;; +(defcustom dashboard-recentf-show-base nil + "Show the base file name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-recentf-item-format "%s %s" + "Format to use when showing the base of the file name." + :type 'string + :group 'dashboard) + +(defvar dashboard-recentf-alist nil + "Alist records shorten's recent files and it's full paths.") + +(defvar dashboard--recentf-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-recents (list-size) + "Add the list of LIST-SIZE items from recently edited files." + (setq dashboard--recentf-cache-item-format nil) + (recentf-mode) + (dashboard-mute-apply (recentf-cleanup)) + (dashboard-insert-section + "Recent Files:" + (dashboard-shorten-paths recentf-list 'dashboard-recentf-alist 'recents) + list-size + 'recents + (dashboard-get-shortcut 'recents) + `(lambda (&rest _) + (find-file-existing (dashboard-expand-path-alist ,el dashboard-recentf-alist))) + (let* ((file (dashboard-expand-path-alist el dashboard-recentf-alist)) + (filename (dashboard-f-filename file)) + (path (dashboard-extract-key-path-alist el dashboard-recentf-alist))) + (cl-case dashboard-recentf-show-base + (`align + (unless dashboard--recentf-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'recents)) + (new-fmt (dashboard--generate-align-format + dashboard-recentf-item-format len-align))) + (setq dashboard--recentf-cache-item-format new-fmt))) + (format dashboard--recentf-cache-item-format filename path)) + (`nil path) + (t (format dashboard-recentf-item-format filename path)))))) + +;; +;; Bookmarks +;; +(defcustom dashboard-bookmarks-show-base t + "Show the base file name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-bookmarks-item-format "%s - %s" + "Format to use when showing the base of the file name." + :type 'string + :group 'dashboard) + +(defvar dashboard--bookmarks-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-bookmarks (list-size) + "Add the list of LIST-SIZE items of bookmarks." + (require 'bookmark) + (dashboard-insert-section + "Bookmarks:" + (dashboard-subseq (bookmark-all-names) list-size) + list-size + 'bookmarks + (dashboard-get-shortcut 'bookmarks) + `(lambda (&rest _) (bookmark-jump ,el)) + (if-let* ((filename el) + (path (bookmark-get-filename el)) + (path-shorten (dashboard-shorten-path path 'bookmarks))) + (cl-case dashboard-bookmarks-show-base + (`align + (unless dashboard--bookmarks-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'bookmarks)) + (new-fmt (dashboard--generate-align-format + dashboard-bookmarks-item-format len-align))) + (setq dashboard--bookmarks-cache-item-format new-fmt))) + (format dashboard--bookmarks-cache-item-format filename path-shorten)) + (`nil path-shorten) + (t (format dashboard-bookmarks-item-format filename path-shorten))) + el))) + +;; +;; Projects +;; +(defcustom dashboard-projects-switch-function + nil + "Custom function to switch to projects from dashboard. +If non-NIL, should be bound to a function with one argument. The function will +be called with the root directory of the project to switch to." + :type '(choice (const :tag "Default" nil) function) + :group 'dashboard) + +(defcustom dashboard-projects-show-base nil + "Show the project name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-projects-item-format "%s %s" + "Format to use when showing the base of the project name." + :type 'string + :group 'dashboard) + +(defvar dashboard-projects-alist nil + "Alist records the shorten's project paths and it's full paths.") + +(defvar dashboard--projects-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-projects (list-size) + "Add the list of LIST-SIZE items of projects." + (setq dashboard--projects-cache-item-format nil) + (dashboard-insert-section + "Projects:" + (dashboard-shorten-paths + (dashboard-subseq (dashboard-projects-backend-load-projects) list-size) + 'dashboard-projects-alist 'projects) + list-size + 'projects + (dashboard-get-shortcut 'projects) + `(lambda (&rest _) + (funcall (dashboard-projects-backend-switch-function) + (dashboard-expand-path-alist ,el dashboard-projects-alist))) + (let* ((file (dashboard-expand-path-alist el dashboard-projects-alist)) + (filename (dashboard-f-base file)) + (path (dashboard-extract-key-path-alist el dashboard-projects-alist))) + (cl-case dashboard-projects-show-base + (`align + (unless dashboard--projects-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'projects)) + (new-fmt (dashboard--generate-align-format + dashboard-projects-item-format len-align))) + (setq dashboard--projects-cache-item-format new-fmt))) + (format dashboard--projects-cache-item-format filename path)) + (`nil path) + (t (format dashboard-projects-item-format filename path)))))) + +(defun dashboard-projects-backend-load-projects () + "Depending on `dashboard-projects-backend' load corresponding backend. +Return function that returns a list of projects." + (cl-case dashboard-projects-backend + (`projectile + (require 'projectile) + (dashboard-mute-apply (projectile-cleanup-known-projects)) + (projectile-load-known-projects)) + (`project-el + (require 'project) + (dashboard-mute-apply (dashboard-funcall-fboundp #'project-forget-zombie-projects)) + (project-known-project-roots)) + (t + (display-warning '(dashboard) + "Invalid value for `dashboard-projects-backend'" + :error)))) + +(defun dashboard-projects-backend-switch-function () + "Return the function to switch to a project. +Custom variable `dashboard-projects-switch-function' variable takes preference +over custom backends." + (or dashboard-projects-switch-function + (cl-case dashboard-projects-backend + (`projectile 'projectile-switch-project-by-name) + (`project-el + (lambda (project) + "This function is used to switch to `PROJECT'." + (let ((default-directory project)) + (project-find-file)))) + (t + (display-warning '(dashboard) + "Invalid value for `dashboard-projects-backend'" + :error))))) + +;; +;; Org Agenda +;; +(defcustom dashboard-week-agenda t + "Show agenda weekly if its not nil." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-agenda-time-string-format "%Y-%m-%d" + "Format time of agenda entries." + :type 'string + :group 'dashboard) + +(defcustom dashboard-match-agenda-entry nil + "Match agenda to extra filter. +It is the MATCH attribute for `org-map-entries'" + :type 'string + :group 'dashboard) + +(defcustom dashboard-agenda-release-buffers nil + "If not nil use `org-release-buffers' after getting the entries." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-filter-agenda-entry 'dashboard-filter-agenda-by-time + "Function to filter `org-agenda' entries." + :type '(choice + (const :tag "No filter" dashboard-no-filter-agenda) + (const :tag "Filter by time" dashboard-filter-agenda-by-time) + (const :tag "Filter by todo" dashboard-filter-agenda-by-todo) + (function :tag "Custom function")) + :group 'dashboard) + +(defcustom dashboard-agenda-sort-strategy nil + "A list of strategies to sort the agenda. If nil agenda is not sorted." + :type '(repeat (choice (const time-up) (const time-down) + (const todo-state-up) (const todo-state-down))) + :group 'dashboard) + +(defcustom dashboard-agenda-prefix-format " %i %-12:c %s " + "Format for each entry in the agenda. +When the dashboard-agenda is created this format is inserted into +`org-agenda-prefix-format' as `dashboard-agenda' and compiled with +`org-compile-prefix-format' previous calling `dashboard-agenda-entry-format' for +each agenda entry." + :type 'string + :group 'dashboard) + +(defun dashboard-agenda-entry-format () + "Format agenda entry to show it on dashboard." + (let* ((scheduled-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (entry-time (or scheduled-time deadline-time)) + (item (org-agenda-format-item + (dashboard-agenda--formatted-time) + (dashboard-agenda--formatted-headline) + (org-outline-level) + (org-get-category) + (org-get-tags))) + (todo-state (org-get-todo-state)) + (todo-index (and todo-state + (length (member todo-state org-todo-keywords-1)))) + (entry-data (list 'dashboard-agenda-time entry-time + 'dashboard-agenda-todo-index todo-index + 'dashboard-agenda-file (buffer-file-name) + 'dashboard-agenda-loc (point)))) + (add-text-properties 0 (length item) entry-data item) + item)) + +(defun dashboard-agenda--formatted-headline () + "Set agenda faces to `HEADLINE' when face text property is nil." + (let* ((headline (org-get-heading t t t t)) + (todo (or (org-get-todo-state) "")) + (org-level-face (nth (- (org-outline-level) 1) org-level-faces)) + (todo-state (format org-agenda-todo-keyword-format todo))) + (when (null (get-text-property 0 'face headline)) + (add-face-text-property 0 (length headline) org-level-face t headline)) + (when (null (get-text-property 0 'face todo-state)) + (add-face-text-property 0 (length todo-state) (org-get-todo-face todo) t todo-state)) + (concat todo-state " " headline))) + +(defun dashboard-agenda--formatted-time () + "Get the scheduled or dead time of an entry. If no time is found return nil." + (when-let ((time (or (org-get-scheduled-time (point)) (org-get-deadline-time (point))))) + (format-time-string dashboard-agenda-time-string-format time))) + +(defun dashboard-due-date-for-agenda () + "Return due-date for agenda period." + (if dashboard-week-agenda + (time-add (current-time) (* 86400 8)) + (time-add (current-time) 86400))) + +(defun dashboard-filter-agenda-by-time () + "Include entry if it has a scheduled-time or deadline-time in the future. +An entry is included if this function returns nil and excluded if returns a +point." + (let ((scheduled-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (due-date (dashboard-due-date-for-agenda))) + (unless (and (not (org-entry-is-done-p)) + (not (org-in-archived-heading-p)) + (or (and scheduled-time + (org-time-less-p scheduled-time due-date)) + (and deadline-time + (org-time-less-p deadline-time due-date)))) + (point)))) + +(defun dashboard-filter-agenda-by-todo () + "Include entry if it is todo and not done. +An entry is included if this function returns nil and excluded +if returns a point." + (unless (and (org-entry-is-todo-p) + (not (org-entry-is-done-p)) + (not (org-in-archived-heading-p))) + (point))) + +(defun dashboard-no-filter-agenda () + "No filter agenda entries." + (when (org-entry-is-done-p) (point))) + +(defun dashboard-get-agenda () + "Get agenda items for today or for a week from now." + (if-let ((prefix-format (assoc 'dashboard-agenda org-agenda-prefix-format))) + (setcdr prefix-format dashboard-agenda-prefix-format) + (push (cons 'dashboard-agenda dashboard-agenda-prefix-format) org-agenda-prefix-format)) + (org-compile-prefix-format 'dashboard-agenda) + (prog1 (org-map-entries 'dashboard-agenda-entry-format + dashboard-match-agenda-entry + 'agenda + dashboard-filter-agenda-entry) + (dashboard-agenda--release-buffers))) + +(defun dashboard-agenda--release-buffers () + "Release agenda buffers buffers. +This is what `org-agenda-exit' do." + (when dashboard-agenda-release-buffers + (org-release-buffers org-agenda-new-buffers) + (setq org-agenda-new-buffers nil))) + +(defun dashboard-agenda--sorted-agenda () + "Return agenda sorted by time. +For now, it only works when dashboard-agenda has been filter by time +and dashboard-agenda-sort is not nil." + (let ((agenda (dashboard-get-agenda)) + (sort-function (dashboard-agenda--sort-function))) + (sort agenda sort-function))) + +(defun dashboard-agenda--sort-function () + "Get the function use to sorted the agenda. +Depending on the list `dashboard-agenda-sorting-strategy' use this strategies to +build a predicate to compare each enty. +This is similar as `org-entries-lessp' but with a different aproach." + (dashboard-agenda--build-sort-function dashboard-agenda-sort-strategy)) + +(defun dashboard-agenda--build-sort-function (strategies) + "Build a predicate to sort the dashboard agenda. +If `STRATEGIES' is nil then sort using the nil predicate. Look for the strategy +predicate, the attributes of the entry and compare entries. If no predicate is +found for the strategy it uses nil predicate." + (if (null strategies) (lambda (_dont _care) nil) + (let ((predicate (dashboard-agenda--build-sort-function-predicate + (car strategies))) + (attribute (dashboard-agenda--build-sort-function-attribute + (car strategies)))) + (if (null predicate) (lambda (_dont _care) nil) + (lambda (entry1 entry2) + (dashboard-agenda--compare-entries entry1 entry2 (cdr strategies) + predicate attribute)))))) + +(defun dashboard-agenda--build-sort-function-predicate (strategy) + "Return the predicate to compare two entryes depending on the `STRATEGY'." + (cl-case strategy + (`time-up 'org-time-less-p) + (`time-down (lambda (a b) (org-time-less-p b a))) + (`todo-state-up '>) + (`todo-state-down '<))) + +(defun dashboard-agenda--build-sort-function-attribute (strategy) + "Return the argument to compare two entries depending to the `STRATEGY'." + (cond + ((memq strategy '(time-up time-down)) 'dashboard-agenda-time) + ((memq strategy '(todo-state-up todo-state-down)) 'dashboard-agenda-todo-index) + (t nil))) + +(defun dashboard-agenda--compare-entries (entry1 entry2 strategies predicate attribute) + "Compare `ENTRY1' and `ENTRY2' by `ATTRIBUTE' using `PREDICATE'. +If both attributes are nil or equals the next strategy in `STRATEGIES' is used +to compare." + (let ((arg1 (get-text-property 0 attribute entry1)) + (arg2 (get-text-property 0 attribute entry2))) + (cond + ((or (and (null arg1) (null arg2)) (equal arg1 arg2)) + (apply (dashboard-agenda--build-sort-function strategies) (list entry1 entry2))) + ((null arg1) nil) + ((null arg2) t) + (t (apply predicate (list arg1 arg2)))))) + +(defun dashboard-insert-agenda (list-size) + "Add the list of LIST-SIZE items of agenda." + (require 'org-agenda) + (dashboard-insert-section + (if dashboard-week-agenda + "Agenda for the coming week:" + "Agenda for today:") + (dashboard-agenda--sorted-agenda) + list-size + 'agenda + (dashboard-get-shortcut 'agenda) + `(lambda (&rest _) + (let ((buffer (find-file-other-window (get-text-property 0 'dashboard-agenda-file ,el)))) + (with-current-buffer buffer + (goto-char (get-text-property 0 'dashboard-agenda-loc ,el)) + (switch-to-buffer buffer)))) + (format "%s" el))) + +;; +;; Registers +;; +(defun dashboard-insert-registers (list-size) + "Add the list of LIST-SIZE items of registers." + (require 'register) + (dashboard-insert-section + "Registers:" + register-alist + list-size + 'registers + (dashboard-get-shortcut 'registers) + (lambda (&rest _) (jump-to-register (car el))) + (format "%c - %s" (car el) (register-describe-oneline (car el))))) + +(provide 'dashboard-widgets) +;;; dashboard-widgets.el ends here diff --git a/org/elpa/dashboard-20220409.620/dashboard.el b/org/elpa/dashboard-20220409.620/dashboard.el new file mode 100644 index 0000000..9c8b80e --- /dev/null +++ b/org/elpa/dashboard-20220409.620/dashboard.el @@ -0,0 +1,472 @@ +;;; dashboard.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2022 emacs-dashboard maintainers +;; +;; Author : Rakan Al-Hneiti +;; Maintainer : Jesús Martínez +;; Shen, Jen-Chieh +;; URL : https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "26.1")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projects (projectile or project.el), org-agenda and more. + +;;; Code: + +(require 'ffap) +(require 'recentf) + +(require 'dashboard-widgets) + +(declare-function bookmark-get-filename "ext:bookmark.el") +(declare-function bookmark-all-names "ext:bookmark.el") +(declare-function dashboard-ls--dirs "ext:dashboard-ls.el") +(declare-function dashboard-ls--files "ext:dashboard-ls.el") +(declare-function page-break-lines-mode "ext:page-break-lines.el") +(declare-function project-forget-projects-under "ext:project.el") + +(defgroup dashboard nil + "Extensible startup screen." + :group 'applications) + +;; Custom splash screen +(defvar dashboard-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-p") 'dashboard-previous-line) + (define-key map (kbd "C-n") 'dashboard-next-line) + (define-key map (kbd "") 'dashboard-previous-line) + (define-key map (kbd "") 'dashboard-next-line) + (define-key map (kbd "k") 'dashboard-previous-line) + (define-key map (kbd "j") 'dashboard-next-line) + (define-key map [tab] 'widget-forward) + (define-key map (kbd "C-i") 'widget-forward) + (define-key map [backtab] 'widget-backward) + (define-key map (kbd "RET") 'dashboard-return) + (define-key map [mouse-1] 'dashboard-mouse-1) + (define-key map (kbd "}") #'dashboard-next-section) + (define-key map (kbd "{") #'dashboard-previous-section) + + (define-key map (kbd "") #'dashboard-remove-item-under) + (define-key map (kbd "") #'dashboard-remove-item-under) + (define-key map (kbd "DEL") #'dashboard-remove-item-under) + + (define-key map (kbd "1") #'dashboard-section-1) + (define-key map (kbd "2") #'dashboard-section-2) + (define-key map (kbd "3") #'dashboard-section-3) + (define-key map (kbd "4") #'dashboard-section-4) + (define-key map (kbd "5") #'dashboard-section-5) + (define-key map (kbd "6") #'dashboard-section-6) + (define-key map (kbd "7") #'dashboard-section-7) + (define-key map (kbd "8") #'dashboard-section-8) + (define-key map (kbd "9") #'dashboard-section-9) + map) + "Keymap for dashboard mode.") + +(defcustom dashboard-after-initialize-hook nil + "Hook that is run after dashboard buffer is initialized." + :group 'dashboard + :type 'hook) + +(define-derived-mode dashboard-mode special-mode "Dashboard" + "Dashboard major mode for startup screen." + :group 'dashboard + :syntax-table nil + :abbrev-table nil + (buffer-disable-undo) + (when (featurep 'whitespace) (whitespace-mode -1)) + (when (featurep 'linum) (linum-mode -1)) + (when (featurep 'display-line-numbers) (display-line-numbers-mode -1)) + (when (featurep 'page-break-lines) (page-break-lines-mode 1)) + (setq-local revert-buffer-function #'dashboard-refresh-buffer) + (setq inhibit-startup-screen t + buffer-read-only t + truncate-lines t)) + +(defcustom dashboard-center-content nil + "Whether to center content within the window." + :type 'boolean + :group 'dashboard) + +(defconst dashboard-buffer-name "*dashboard*" + "Dashboard's buffer name.") + +(defvar dashboard-force-refresh nil + "If non-nil, force refresh dashboard buffer.") + +(defvar dashboard--section-starts nil + "List of section starting positions.") + +;; +;; Util +;; +(defun dashboard--goto-line (line) + "Goto LINE." + (goto-char (point-min)) (forward-line (1- line))) + +(defmacro dashboard--save-excursion (&rest body) + "Execute BODY save window point." + (declare (indent 0) (debug t)) + `(let ((line (line-number-at-pos nil t)) + (column (current-column))) + ,@body + (dashboard--goto-line line) + (move-to-column column))) + +;; +;; Core +;; +(defun dashboard--current-section () + "Return section symbol in dashboard." + (save-excursion + (if (and (search-backward dashboard-page-separator nil t) + (search-forward dashboard-page-separator nil t)) + (let ((ln (thing-at-point 'line))) + (cond ((string-match-p "Recent Files:" ln) 'recents) + ((string-match-p "Bookmarks:" ln) 'bookmarks) + ((string-match-p "Projects:" ln) 'projects) + ((string-match-p "Agenda for " ln) 'agenda) + ((string-match-p "Registers:" ln) 'registers) + ((string-match-p "List Directories:" ln) 'ls-directories) + ((string-match-p "List Files:" ln) 'ls-files) + (t (user-error "Unknown section from dashboard")))) + (user-error "Failed searching dashboard section")))) + +;; +;; Navigation +;; +(defun dashboard-previous-section () + "Navigate back to previous section." + (interactive) + (let ((current-position (point)) current-section-start previous-section-start) + (dolist (elt dashboard--section-starts) + (when (and current-section-start (not previous-section-start)) + (setq previous-section-start elt)) + (when (and (not current-section-start) (< elt current-position)) + (setq current-section-start elt))) + (goto-char (if (eq current-position current-section-start) + previous-section-start + current-section-start)))) + +(defun dashboard-next-section () + "Navigate forward to next section." + (interactive) + (let ((current-position (point)) next-section-start + (section-starts (reverse dashboard--section-starts))) + (dolist (elt section-starts) + (when (and (not next-section-start) + (> elt current-position)) + (setq next-section-start elt))) + (when next-section-start + (goto-char next-section-start)))) + +(defun dashboard--section-lines () + "Return a list of integer represent the starting line number of each section." + (let (pb-lst) + (save-excursion + (goto-char (point-min)) + (while (search-forward dashboard-page-separator nil t) + (when (ignore-errors (dashboard--current-section)) + (push (line-number-at-pos) pb-lst)))) + (setq pb-lst (reverse pb-lst)) + pb-lst)) + +(defun dashboard--goto-section-by-index (index) + "Navigate to item section by INDEX." + (let* ((pg-lst (dashboard--section-lines)) + (items-id (1- index)) + (items-pg (nth items-id pg-lst)) + (items-len (length pg-lst))) + (when (and items-pg (< items-id items-len)) + (dashboard--goto-line items-pg)))) + +(defun dashboard-section-1 () + "Navigate to section 1." (interactive) (dashboard--goto-section-by-index 1)) +(defun dashboard-section-2 () + "Navigate to section 2." (interactive) (dashboard--goto-section-by-index 2)) +(defun dashboard-section-3 () + "Navigate to section 3." (interactive) (dashboard--goto-section-by-index 3)) +(defun dashboard-section-4 () + "Navigate to section 4." (interactive) (dashboard--goto-section-by-index 4)) +(defun dashboard-section-5 () + "Navigate to section 5." (interactive) (dashboard--goto-section-by-index 5)) +(defun dashboard-section-6 () + "Navigate to section 6." (interactive) (dashboard--goto-section-by-index 6)) +(defun dashboard-section-7 () + "Navigate to section 7." (interactive) (dashboard--goto-section-by-index 7)) +(defun dashboard-section-8 () + "Navigate to section 8." (interactive) (dashboard--goto-section-by-index 8)) +(defun dashboard-section-9 () + "Navigate to section 9." (interactive) (dashboard--goto-section-by-index 9)) + +(defun dashboard-previous-line (arg) + "Move point up and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + (interactive "^p") + (dashboard-next-line (- arg))) + +(defun dashboard-next-line (arg) + "Move point down and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + ;; code heavily inspired by `dired-next-line' + (interactive "^p") + (let (line-move-visual goal-column) + (line-move arg t)) + ;; We never want to move point into an invisible line. Dashboard doesn’t + ;; use invisible text currently but when it does we’re ready! + (while (and (invisible-p (point)) + (not (if (and arg (< arg 0)) (bobp) (eobp)))) + (forward-char (if (and arg (< arg 0)) -1 1))) + (beginning-of-line-text)) + +;; +;; ffap +;; +(defun dashboard--goto-section (section) + "Move to SECTION declares in variable `dashboard-item-shortcuts'." + (let ((fnc (intern (format "dashboard-jump-to-%s" section)))) + (dashboard-funcall-fboundp fnc))) + +(defun dashboard--current-index (section &optional pos) + "Return the idex by SECTION from POS." + (let (target-ln section-line) + (save-excursion + (when pos (goto-char pos)) + (setq target-ln (line-number-at-pos)) + (dashboard--goto-section section) + (setq section-line (line-number-at-pos))) + (- target-ln section-line))) + +(defun dashboard--section-list (section) + "Return the list from SECTION." + (cl-case section + (`recents recentf-list) + (`bookmarks (bookmark-all-names)) + (`projects (dashboard-projects-backend-load-projects)) + (`ls-directories (dashboard-ls--dirs)) + (`ls-files (dashboard-ls--files)) + (t (user-error "Unknown section for search: %s" section)))) + +(defun dashboard--current-item-in-path () + "Return the path from current dashboard section in path." + (let ((section (dashboard--current-section)) path) + (cl-case section + (`bookmarks (setq path (bookmark-get-filename path))) + (t + (let ((lst (dashboard--section-list section)) + (index (dashboard--current-index section))) + (setq path (nth index lst))))) + path)) + +(defun dashboard--on-path-item-p () + "Return non-nil if current point is on the item path from dashboard." + (save-excursion + (when (= (point) (line-end-position)) (ignore-errors (forward-char -1))) + (eq (get-char-property (point) 'face) 'dashboard-items-face))) + +(defun dashboard--ffap-guesser--adv (fnc &rest args) + "Advice execution around function `ffap-guesser'. + +Argument FNC is the adviced function. +Optional argument ARGS adviced function arguments." + (cl-case major-mode + (`dashboard-mode + (or (and (dashboard--on-path-item-p) + (dashboard--current-item-in-path)) + (apply fnc args))) ; fallback + (t (apply fnc args)))) +(advice-add 'ffap-guesser :around #'dashboard--ffap-guesser--adv) + +;; +;; Removal +;; +(defun dashboard-remove-item-under () + "Remove a item from the current item section." + (interactive) + (cl-case (dashboard--current-section) + (`recents (dashboard-remove-item-recentf)) + (`bookmarks (dashboard-remove-item-bookmarks)) + (`projects (dashboard-remove-item-projects)) + (`agenda (dashboard-remove-item-agenda)) + (`registers (dashboard-remove-item-registers))) + (dashboard--save-excursion (dashboard-refresh-buffer))) + +(defun dashboard-remove-item-recentf () + "Remove a file from `recentf-list'." + (interactive) + (let ((path (save-excursion (end-of-line) (ffap-guesser)))) + (setq recentf-list (delete path recentf-list))) + (dashboard-mute-apply (recentf-save-list))) + +(defun dashboard-remove-item-projects () + "Remove a path from `project--list'." + (interactive) + (let ((path (save-excursion (end-of-line) (ffap-guesser)))) + (dashboard-mute-apply + (cl-case dashboard-projects-backend + (`projectile ) ; TODO: .. + (`project-el (project-forget-projects-under path)))))) + +(defun dashboard-remove-item-bookmarks () + "Remove a bookmarks from `bookmark-alist'." + (interactive)) ; TODO: .. + +(defun dashboard-remove-item-agenda () + "Remove an agenda from `org-agenda-files'." + (interactive "P") + (let ((agenda-file (get-text-property (point) 'dashboard-agenda-file)) + (agenda-loc (get-text-property (point) 'dashboard-agenda-loc))) + (with-current-buffer (find-file-noselect agenda-file) + (goto-char agenda-loc) + (call-interactively 'org-todo)))) + +(defun dashboard-remove-item-registers () + "Remove a registers from `register-alist'." + (interactive)) ; TODO: .. + +;; +;; Confirmation +;; +(defun dashboard-return () + "Hit return key in dashboard buffer." + (interactive) + (let ((start-ln (line-number-at-pos)) (fd-cnt 0) diff-line entry-pt) + (save-excursion + (while (and (not diff-line) + (not (= (point) (point-min))) + (not (get-char-property (point) 'button)) + (not (= (point) (point-max)))) + (forward-char 1) + (setq fd-cnt (1+ fd-cnt)) + (unless (= start-ln (line-number-at-pos)) + (setq diff-line t))) + (unless (= (point) (point-max)) + (setq entry-pt (point)))) + (when (= fd-cnt 1) + (setq entry-pt (1- (point)))) + (if entry-pt + (widget-button-press entry-pt) + (call-interactively #'widget-button-press)))) + +(defun dashboard-mouse-1 () + "Key for keymap `mouse-1'." + (interactive) + (let ((old-track-mouse track-mouse)) + (when (call-interactively #'widget-button-click) + (setq track-mouse old-track-mouse)))) + +;; +;; Insertion +;; +(defun dashboard-maximum-section-length () + "For the just-inserted section, calculate the length of the longest line." + (let ((max-line-length 0)) + (save-excursion + (dashboard-previous-section) + (while (not (eobp)) + (setq max-line-length + (max max-line-length + (- (line-end-position) (line-beginning-position)))) + (forward-line 1))) + max-line-length)) + +(defun dashboard-insert-startupify-lists () + "Insert the list of widgets into the buffer." + (interactive) + (let ((buffer-exists (buffer-live-p (get-buffer dashboard-buffer-name))) + (recentf-is-on (recentf-enabled-p)) + (origial-recentf-list recentf-list) + (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0)) + (max-line-length 0)) + ;; disable recentf mode, so we don't flood the recent files list with org + ;; mode files do this by making a copy of the part of the list we'll use + ;; let dashboard widgets change that then restore the orginal list afterwards + ;; (this avoids many saves/loads that would result from disabling/enabling + ;; recentf-mode) + (when recentf-is-on + (setq recentf-list (dashboard-subseq recentf-list dashboard-num-recents))) + (when (or dashboard-force-refresh + (not (eq dashboard-buffer-last-width (window-width))) + (not buffer-exists)) + (setq dashboard-banner-length (window-width) + dashboard-buffer-last-width dashboard-banner-length) + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (let (buffer-read-only) + (erase-buffer) + (dashboard-insert-banner) + (dashboard-insert-page-break) + (setq dashboard--section-starts nil) + (mapc (lambda (els) + (let* ((el (or (car-safe els) els)) + (list-size + (or (cdr-safe els) + dashboard-items-default-length)) + (item-generator + (cdr-safe (assoc el dashboard-item-generators)))) + (add-to-list 'dashboard--section-starts (point)) + (funcall item-generator list-size) + (when recentf-is-on + (setq recentf-list origial-recentf-list)) + (setq max-line-length + (max max-line-length (dashboard-maximum-section-length))) + (dashboard-insert-page-break))) + dashboard-items) + (when dashboard-center-content + (when dashboard--section-starts + (goto-char (car (last dashboard--section-starts)))) + (let ((margin (floor (/ (max (- (window-width) max-line-length) 0) 2)))) + (while (not (eobp)) + (unless (string-suffix-p (thing-at-point 'line) dashboard-page-separator) + (insert (make-string margin ?\ ))) + (forward-line 1)))) + (dashboard-insert-footer)) + (goto-char (point-min)) + (dashboard-mode))) + (when recentf-is-on + (setq recentf-list origial-recentf-list)))) + +(add-hook 'window-setup-hook + (lambda () + (add-hook 'window-size-change-functions 'dashboard-resize-on-hook) + (dashboard-resize-on-hook))) + +(defun dashboard-refresh-buffer (&rest _) + "Refresh buffer." + (interactive) + (let ((dashboard-force-refresh t)) (dashboard-insert-startupify-lists)) + (switch-to-buffer dashboard-buffer-name)) + +(defun dashboard-resize-on-hook (&optional _) + "Re-render dashboard on window size change." + (let ((space-win (get-buffer-window dashboard-buffer-name)) + (frame-win (frame-selected-window))) + (when (and space-win + (not (window-minibuffer-p frame-win))) + (with-selected-window space-win + (dashboard-insert-startupify-lists))))) + +;;;###autoload +(defun dashboard-setup-startup-hook () + "Setup post initialization hooks. +If a command line argument is provided, assume a filename and skip displaying +Dashboard." + (when (< (length command-line-args) 2) + (add-hook 'after-init-hook (lambda () + ;; Display useful lists of items + (dashboard-insert-startupify-lists))) + (add-hook 'emacs-startup-hook (lambda () + (switch-to-buffer dashboard-buffer-name) + (goto-char (point-min)) + (redisplay) + (run-hooks 'dashboard-after-initialize-hook))))) + +(provide 'dashboard) +;;; dashboard.el ends here diff --git a/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el new file mode 100644 index 0000000..b45e7c2 --- /dev/null +++ b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-autoloads.el @@ -0,0 +1,23 @@ +;;; dashboard-project-status-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dashboard-project-status" "dashboard-project-status.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from dashboard-project-status.el + +(register-definition-prefixes "dashboard-project-status" '("dashboard-project-status")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dashboard-project-status-autoloads.el ends here diff --git a/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el new file mode 100644 index 0000000..9e680da --- /dev/null +++ b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from dashboard-project-status.el -*- no-byte-compile: t -*- +(define-package "dashboard-project-status" "20190202.1354" "Display a git project status in a dashboard widget." '((emacs "24") (git "0.1.1") (dashboard "1.2.5")) :commit "7675c138e9df8fe2c626e7ba9bbb8b6717671a41" :authors '(("Jason Duncan" . "jasond496@msn.com")) :maintainer '("Jason Duncan" . "jasond496@msn.com") :url "https://github.com/functionreturnfunction/dashboard-project-status") diff --git a/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el new file mode 100644 index 0000000..370f230 --- /dev/null +++ b/org/elpa/dashboard-project-status-20190202.1354/dashboard-project-status.el @@ -0,0 +1,99 @@ +;;; dashboard-project-status.el --- Display a git project status in a dashboard widget. -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Jason Duncan, all rights reserved + +;; Author: Jason Duncan +;; Version: 0.0.1 +;; Package-Version: 20190202.1354 +;; Package-Commit: 7675c138e9df8fe2c626e7ba9bbb8b6717671a41 +;; URL: https://github.com/functionreturnfunction/dashboard-project-status +;; Package-Requires: ((emacs "24") (git "0.1.1") (dashboard "1.2.5")) + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; Display a git project status in a dashboard widget. + +;; See README.org for installation and usage. + +;;; Code: + +(require 'git) +(require 'dashboard) + +(defun dashboard-project-status-git-local-is-behind? () + "Return non-nil if current `git-repo' is behind its remote." + (numberp + (string-match-p + (regexp-quote "Your branch is behind") + (git-run "status" "-uno")))) + +(defun dashboard-project-status-git-unstaged-files () + "Return list of unstaged files." + (git--lines + (git-run "diff" "--name-only"))) + +(defun dashboard-project-status-insert-heading () + "Insert a heading with project path and whether or not it is behind." + (dashboard-insert-heading "Project ") + (if (functionp 'magit-status) + (widget-create 'push-button + :action `(lambda (&rest ignore) (magit-status ,git-repo)) + :mouse-face 'highlight + :follow-link "\C-m" + :button-prefix "" + :button-suffix "" + :format "%[%t%]" + (abbreviate-file-name git-repo)) + (dashboard-insert-heading git-repo)) + (dashboard-insert-heading + (if (dashboard-project-status-git-local-is-behind?) + " is behind the remote. (use \"git pull\" to update)" + " is up-to-date."))) + +(defun dashboard-project-status-insert-body (limit) + "Insert lists of untracked, unstaged, and staged files LIMIT -ed as specified." + (let ((count 0)) + (dolist (section `(("Untracked Files:" . ,(git-untracked-files)) + ("Unstaged Files:" . ,(dashboard-project-status-git-unstaged-files)) + ("Staged Files:" . ,(git-staged-files)))) + (when (cdr section) + (let* ((items (cdr section)) + (items (if (> (+ count (length items)) limit) + (dashboard-subseq items 0 (- limit count)) + items))) + (when items + (setq count (+ count (length items))) + (insert hard-newline) + (dashboard-insert-recentf-list + (car section) + (reverse + (let (ret) + (dolist (cur items ret) + (setq ret (cons (expand-file-name + (concat (file-name-as-directory git-repo) cur)) + ret)))))))))))) + +(defun dashboard-project-status (project-dir &optional update) + "Return a function which will insert git status for PROJECT-DIR. +If UPDATE is non-nil, update the remote first with 'git remote update'." + `(lambda (list-size) + (let ((git-repo ,project-dir)) + (when ,update (git-run "remote" "update")) + (dashboard-project-status-insert-heading) + (dashboard-project-status-insert-body list-size)))) + +(provide 'dashboard-project-status) +;;; dashboard-project-status.el ends here diff --git a/org/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el b/org/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el deleted file mode 100644 index e441fc8..0000000 --- a/org/elpa/dired-collapse-20210403.1230/dired-collapse-autoloads.el +++ /dev/null @@ -1,42 +0,0 @@ -;;; dired-collapse-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-collapse" "dired-collapse.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from dired-collapse.el - -(autoload 'dired-collapse-mode "dired-collapse" "\ -Toggle collapsing of unique nested paths in Dired. - -This is a minor mode. If called interactively, toggle the -`Dired-Collapse mode' mode. If the prefix argument is positive, -enable the mode, and if it is zero or negative, disable the mode. - -If called from Lisp, toggle the mode if ARG is `toggle'. Enable -the mode if ARG is nil, omitted, or is a positive number. -Disable the mode if ARG is a negative number. - -To check whether the minor mode is enabled in the current buffer, -evaluate `dired-collapse-mode'. - -The mode's hook is called both when the mode is enabled and when -it is disabled. - -\(fn &optional ARG)" t nil) - -(register-definition-prefixes "dired-collapse" '("dired-collapse")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-collapse-autoloads.el ends here diff --git a/org/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el b/org/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el deleted file mode 100644 index 46cd3a8..0000000 --- a/org/elpa/dired-collapse-20210403.1230/dired-collapse-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-collapse.el -*- no-byte-compile: t -*- -(define-package "dired-collapse" "20210403.1230" "Collapse unique nested paths in dired listing" '((dash "2.10.0") (f "0.19.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/org/elpa/dired-collapse-20210403.1230/dired-collapse.el b/org/elpa/dired-collapse-20210403.1230/dired-collapse.el deleted file mode 100644 index bb19891..0000000 --- a/org/elpa/dired-collapse-20210403.1230/dired-collapse.el +++ /dev/null @@ -1,162 +0,0 @@ -;;; dired-collapse.el --- Collapse unique nested paths in dired listing -*- lexical-binding: t -*- - -;; Copyright (C) 2017 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Version: 1.1.0 -;; Package-Version: 20210403.1230 -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Created: 15th July 2017 -;; Package-requires: ((dash "2.10.0") (f "0.19.0") (dired-hacks-utils "0.0.1")) -;; Keywords: files - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; Often times we find ourselves in a situation where a single file -;; or directory is nested in a chain of nested directories with no -;; other content. This is sometimes due to various mandatory -;; layouts demanded by packaging tools or tools generating these -;; deeply-nested "unique" paths to disambiguate architectures or -;; versions (but we often use only one anyway). If the user wants -;; to access these directories they have to quite needlessly -;; drill-down through varying number of "uninteresting" directories -;; to get to the content. - -;; This minor mode is in main inspired by how GitHub renders these -;; paths: if there is a chain of directories where each one only has -;; one child, they are concatenated together and shown on the first -;; level in this collapsed form. When the user clicks this -;; collapsed directory they are immediately brought to the deepest -;; directory with some actual content. - -;; To enable or disable this functionality use `dired-collapse-mode' -;; to toggle it for the current dired buffer. - -;; If the deepest directory contains only a single file this file is -;; displayed instead of the last directory. This way we can get -;; directly to the file itself. This is often helpful with config -;; files which are stored in their own directories, for example in -;; `~/.config/foo/config' and similar situations. - -;; The files or directories re-inserted in this manner will also -;; have updated permissions, file sizes and modification dates so -;; they truly correspond to the properties of the file being shown. - -;; The path to the deepest file is dimmed with the `shadow' face so -;; that it does not distract but at the same time is still available -;; for inspection. - -;; The mode is integrated with `dired-rainbow' so the nested files -;; are properly colored according to user's rules. - -;;; Code: - -(require 'dash) -(require 'dired) -(require 'f) -(require 'dired-hacks-utils) - -(defgroup dired-collapse () - "Collapse unique nested paths in dired listing." - :group 'dired-hacks - :prefix "dired-collapse-") - -(defcustom dired-collapse-remote nil - "If non-nil, enable `dired-collapse' in remote (TRAMP) buffers." - :type 'boolean - :group 'dired-collapse) - -;;;###autoload -(define-minor-mode dired-collapse-mode - "Toggle collapsing of unique nested paths in Dired." - :group 'dired-collapse - :lighter "" - (if dired-collapse-mode - (progn - (add-hook 'dired-after-readin-hook 'dired-collapse 'append 'local) - (add-hook 'dired-subtree-after-insert-hook 'dired-collapse 'append 'local) - ;; collapse the buffer only if it is not empty (= we haven't - ;; yet read in the current directory) - (unless (= (buffer-size) 0) - (dired-collapse))) - (remove-hook 'dired-after-readin-hook 'dired-collapse 'local) - (remove-hook 'dired-subtree-after-insert-hook 'dired-collapse 'local) - (revert-buffer))) - -(defun dired-collapse--replace-file (file) - "Replace file on the current line with FILE." - (delete-region (line-beginning-position) (1+ (line-end-position))) - (insert " ") - (insert-directory file dired-listing-switches nil nil) - (forward-line -1) - (dired-align-file (line-beginning-position) (1+ (line-end-position))) - (-when-let (replaced-file (dired-utils-get-filename)) - (when (file-remote-p replaced-file) - (while (search-forward (dired-current-directory) (line-end-position) t) - (replace-match ""))))) - -(defun dired-collapse--create-ov (&optional to-eol) - "Create the shadow overlay which marks the collapsed path. - -If TO-EOL is non-nil, extend the overlay over the whole -filename (for example when the final directory is empty)." - (save-excursion - (dired-move-to-filename) - (let* ((beg (point)) - (end (save-excursion - (dired-move-to-end-of-filename) - (if to-eol - (point) - (1+ (search-backward "/"))))) - (ov (make-overlay beg end))) - (overlay-put ov 'face 'shadow) - ov))) - -(defun dired-collapse () - "Collapse unique nested paths in dired listing." - (when (or (not (file-remote-p default-directory)) dired-collapse-remote) - (-let* (;; dired-hide-details-mode hides details by assigning a special invisibility text property - ;; to them, while dired-collapse requires all the details. So we disable invisibility here - ;; temporarily. - (buffer-invisibility-spec nil) - (inhibit-read-only t)) - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (when (and (looking-at-p dired-re-dir) - (not (member (dired-utils-get-filename 'no-dir) (list "." ".."))) - (not (eolp))) - (let ((path (dired-utils-get-filename)) - files) - (while (and (file-directory-p path) - (file-accessible-directory-p path) - (setq files (f-entries path)) - (= 1 (length files))) - (setq path (car files))) - (if (and (not files) - (equal path (dired-utils-get-filename))) - (dired-collapse--create-ov 'to-eol) - (setq path (s-chop-prefix (dired-current-directory) path)) - (when (string-match-p "/" path) - (let ((default-directory (dired-current-directory))) - (dired-collapse--replace-file path)) - (dired-insert-set-properties (line-beginning-position) (line-end-position)) - (dired-collapse--create-ov (= 0 (length files))))))) - (forward-line 1)))))) - -(provide 'dired-collapse) -;;; dired-collapse.el ends here diff --git a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-autoloads.el b/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-autoloads.el deleted file mode 100644 index 120f7f6..0000000 --- a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-autoloads.el +++ /dev/null @@ -1,23 +0,0 @@ -;;; dired-hacks-utils-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-hacks-utils" "dired-hacks-utils.el" -;;;;;; (0 0 0 0)) -;;; Generated autoloads from dired-hacks-utils.el - -(register-definition-prefixes "dired-hacks-utils" '("dired-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-hacks-utils-autoloads.el ends here diff --git a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el b/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el deleted file mode 100644 index 0c1de1a..0000000 --- a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-hacks-utils.el -*- no-byte-compile: t -*- -(define-package "dired-hacks-utils" "20201005.2318" "Utilities and helpers for dired-hacks collection" '((dash "2.5.0")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils.el b/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils.el deleted file mode 100644 index d02449c..0000000 --- a/org/elpa/dired-hacks-utils-20201005.2318/dired-hacks-utils.el +++ /dev/null @@ -1,275 +0,0 @@ -;;; dired-hacks-utils.el --- Utilities and helpers for dired-hacks collection - -;; Copyright (C) 2014-2015 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Keywords: files -;; Package-Version: 20201005.2318 -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Version: 0.0.1 -;; Created: 14th February 2014 -;; Package-requires: ((dash "2.5.0")) - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; Utilities and helpers for `dired-hacks' collection of dired -;; improvements. - -;; This package also provides these interactive functions: -;; * `dired-hacks-next-file' - go to next file, skipping empty and non-file lines -;; * `dired-hacks-previous-file' - go to previous file, skipping empty -;; and non-file lines -;; * `dired-utils-format-information-line-mode' - Format the information -;; (summary) line file sizes to be human readable (e.g. 1GB instead of 1048576). - - -;; See https://github.com/Fuco1/dired-hacks for the entire collection - -;;; Code: - -(require 'dash) -(require 'dired) - -(defgroup dired-hacks () - "Collection of useful dired additions." - :group 'dired - :prefix "dired-hacks-") - -(defcustom dired-hacks-file-size-formatter 'file-size-human-readable - "The function used to format file sizes. - -See `dired-utils-format-file-sizes'." - :type 'symbol - :group 'dired-hacks) - -(defcustom dired-hacks-datetime-regexp - "\\sw\\sw\\sw....\\(?:[0-9][0-9]:[0-9][0-9]\\|.[0-9]\\{4\\}\\)" - "A regexp matching the date/time in the dired listing. - -It is used to determine where the filename starts. It should -*not* match any characters after the last character of the -timestamp. It is assumed that the timestamp is preceded and -followed by at least one space character. You should only use -shy groups (prefixed with ?:) because the first group is used by -the font-lock to determine what portion of the name should be -colored." - :type 'string - :group 'dired-hacks) - -(defalias 'dired-utils--string-trim - (if (and (require 'subr-x nil t) - (fboundp 'string-trim)) - #'string-trim - (lambda (string) - (let ((s string)) - (when (string-match "\\`[ \t\n\r]+" s) - (setq s (replace-match "" t t s))) - (when (string-match "[ \t\n\r]+\\'" s) - (setq s (replace-match "" t t s))) - s))) - "Trim STRING of trailing whitespace. - -\(fn STRING)") - -(defun dired-utils-get-filename (&optional localp) - "Like `dired-get-filename' but never signal an error. - -Optional arg LOCALP with value `no-dir' means don't include -directory name in result." - (dired-get-filename localp t)) - -(defun dired-utils-get-all-files (&optional localp) - "Return all files in this dired buffer as a list. - -LOCALP has same semantics as in `dired-get-filename'." - (save-excursion - (goto-char (point-min)) - (let (r) - (while (= 0 (forward-line)) - (--when-let (dired-utils-get-filename localp) - (push it r))) - (nreverse r)))) - -(defconst dired-utils-file-attributes-keywords - '(:isdir :nlinks :uid :gid :atime :mtime :ctime :size :modes :gidchg :inode :devnum) - "List of keywords to map with `file-attributes'.") - -(defconst dired-utils-info-keywords - `(:name :issym :target ,@dired-utils-file-attributes-keywords) - "List of keywords available for `dired-utils-get-info'.") - -(defun dired-utils--get-keyword-info (keyword) - "Get file information about KEYWORD." - (let ((filename (dired-utils-get-filename))) - (cl-case keyword - (:name filename) - (:isdir (file-directory-p filename)) - (:issym (and (file-symlink-p filename) t)) - (:target (file-symlink-p filename)) - (t - (nth (-elem-index keyword dired-utils-file-attributes-keywords) - (file-attributes filename)))))) - -(defun dired-utils-get-info (&rest keywords) - "Query for info about the file at point. - -KEYWORDS is a list of attributes to query. - -When querying for one attribute, its value is returned. When -querying for more than one, a list of results is returned. - -The available keywords are listed in -`dired-utils-info-keywords'." - (let ((attributes (mapcar 'dired-utils--get-keyword-info keywords))) - (if (> (length attributes) 1) - attributes - (car attributes)))) - -(defun dired-utils-goto-line (filename) - "Go to line describing FILENAME in listing. - -Should be absolute file name matched against -`dired-get-filename'." - (goto-char (point-min)) - (let (stop) - (while (and (not stop) - (= (forward-line) 0)) - (when (equal filename (dired-utils-get-filename)) - (setq stop t) - (dired-move-to-filename))) - stop)) - -(defun dired-utils-match-filename-regexp (filename alist) - "Match FILENAME against each car in ALIST and return first matched cons. - -Each car in ALIST is a regular expression. - -The matching is done using `string-match-p'." - (let (match) - (--each-while alist (not match) - (when (string-match-p (car it) filename) - (setq match it))) - match)) - -(defun dired-utils-match-filename-extension (filename alist) - "Match FILENAME against each car in ALIST and return first matched cons. - -Each car in ALIST is a string representing file extension -*without* the delimiting dot." - (let (done) - (--each-while alist (not done) - (when (string-match-p (concat "\\." (regexp-quote (car it)) "\\'") filename) - (setq done it))) - done)) - -(defun dired-utils-format-information-line () - "Format the disk space on the Dired information line." - (save-excursion - (goto-char (point-min)) - (forward-line) - (let ((inhibit-read-only t) - (limit (line-end-position))) - (while (re-search-forward "\\(?:directory\\|available\\) \\(\\<[0-9]+$\\>\\)" nil t) - (replace-match - (save-match-data - (propertize (dired-utils--string-trim - (funcall dired-hacks-file-size-formatter - (* 1024 (string-to-number (match-string 1))) t)) - 'invisible 'dired-hide-details-information)) - t nil nil 1))))) - - -;;; Predicates -(defun dired-utils-is-file-p () - "Return non-nil if the line at point is a file or a directory." - (dired-utils-get-filename 'no-dir)) - -(defun dired-utils-is-dir-p () - "Return non-nil if the line at point is a directory." - (--when-let (dired-utils-get-filename) - (file-directory-p it))) - - -;;; Interactive -;; TODO: add wrap-around option -(defun dired-hacks-next-file (&optional arg) - "Move point to the next file. - -Optional prefix ARG says how many lines to move; default is one -line." - (interactive "p") - (unless arg (setq arg 1)) - (if (< arg 0) - (dired-hacks-previous-file (- arg)) - (--dotimes arg - (forward-line) - (while (and (or (not (dired-utils-is-file-p)) - (get-text-property (point) 'invisible)) - (= (forward-line) 0)))) - (if (not (= (point) (point-max))) - (dired-move-to-filename) - (forward-line -1) - (dired-move-to-filename) - nil))) - -(defun dired-hacks-previous-file (&optional arg) - "Move point to the previous file. - -Optional prefix ARG says how many lines to move; default is one -line." - (interactive "p") - (unless arg (setq arg 1)) - (if (< arg 0) - (dired-hacks-next-file (- arg)) - (--dotimes arg - (forward-line -1) - (while (and (or (not (dired-utils-is-file-p)) - (get-text-property (point) 'invisible)) - (= (forward-line -1) 0)))) - (if (not (= (point) (point-min))) - (dired-move-to-filename) - (dired-hacks-next-file) - nil))) - -(defun dired-hacks-compare-files (file-a file-b) - "Test if two files FILE-A and FILE-B are the (probably) the same." - (interactive (let ((other-dir (dired-dwim-target-directory))) - (list (read-file-name "File A: " default-directory (car (dired-get-marked-files)) t) - (read-file-name "File B: " other-dir (with-current-buffer (cdr (assoc other-dir dired-buffers)) - (car (dired-get-marked-files))) t)))) - (let ((md5-a (with-temp-buffer - (shell-command (format "md5sum %s" file-a) (current-buffer)) - (buffer-string))) - (md5-b (with-temp-buffer - (shell-command (format "md5sum %s" file-b) (current-buffer)) - (buffer-string)))) - (message "%s%sFiles are %s." md5-a md5-b - (if (equal (car (split-string md5-a)) - (car (split-string md5-b))) - "probably the same" "different")))) - -(define-minor-mode dired-utils-format-information-line-mode - "Toggle formatting of disk space in the Dired information line." - :group 'dired-utils - :lighter "" - (if dired-utils-format-information-line-mode - (add-hook 'dired-after-readin-hook #'dired-utils-format-information-line) - (remove-hook 'dired-after-readin-hook #'dired-utils-format-information-line))) - -(provide 'dired-hacks-utils) - -;;; dired-hacks-utils.el ends here diff --git a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-autoloads.el b/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-autoloads.el deleted file mode 100644 index 3c63913..0000000 --- a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-autoloads.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; dired-rainbow-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-rainbow" "dired-rainbow.el" (0 0 0 0)) -;;; Generated autoloads from dired-rainbow.el - -(register-definition-prefixes "dired-rainbow" '("dired-rainbow-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-rainbow-autoloads.el ends here diff --git a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el b/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el deleted file mode 100644 index 648e6bb..0000000 --- a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-rainbow.el -*- no-byte-compile: t -*- -(define-package "dired-rainbow" "20190722.1109" "Extended file highlighting according to its type" '((dash "2.5.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matus Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matus Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow.el b/org/elpa/dired-rainbow-20190722.1109/dired-rainbow.el deleted file mode 100644 index 96ca264..0000000 --- a/org/elpa/dired-rainbow-20190722.1109/dired-rainbow.el +++ /dev/null @@ -1,181 +0,0 @@ -;;; dired-rainbow.el --- Extended file highlighting according to its type - -;; Copyright (C) 2014-2017 Matus Goljer - -;; Author: Matus Goljer -;; Maintainer: Matus Goljer -;; Keywords: files -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Package-Version: 20190722.1109 -;; Package-X-Original-Version: 20170922.817 -;; Version: 0.0.3 -;; Created: 16th February 2014 -;; Package-requires: ((dash "2.5.0") (dired-hacks-utils "0.0.1")) - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This package adds more customizable highlighting for files in dired -;; listings. The group `dired-faces' provides only nine faces and -;; isn't very fine-grained. -;; -;; The definitions are added by several macros, currently available -;; are: -;; -;; * `dired-rainbow-define` - add face by file extension -;; * `dired-rainbow-define-chmod` - add face by file permissions -;; -;; You can display their documentation by calling (substituting the -;; desired macro name): -;; -;; M-x describe-function RET dired-rainbow-define RET -;; -;; Here are some example uses: -;; -;; (defconst my-dired-media-files-extensions -;; '("mp3" "mp4" "MP3" "MP4" "avi" "mpg" "flv" "ogg") -;; "Media files.") -;; -;; (dired-rainbow-define html "#4e9a06" ("htm" "html" "xhtml")) -;; (dired-rainbow-define media "#ce5c00" my-dired-media-files-extensions) -;; -;; ; boring regexp due to lack of imagination -;; (dired-rainbow-define log (:inherit default -;; :italic t) ".*\\.log") -;; -;; ; highlight executable files, but not directories -;; (dired-rainbow-define-chmod executable-unix "Green" "-.*x.*") -;; -;; See https://github.com/Fuco1/dired-hacks for the entire collection. - -;;; Code: - -(require 'dired-hacks-utils) -(require 'dash) - -(defgroup dired-rainbow () - "Extended file highlighting according to its type." - :group 'dired-hacks - :prefix "dired-rainbow-") - -(defvar dired-rainbow-ext-to-face nil - "An alist mapping extension groups to face and compiled regexp. - -This alist is constructed in `dired-rainbow-define' for the case -when the user wants to reuse the associations outside of dired.") - -(defun dired-rainbow--get-face (face-props) - "Return face specification according to FACE-PROPS. - -See `dired-rainbow-define'." - (cond - ((stringp face-props) - `(:foreground ,face-props)) - ((symbolp face-props) - `(:inherit ,face-props)) - (t face-props))) - -(defmacro dired-rainbow-define (symbol face-props extensions &optional how) - "Define a custom dired face highlighting files by extension. - -SYMBOL is the identifier of the face. The macro will define a face named - - dired-rainbow-SYMBOL-face. - -FACE-PROPS is a string, a list or a symbol. If a string, it is -assumed to be either a color name or a hexadecimal code (#......) -describing a color. If a list, it is assumed to be a property -list describing the face. See `defface' for list of possible -attributes. If a symbol it is taken as the name of an existing -face which is used. - -EXTENSIONS is either a list or a symbol evaluating to a list of -extensions that should be highlighted with this face. Note that -if you specify a symbol, its value *must* be known during -compilation and must be defined before this macro is processed. - -Additionally, EXTENSIONS can be a single string or a symbol -evaluating to a string that is interpreted as a regexp matching -the entire file name. - -HOW is a parameter that is passed directly to `font-lock-add-keywords' -to control the order." - (declare (debug (symbolp [&or stringp listp symbolp] [&or symbolp listp stringp]))) - (let* ((matcher (if (or (listp extensions) - (stringp extensions)) - extensions - (symbol-value extensions))) - (regexp (concat - "^[^!].[^d].*[ ]" - dired-hacks-datetime-regexp - "[ ]\\(" - (if (listp matcher) - (concat ".*\\." (regexp-opt matcher)) - matcher) - "\\)$")) - (face-name (intern (concat "dired-rainbow-" (symbol-name symbol) "-face")))) - `(progn - (defface ,face-name - '((t ,(dired-rainbow--get-face face-props))) - ,(concat "dired-rainbow face matching " (symbol-name symbol) " files.") - :group 'dired-rainbow) - (font-lock-add-keywords 'dired-mode '((,regexp 1 ',face-name prepend)) ,how) - (font-lock-add-keywords 'wdired-mode '((,regexp 1 ',face-name prepend)) ,how) - ,(if (listp matcher) `(push - '(,matcher ,face-name ,(concat "\\." (regexp-opt matcher))) - dired-rainbow-ext-to-face))))) - -(defmacro dired-rainbow-define-chmod (symbol face-props chmod &optional how) - "Define a custom dired face highlighting files by chmod permissions. - -SYMBOL is the identifier of the face. The macro will define a face named - - dired-rainbow-SYMBOL-face. - -FACE-PROPS is a string, a list or a symbol. If a string, it is -assumed to be either a color name or a hexadecimal code (#......) -describing a color. If a list, it is assumed to be a property -list describing the face. See `defface' for list of possible -attributes. If a symbol it is taken as the name of an existing -face which is used. - -CHMOD is a regexp matching \"ls -l\" style permissions string. -For example, the pattern - - \"-.*x.*\" - -matches any file with executable flag set for user, group or everyone. - -HOW is a parameter that is passed directly to `font-lock-add-keywords' -to control the order." - (declare (debug (symbolp [&or stringp listp symbolp] stringp))) - (let* ((regexp (concat - "^[^!]." - chmod - ".*[ ]" - dired-hacks-datetime-regexp - "[ ]\\(.*?\\)$")) - (face-name (intern (concat "dired-rainbow-" (symbol-name symbol) "-face")))) - `(progn - (defface ,face-name - '((t ,(dired-rainbow--get-face face-props))) - ,(concat "dired-rainbow face matching " (symbol-name symbol) " files.") - :group 'dired-rainbow) - (font-lock-add-keywords 'dired-mode '((,regexp 1 ',face-name prepend)) ,how) - (font-lock-add-keywords 'wdired-mode '((,regexp 1 ',face-name prepend)) ,how)))) - -(provide 'dired-rainbow) - -;;; dired-rainbow.el ends here diff --git a/org/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el b/org/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el deleted file mode 100644 index f128edd..0000000 --- a/org/elpa/dired-ranger-20180401.2206/dired-ranger-autoloads.el +++ /dev/null @@ -1,73 +0,0 @@ -;;; dired-ranger-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-ranger" "dired-ranger.el" (0 0 0 0)) -;;; Generated autoloads from dired-ranger.el - -(autoload 'dired-ranger-copy "dired-ranger" "\ -Place the marked items in the copy ring. - -With non-nil prefix argument, add the marked items to the current -selection. This allows you to gather files from multiple dired -buffers for a single paste. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-paste "dired-ranger" "\ -Copy the items from copy ring to current directory. - -With raw prefix argument \\[universal-argument], do not remove -the selection from the stack so it can be copied again. - -With numeric prefix argument, copy the n-th selection from the -copy ring. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-move "dired-ranger" "\ -Move the items from copy ring to current directory. - -This behaves like `dired-ranger-paste' but moves the files -instead of copying them. - -\(fn ARG)" t nil) - -(autoload 'dired-ranger-bookmark "dired-ranger" "\ -Bookmark current dired buffer. - -CHAR is a single character (a-zA-Z0-9) representing the bookmark. -Reusing a bookmark replaces the content. These bookmarks are not -persistent, they are used for quick jumping back and forth -between currently used directories. - -\(fn CHAR)" t nil) - -(autoload 'dired-ranger-bookmark-visit "dired-ranger" "\ -Visit bookmark CHAR. - -If the associated dired buffer was killed, we try to reopen it -according to the setting `dired-ranger-bookmark-reopen'. - -The special bookmark `dired-ranger-bookmark-LRU' always jumps to -the least recently visited dired buffer. - -See also `dired-ranger-bookmark'. - -\(fn CHAR)" t nil) - -(register-definition-prefixes "dired-ranger" '("dired-ranger-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-ranger-autoloads.el ends here diff --git a/org/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el b/org/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el deleted file mode 100644 index 634fa93..0000000 --- a/org/elpa/dired-ranger-20180401.2206/dired-ranger-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-ranger.el -*- no-byte-compile: t -*- -(define-package "dired-ranger" "20180401.2206" "Implementation of useful ranger features for dired" '((dash "2.7.0") (dired-hacks-utils "0.0.1")) :commit "7c0ef09d57a80068a11edc74c3568e5ead5cc15a" :authors '(("Matúš Goljer" . "matus.goljer@gmail.com")) :maintainer '("Matúš Goljer" . "matus.goljer@gmail.com") :keywords '("files")) diff --git a/org/elpa/dired-ranger-20180401.2206/dired-ranger.el b/org/elpa/dired-ranger-20180401.2206/dired-ranger.el deleted file mode 100644 index a36b218..0000000 --- a/org/elpa/dired-ranger-20180401.2206/dired-ranger.el +++ /dev/null @@ -1,299 +0,0 @@ -;;; dired-ranger.el --- Implementation of useful ranger features for dired - -;; Copyright (C) 2014-2015 Matúš Goljer - -;; Author: Matúš Goljer -;; Maintainer: Matúš Goljer -;; Version: 0.0.1 -;; Package-Version: 20180401.2206 -;; Package-Commit: 7c0ef09d57a80068a11edc74c3568e5ead5cc15a -;; Created: 17th June 2014 -;; Package-requires: ((dash "2.7.0") (dired-hacks-utils "0.0.1")) -;; Keywords: files - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License -;; as published by the Free Software Foundation; either version 3 -;; of the License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; This package implements useful features present in the -;; [ranger](http://ranger.github.io/) file manager which are missing -;; in dired. - -;; Multi-stage copy/pasting of files -;; --------------------------------- - -;; A feature present in most orthodox file managers is a "two-stage" -;; copy/paste process. Roughly, the user first selects some files, -;; "copies" them into a clipboard and then pastes them to the target -;; location. This workflow is missing in dired. - -;; In dired, user first marks the files, then issues the -;; `dired-do-copy' command which prompts for the destination. The -;; files are then copied there. The `dired-dwim-target' option makes -;; this a bit friendlier---if two dired windows are opened, the other -;; one is automatically the default target. - -;; With the multi-stage operations, you can gather files from -;; *multiple* dired buffers into a single "clipboard", then copy or -;; move all of them to the target location. Another huge advantage is -;; that if the target dired buffer is already opened, switching to it -;; via ido or ibuffer is often faster than selecting the path. - -;; Call `dired-ranger-copy' to add marked files (or the file under -;; point if no files are marked) to the "clipboard". With non-nil -;; prefix argument, add the marked files to the current clipboard. - -;; Past clipboards are stored in `dired-ranger-copy-ring' so you can -;; repeat the past pastes. - -;; Call `dired-ranger-paste' or `dired-ranger-move' to copy or move -;; the files in the current clipboard to the current dired buffer. -;; With raw prefix argument (usually C-u), the clipboard is not -;; cleared, so you can repeat the copy operation in another dired -;; buffer. - -;; Bookmarks -;; --------- - -;; Use `dired-ranger-bookmark' to bookmark current dired buffer. You -;; can later quickly revisit it by calling -;; `dired-ranger-bookmark-visit'. - -;; A bookmark name is any single character, letter, digit or a symbol. - -;; A special bookmark with name `dired-ranger-bookmark-LRU' represents -;; the least recently used dired buffer. Its default value is `. If -;; you bind `dired-ranger-bookmark-visit' to the same keybinding, -;; hitting `` will instantly bring you to the previously used dired -;; buffer. This can be used to toggle between two dired buffers in a -;; very fast way. - -;; These bookmarks are not persistent. If you want persistent -;; bookmarks use the bookmarks provided by emacs, see (info "(emacs) -;; Bookmarks"). - -;;; Code: - -(require 'dired-hacks-utils) -(require 'dash) -(require 'ring) - -(defgroup dired-ranger () - "Implementation of useful ranger features for dired." - :group 'dired-hacks - :prefix "dired-ranger-") - - -;; multi-stage copy/paste operations -(defcustom dired-ranger-copy-ring-size 10 - "Specifies how many filesets for copy/paste operations should be stored." - :type 'integer - :group 'dired-ranger) - -(defvar dired-ranger-copy-ring (make-ring dired-ranger-copy-ring-size)) - -;;;###autoload -(defun dired-ranger-copy (arg) - "Place the marked items in the copy ring. - -With non-nil prefix argument, add the marked items to the current -selection. This allows you to gather files from multiple dired -buffers for a single paste." - (interactive "P") - ;; TODO: add dired+ `dired-get-marked-files' support? - (let ((marked (dired-get-marked-files))) - (if (or (not arg) - (ring-empty-p dired-ranger-copy-ring)) - (progn - (ring-insert - dired-ranger-copy-ring - (cons (list (current-buffer)) marked)) - ;; TODO: abstract the message/plural detection somewhere - ;; (e.g. give it a verb and number to produce the correct - ;; string.) - (message (format "Copied %d item%s into copy ring." - (length marked) - (if (> (length marked) 1) "s" "")))) - (let ((current (ring-remove dired-ranger-copy-ring 0))) - (ring-insert - dired-ranger-copy-ring - (cons (-distinct (cons (current-buffer) (car current))) - (-distinct (-concat (dired-get-marked-files) (cdr current))))) - (message (format "Added %d item%s into copy ring." - (length marked) - (if (> (length marked) 1) "s" ""))))))) - -(defun dired-ranger--revert-target (char target-directory files) - "Revert the target buffer and mark the new files. - -CHAR is the temporary value for `dired-marker-char'. - -TARGET-DIRECTORY is the current dired directory. - -FILES is the list of files (from the `dired-ranger-copy-ring') we -operated on." - (let ((current-file (dired-utils-get-filename))) - (revert-buffer) - (let ((dired-marker-char char)) - (--each (-map 'file-name-nondirectory files) - (dired-utils-goto-line (concat target-directory it)) - (dired-mark 1))) - (dired-utils-goto-line current-file))) - -;;;###autoload -(defun dired-ranger-paste (arg) - "Copy the items from copy ring to current directory. - -With raw prefix argument \\[universal-argument], do not remove -the selection from the stack so it can be copied again. - -With numeric prefix argument, copy the n-th selection from the -copy ring." - (interactive "P") - (let* ((index (if (numberp arg) arg 0)) - (data (ring-ref dired-ranger-copy-ring index)) - (files (cdr data)) - (target-directory (dired-current-directory)) - (copied-files 0)) - (--each files (when (file-exists-p it) - (if (file-directory-p it) - (copy-directory it target-directory) - (condition-case err - (copy-file it target-directory 0) - (file-already-exists nil))) - (cl-incf copied-files))) - (dired-ranger--revert-target ?P target-directory files) - (unless arg (ring-remove dired-ranger-copy-ring 0)) - (message (format "Pasted %d/%d item%s from copy ring." - copied-files - (length files) - (if (> (length files) 1) "s" ""))))) - -;;;###autoload -(defun dired-ranger-move (arg) - "Move the items from copy ring to current directory. - -This behaves like `dired-ranger-paste' but moves the files -instead of copying them." - (interactive "P") - (let* ((index (if (numberp arg) arg 0)) - (data (ring-ref dired-ranger-copy-ring index)) - (buffers (car data)) - (files (cdr data)) - (target-directory (dired-current-directory)) - (copied-files 0)) - (--each files (when (file-exists-p it) - (condition-case err - (rename-file it target-directory 0) - (file-already-exists nil)) - (cl-incf copied-files))) - (dired-ranger--revert-target ?M target-directory files) - (--each buffers - (when (buffer-live-p it) - (with-current-buffer it (revert-buffer)))) - (unless arg (ring-remove dired-ranger-copy-ring 0)) - (message (format "Moved %d/%d item%s from copy ring." - copied-files - (length files) - (if (> (length files) 1) "s" ""))))) - - -;; bookmarks -(defcustom dired-ranger-bookmark-reopen 'ask - "Should we reopen closed dired buffer when visiting a bookmark? - -This does only correctly reopen regular dired buffers listing one -directory. Special dired buffers like the output of `find-dired' -or `ag-dired', virtual dired buffers and subdirectories can not -be recreated. - -The value 'never means never reopen the directory. - -The value 'always means always reopen the directory. - -The value 'ask will ask if we should reopen or not. Reopening a -dired buffer for a directory that is already opened in dired will -bring that up, which might be unexpected as that directory might -come from a non-standard source (i.e. not be file-system -backed)." - :type '(radio - (const :tag "Never reopen automatically." never) - (const :tag "Always reopen automatically." always) - (const :tag "Reopen automatically only in standard dired buffers, ask otherwise." ask)) - :group 'dired-ranger) - -(defcustom dired-ranger-bookmark-LRU ?` - "Bookmark representing the least recently used/visited dired buffer. - -If a dired buffer is currently active, select the one visited -before. If a non-dired buffer is active, visit the least -recently visited dired buffer." - :type 'char - :group 'dired-ranger) - -(defvar dired-ranger-bookmarks nil - "An alist mapping bookmarks to dired buffers and locations.") - -;;;###autoload -(defun dired-ranger-bookmark (char) - "Bookmark current dired buffer. - -CHAR is a single character (a-zA-Z0-9) representing the bookmark. -Reusing a bookmark replaces the content. These bookmarks are not -persistent, they are used for quick jumping back and forth -between currently used directories." - (interactive "cBookmark name: ") - (let ((dir (file-truename default-directory))) - (-if-let (value (cdr (assoc char dired-ranger-bookmarks))) - (setf (cdr (assoc char dired-ranger-bookmarks)) (cons dir (current-buffer))) - (push (-cons* char dir (current-buffer)) dired-ranger-bookmarks)) - (message "Bookmarked directory %s as `%c'" dir char))) - -;;;###autoload -(defun dired-ranger-bookmark-visit (char) - "Visit bookmark CHAR. - -If the associated dired buffer was killed, we try to reopen it -according to the setting `dired-ranger-bookmark-reopen'. - -The special bookmark `dired-ranger-bookmark-LRU' always jumps to -the least recently visited dired buffer. - -See also `dired-ranger-bookmark'." - (interactive "cBookmark name: ") - (if (eq char dired-ranger-bookmark-LRU) - (progn - (let ((buffers (buffer-list))) - (when (eq (with-current-buffer (car buffers) major-mode) 'dired-mode) - (pop buffers)) - (switch-to-buffer (--first (eq (with-current-buffer it major-mode) 'dired-mode) buffers)))) - (-if-let* ((value (cdr (assoc char dired-ranger-bookmarks))) - (dir (car value)) - (buffer (cdr value))) - (if (buffer-live-p buffer) - (switch-to-buffer buffer) - (when - ;; TODO: abstract this never/always/ask pattern. It is - ;; also used in filter. - (cond - ((eq dired-ranger-bookmark-reopen 'never) nil) - ((eq dired-ranger-bookmark-reopen 'always) t) - ((eq dired-ranger-bookmark-reopen 'ask) - (y-or-n-p (format "The dired buffer referenced by this bookmark does not exist. Should we try to reopen `%s'?" dir)))) - (find-file dir) - (setf (cdr (assoc char dired-ranger-bookmarks)) (cons dir (current-buffer))))) - (message "Bookmark `%c' does not exist." char)))) - -(provide 'dired-ranger) -;;; dired-ranger.el ends here diff --git a/org/elpa/dired-single-20211101.2319/dired-single-autoloads.el b/org/elpa/dired-single-20211101.2319/dired-single-autoloads.el deleted file mode 100644 index b89f7ff..0000000 --- a/org/elpa/dired-single-20211101.2319/dired-single-autoloads.el +++ /dev/null @@ -1,73 +0,0 @@ -;;; dired-single-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "dired-single" "dired-single.el" (0 0 0 0)) -;;; Generated autoloads from dired-single.el - -(autoload 'dired-single-buffer "dired-single" "\ -Visit selected directory in current buffer. - -Visits the selected directory in the current buffer, replacing the - current contents with the contents of the new directory. This doesn't - prevent you from having more than one dired buffer. The main difference - is that a given dired buffer will not spawn off a new buffer every time - a new directory is visited. - -If the variable `dired-single-use-magic-buffer' is non-nil, and the current - buffer's name is the same as that specified by the variable -`dired-single-magic-buffer-name', then the new directory's buffer will retain - that same name (i.e. not only will dired only use a single buffer, but -its name will not change every time a new directory is entered). - -Optional argument DEFAULT-DIRNAME specifies the directory to visit; if not -specified, the directory or file on the current line is used (assuming it's -a dired buffer). If the current line represents a file, the file is visited -in another window. - -\(fn &optional DEFAULT-DIRNAME)" t nil) - -(autoload 'dired-single-buffer-mouse "dired-single" "\ -Mouse-initiated version of `dired-single-buffer' (which see). - -Argument CLICK is the mouse-click event. - -\(fn CLICK)" t nil) - -(autoload 'dired-single-magic-buffer "dired-single" "\ -Switch to buffer whose name is the value of `dired-single-magic-buffer-name'. - -If no such buffer exists, launch dired in a new buffer and rename that buffer -to the value of `dired-single-magic-buffer-name'. If the current buffer is the -magic buffer, it will prompt for a new directory to visit. - -Optional argument DEFAULT-DIRNAME specifies the directory to visit (defaults to -the currently displayed directory). - -\(fn &optional DEFAULT-DIRNAME)" t nil) - -(autoload 'dired-single-toggle-buffer-name "dired-single" "\ -Toggle between the 'magic' buffer name and the 'real' dired buffer name. - -Will also seek to uniquify the 'real' buffer name." t nil) - -(autoload 'dired-single-up-directory "dired-single" "\ -Like `dired-up-directory' but with `dired-single-buffer'. - -\(fn &optional OTHER-WINDOW)" t nil) - -(register-definition-prefixes "dired-single" '("dired-single-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; dired-single-autoloads.el ends here diff --git a/org/elpa/dired-single-20211101.2319/dired-single-pkg.el b/org/elpa/dired-single-20211101.2319/dired-single-pkg.el deleted file mode 100644 index cc8a0b8..0000000 --- a/org/elpa/dired-single-20211101.2319/dired-single-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from dired-single.el -*- no-byte-compile: t -*- -(define-package "dired-single" "20211101.2319" "Reuse the current dired buffer to visit a directory" 'nil :commit "b254f9b7bfc96a5eab5760a56811f2872d2c590a" :keywords '("dired" "reuse" "buffer") :url "https://github.com/crocket/dired-single") diff --git a/org/elpa/dired-single-20211101.2319/dired-single.el b/org/elpa/dired-single-20211101.2319/dired-single.el deleted file mode 100644 index 20e6dd2..0000000 --- a/org/elpa/dired-single-20211101.2319/dired-single.el +++ /dev/null @@ -1,215 +0,0 @@ -;;; dired-single.el --- Reuse the current dired buffer to visit a directory - -;; Version: 0.3.0 -;; Package-Version: 20211101.2319 -;; Package-Commit: b254f9b7bfc96a5eab5760a56811f2872d2c590a -;; Keywords: dired, reuse, buffer -;; URL: https://github.com/crocket/dired-single -;; License: public-domain - -;;; Code: -(eval-when-compile - (defvar byte-compile-dynamic nil) ; silence the old byte-compiler - (set (make-local-variable 'byte-compile-dynamic) t)) - -(eval-and-compile - (require 'cl-lib) - (require 'dired) - (autoload 'dired-get-filename "dired")) - -;;; ************************************************************************** -;;; ***** customization routines -;;; ************************************************************************** -(defgroup dired-single nil - "dired-single package customization" - :group 'tools) - -;; --------------------------------------------------------------------------- -(defun dired-single-customize () - "Customization of the group `dired-single'." - (interactive) - (customize-group "dired-single")) - -;; --------------------------------------------------------------------------- -(defcustom dired-single-use-magic-buffer t - "Boolean that indicates the use of a single dired buffer name. - -It is used to determine if the dired-single functions should look for and -retain a specific buffer name. The buffer name to look for is specified -with `dired-single-magic-buffer-name'." - :group 'dired-single - :type 'boolean) - -;; --------------------------------------------------------------------------- -(defcustom dired-single-magic-buffer-name "*dired*" - "Name of buffer to use if `dired-single-use-magic-buffer' is true. - -Once a dired buffer has this name, it will always keep this name (unless it's - explicitly renamed by you)." - :group 'dired-single - :type 'string) - -;; --------------------------------------------------------------------------- -(defcustom dired-single-load-hook nil - "Hook to run when package is loaded." - :type 'hook - :group 'dired-single) - -;;; ************************************************************************** -;;; ***** version related routines -;;; ************************************************************************** -(defconst dired-single-version - "$Revision: 1.7 $" - "Version number for dired-single package.") - -;; --------------------------------------------------------------------------- -(defun dired-single-version-number () - "Return dired-single version number." - (string-match "[0123456789.]+" dired-single-version) - (match-string 0 dired-single-version)) - -;; --------------------------------------------------------------------------- -(defun dired-single-display-version () - "Display dired-single version." - (interactive) - (message "dired-single version <%s>." (dired-single-version-number))) - -;;; ************************************************************************** -;;; ***** interactive functions -;;; ************************************************************************** -;;;###autoload -(defun dired-single-buffer (&optional default-dirname) - "Visit selected directory in current buffer. - -Visits the selected directory in the current buffer, replacing the - current contents with the contents of the new directory. This doesn't - prevent you from having more than one dired buffer. The main difference - is that a given dired buffer will not spawn off a new buffer every time - a new directory is visited. - -If the variable `dired-single-use-magic-buffer' is non-nil, and the current - buffer's name is the same as that specified by the variable -`dired-single-magic-buffer-name', then the new directory's buffer will retain - that same name (i.e. not only will dired only use a single buffer, but -its name will not change every time a new directory is entered). - -Optional argument DEFAULT-DIRNAME specifies the directory to visit; if not -specified, the directory or file on the current line is used (assuming it's -a dired buffer). If the current line represents a file, the file is visited -in another window." - (interactive) - ;; use arg passed in or find name of current line - (let ((name (or default-dirname (dired-get-filename nil t)))) - (save-excursion - (save-match-data - ;; See if the selection is a directory or not. - (end-of-line) - (let ((eol (point))) - (beginning-of-line) - ;; assume directory if arg passed in - (if (or default-dirname (re-search-forward "^ d" eol t)) - ;; save current buffer's name - (let ((current-buffer-name (buffer-name))) - ;; go ahead and read in the directory - (find-alternate-file name) - ;; if the saved buffer's name was the magic name, rename this buffer - (if (and dired-single-use-magic-buffer - (string= current-buffer-name dired-single-magic-buffer-name)) - (rename-buffer dired-single-magic-buffer-name))) - ;; it's just a file - (find-file name))))))) - -;;;; ------------------------------------------------------------------------ -;;;###autoload -(defun dired-single-buffer-mouse (click) - "Mouse-initiated version of `dired-single-buffer' (which see). - -Argument CLICK is the mouse-click event." - (interactive "e") - (let* ( (start (event-start click)) - (window (car start)) - (pos (car (cdr start))) ) - (select-window window) - (goto-char pos)) - (dired-single-buffer)) - -;;;; ------------------------------------------------------------------------ -;;;###autoload -(defun dired-single-magic-buffer (&optional default-dirname) - "Switch to buffer whose name is the value of `dired-single-magic-buffer-name'. - -If no such buffer exists, launch dired in a new buffer and rename that buffer -to the value of `dired-single-magic-buffer-name'. If the current buffer is the -magic buffer, it will prompt for a new directory to visit. - -Optional argument DEFAULT-DIRNAME specifies the directory to visit (defaults to -the currently displayed directory)." - (interactive) - ;; do we not have one or are we already in it? - (let ((magic-dired-buffer (get-buffer dired-single-magic-buffer-name))) - (if (or (eq magic-dired-buffer nil) - (eq magic-dired-buffer (current-buffer))) - ;; nothing to switch to - ;; get directory name to start in - (let ((dirname (or default-dirname - (read-file-name (format "Dired %s(directory): " "") - nil default-directory t)))) - - ;; make sure it's really a directory - (if (not (file-directory-p dirname)) - (error "Error: <%s> is not a directory" dirname)) - - ;; do we need a new buffer? - (if (eq magic-dired-buffer nil) - ;; find the file in new buffer, current window - (find-file dirname) - ;; just find in place of current buffer - (find-alternate-file dirname)) - ;; rename the buffer, where ever we found it - (rename-buffer dired-single-magic-buffer-name)) - ;; we're not there (we have one already), so simply switch to it - (switch-to-buffer magic-dired-buffer) - ;; if called with a default, try it again - (if default-dirname - (dired-single-magic-buffer default-dirname))))) - -;;;; ------------------------------------------------------------------------ -;;;###autoload -(defun dired-single-toggle-buffer-name () - "Toggle between the 'magic' buffer name and the 'real' dired buffer name. - -Will also seek to uniquify the 'real' buffer name." - (interactive) - - ;; make sure it's a dired buffer - (if (not (string= major-mode "dired-mode")) - (error "Error: not a dired buffer")) - - ;; do we have magic name currently? - (if (string= (buffer-name) dired-single-magic-buffer-name) - (rename-buffer - (abbreviate-file-name - (expand-file-name (directory-file-name default-directory))) t) - - ;; make sure the buffer doesn't currently exist - (let ((existing-buffer (get-buffer dired-single-magic-buffer-name))) - (if existing-buffer - (kill-buffer existing-buffer)) - (rename-buffer dired-single-magic-buffer-name)))) - -;;;; ------------------------------------------------------------------------ -;;;###autoload -(defun dired-single-up-directory (&optional other-window) - "Like `dired-up-directory' but with `dired-single-buffer'." - (interactive) - ;; replace dired with dired-single-buffer - (cl-letf (((symbol-function 'dired) (symbol-function 'dired-single-buffer))) - (dired-up-directory other-window))) - -;;; ************************************************************************** -;;; ***** we're done -;;; ************************************************************************** -(provide 'dired-single) -(run-hooks 'dired-single-load-hook) - -;;; dired-single.el ends here diff --git a/org/elpa/git-20140128.1041/git-autoloads.el b/org/elpa/git-20140128.1041/git-autoloads.el new file mode 100644 index 0000000..219c6d3 --- /dev/null +++ b/org/elpa/git-20140128.1041/git-autoloads.el @@ -0,0 +1,22 @@ +;;; git-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "git" "git.el" (0 0 0 0)) +;;; Generated autoloads from git.el + +(register-definition-prefixes "git" '("git-")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; git-autoloads.el ends here diff --git a/org/elpa/git-20140128.1041/git-pkg.el b/org/elpa/git-20140128.1041/git-pkg.el new file mode 100644 index 0000000..6e88e5c --- /dev/null +++ b/org/elpa/git-20140128.1041/git-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from git.el -*- no-byte-compile: t -*- +(define-package "git" "20140128.1041" "An Elisp API for programmatically using Git" '((s "1.7.0") (dash "2.2.0") (f "0.10.0")) :commit "a3396a7027a7d986598c6a2d6d5599bac918f3da" :authors '(("Johan Andersson" . "johan.rejeep@gmail.com")) :maintainer '("Johan Andersson" . "johan.rejeep@gmail.com") :keywords '("git") :url "http://github.com/rejeep/git.el") diff --git a/org/elpa/git-20140128.1041/git.el b/org/elpa/git-20140128.1041/git.el new file mode 100644 index 0000000..f1569bd --- /dev/null +++ b/org/elpa/git-20140128.1041/git.el @@ -0,0 +1,280 @@ +;;; git.el --- An Elisp API for programmatically using Git + +;; Copyright (C) 2013 Johan Andersson + +;; Author: Johan Andersson +;; Maintainer: Johan Andersson +;; Version: 0.1.1 +;; Package-Version: 20140128.1041 +;; Package-Commit: a3396a7027a7d986598c6a2d6d5599bac918f3da +;; Keywords: git +;; URL: http://github.com/rejeep/git.el +;; Package-Requires: ((s "1.7.0") (dash "2.2.0") (f "0.10.0")) + +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code: + +;; Todo: no-pager + +(require 's) +(require 'dash) +(require 'f) + +(defvar git-executable + (executable-find "git") + "Git executable.") + +(defvar git-repo nil + "Path to current working repo.") + +(defvar git-args nil + "List of args to include when running git command.") + +(defconst git-stash-re "^\\(.+?\\): \\(?:WIP on\\|On\\) \\(.+\\): \\(.+\\)$" + "Regular expression matching a stash.") + +(put 'git-error 'error-conditions '(error git-error)) +(put 'git-error 'error-message "GIT Error") + +(defun git-error (string &rest args) + "Signal a GIT error. + +Signal an error with `git-error' type. + +STRING is a `format' string, and ARGS are the formatted objects." + (signal 'git-error (list (apply #'format string args)))) + +(defun git-run (command &rest args) + "Run git COMMAND with ARGS." + (let ((default-directory (f-full git-repo))) + (with-temp-buffer + (let ((exit-code + (apply + 'call-process + (append + (list git-executable nil (current-buffer) nil) + (git--args command args))))) + (if (zerop exit-code) + (buffer-string) + (git-error + "Error running command: %s %s\n%s" + git-executable + (s-join " " (git--args command args)) + (buffer-string))))))) + +(defun git-repo? (directory) + "Return true if there is a git repo in DIRECTORY, false otherwise." + (or + (f-dir? (f-expand ".git" directory)) + (and + (f-dir? (f-expand "info" directory)) + (f-dir? (f-expand "objects" directory)) + (f-dir? (f-expand "refs" directory)) + (f-file? (f-expand "HEAD" directory))))) + +(defun git-branch? (branch) + "Return true if there's a branch called BRANCH." + (-contains? (git-branches) branch)) + +(defun git-tag? (tag) + "Return true if there's a tag called TAG." + (-contains? (git-tags) tag)) + +(defun git-on-branch () + "Return currently active branch." + (condition-case err + (git--clean (git-run "rev-parse" "--abbrev-ref" "HEAD")) + (git-error + (git-error "Repository not initialized")))) + +(defun git-on-branch? (branch) + "Return true if BRANCH is currently active." + (equal branch (git-on-branch))) + +(defun git-add (&rest files) + "Add PATH or everything." + (git-run "add" (or files "."))) + +(defun git-branch (branch) + "Create BRANCH." + (if (git-branch? branch) + (git-error "Branch already exists %s" branch) + (git-run "branch" branch))) + +(defun git-branches () + "List all available branches." + (-map + (lambda (line) + (if (s-starts-with? "*" line) + (substring line 2) + line)) + (git--lines (git-run "branch")))) + +(defun git-checkout (ref) + "Checkout REF." + (git-run "checkout" ref)) + +(defun git-clone (url &optional dir) + "Clone URL to DIR (if present)." + (git-run "clone" url dir)) + +(defun git-commit (message &rest files) + "Commit FILES (or added files) with MESSAGE." + (git-run "commit" (or files "-a") "--message" message files)) + +(defun git-fetch (&optional repo) + "Fetch REPO." + (git-run "fetch" repo)) + +(defun git-init (&optional dir bare) + "Create new Git repo at DIR (or `git-repo'). + +If BARE is true, create a bare repo." + (let ((git-repo (or dir git-repo))) + (git-run "init" (and bare "--bare")))) + +;; Todo: The solution used here is not bulletproof. For example if the +;; message contains a pipe, the :message will only include everything +;; before that pipe. Figure out a good solution for this. +(defun git-log (&optional branch) + "Log history on BRANCH." + (let ((logs (git--lines (git-run "log" "--format=%h|%an|%ae|%cn|%ce|%ad|%s")))) + (-map + (lambda (log) + (let ((data (s-split "|" log))) + (list + :commit (nth 0 data) + :author-name (nth 1 data) + :author-email (nth 2 data) + :comitter-name (nth 3 data) + :comitter-email (nth 4 data) + :date (nth 5 data) + :message (nth 6 data)))) + logs))) + +(defun git-config (option &optional value) + "Set or get config OPTION. Set to VALUE if present." + (condition-case err + (git--clean (git-run "config" option value)) + (git-error))) + +(defun git-pull (&optional repo ref) + "Pull REF from REPO." + (git-run "pull" repo ref)) + +(defun git-push (&optional repo ref) + "Push REF to REPO." + (git-run "push" repo ref)) + +(defun git-remote? (name) + "Return true if remote with NAME exists, false otherwise." + (-contains? (git-remotes) name)) + +(defun git-remotes () + "Return list of all remotes." + (git--lines (git-run "remote"))) + +(defun git-remote-add (name url) + "Add remote with NAME and URL." + (git-run "remote" "add" name url)) + +(defun git-remote-remove (name) + "Remove remote with NAME." + (if (git-remote? name) + (git-run "remote" "remove" name) + (git-error "No such remote %s" name))) + +(defun git-reset (&optional commit mode) + "Reset to COMMIT with MODE." + (git-run "reset" (if mode (concat "--" (symbol-name mode))) commit)) + +(defun git-rm (path &optional recursive) + "Remove PATH. + +To remove directory, use RECURSIVE argument." + (git-run "rm" path (and recursive "-r"))) + +(defun git-stash (&optional message) + "Stash changes in a dirty tree with MESSAGE. + +If a stash was created, the name of the stash is returned, +otherwise nil is returned." + (let ((before-stashes (git-stashes)) after-stashes) + (git-run "stash" "save" message) + (setq after-stashes (git-stashes)) + (if (> (length after-stashes) (length before-stashes)) + (plist-get (car after-stashes) :name)))) + +(defun git-stashes () + "Return list of stashes." + (let ((stashes (git--lines (git-run "stash" "list")))) + (-map + (lambda (stash) + (let ((matches (s-match git-stash-re stash))) + (list :name (nth 1 matches) + :branch (nth 2 matches) + :message (nth 3 matches)))) + stashes))) + +(defun git-stash-pop (&optional name) + "Apply and remove stash with NAME (or first stash)." + (git-run "stash" "pop" name)) + +(defun git-stash-apply (&optional name) + "Apply and keep stash with NAME (or first stash)." + (git-run "stash" "apply" name)) + +(defun git-tag (tag) + "Create TAG." + (if (git-tag? tag) + (git-error "Tag already exists %s" tag) + (git-run "tag" tag))) + +(defun git-tags () + "Return list of all tags." + (git--lines (git-run "tag"))) + +(defun git-untracked-files () + "Return list of untracked files." + (git--lines + (git-run "ls-files" "--other" "--exclude-standard"))) + +(defun git-staged-files () + "Return list of staged files." + (git--lines + (git-run "diff" "--cached" "--name-only"))) + + +;;;; Helpers + +(defun git--lines (string) + (-reject 's-blank? (-map 's-trim (s-lines string)))) + +(defun git--clean (string) + (s-presence (s-trim string))) + +(defun git--args (command &rest args) + (-flatten (-reject 'null (append (list "--no-pager" command) args git-args)))) + + +(provide 'git) + +;;; git.el ends here diff --git a/org/elpa/origami-20200331.1019/origami-autoloads.el b/org/elpa/origami-20200331.1019/origami-autoloads.el new file mode 100644 index 0000000..60a3561 --- /dev/null +++ b/org/elpa/origami-20200331.1019/origami-autoloads.el @@ -0,0 +1,76 @@ +;;; origami-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "origami" "origami.el" (0 0 0 0)) +;;; Generated autoloads from origami.el + +(autoload 'origami-mode "origami" "\ +Minor mode to selectively hide/show text in the current buffer. +With a prefix argument ARG, enable the mode if ARG is positive, +and disable it otherwise. If called from Lisp, enable the mode +if ARG is omitted or nil. + +Lastly, the normal hook `origami-mode-hook' is run using +`run-hooks'. + +Key bindings: +\\{origami-mode-map} + +\(fn &optional ARG)" t nil) + +(put 'global-origami-mode 'globalized-minor-mode t) + +(defvar global-origami-mode nil "\ +Non-nil if Global Origami mode is enabled. +See the `global-origami-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `global-origami-mode'.") + +(custom-autoload 'global-origami-mode "origami" nil) + +(autoload 'global-origami-mode "origami" "\ +Toggle Origami mode in all buffers. +With prefix ARG, enable Global Origami mode if ARG is positive; +otherwise, disable it. + +If called from Lisp, toggle the mode if ARG is `toggle'. +Enable the mode if ARG is nil, omitted, or is a positive number. +Disable the mode if ARG is a negative number. + +Origami mode is enabled in all buffers where `(lambda nil +\(origami-mode 1))' would do it. + +See `origami-mode' for more information on Origami mode. + +\(fn &optional ARG)" t nil) + +(register-definition-prefixes "origami" '("origami-")) + +;;;*** + +;;;### (autoloads nil "origami-parsers" "origami-parsers.el" (0 0 +;;;;;; 0 0)) +;;; Generated autoloads from origami-parsers.el + +(register-definition-prefixes "origami-parsers" '("origami-")) + +;;;*** + +;;;### (autoloads nil nil ("origami-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; origami-autoloads.el ends here diff --git a/org/elpa/origami-20200331.1019/origami-parsers.el b/org/elpa/origami-20200331.1019/origami-parsers.el new file mode 100644 index 0000000..78bee8f --- /dev/null +++ b/org/elpa/origami-20200331.1019/origami-parsers.el @@ -0,0 +1,266 @@ +;;; origami-parsers.el --- Collection of parsers -*- lexical-binding: t -*- + +;; Author: Greg Sexton +;; Version: 1.0 +;; Keywords: parsers +;; URL: https://github.com/gregsexton/ + +;; The MIT License (MIT) + +;; Copyright (c) 2014 Greg Sexton + +;; Permission is hereby granted, free of charge, to any person obtaining a copy +;; of this software and associated documentation files (the "Software"), to deal +;; in the Software without restriction, including without limitation the rights +;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +;; copies of the Software, and to permit persons to whom the Software is +;; furnished to do so, subject to the following conditions: + +;; The above copyright notice and this permission notice shall be included in +;; all copies or substantial portions of the Software. + +;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +;; THE SOFTWARE. + +;;; Commentary: + +;;; Code: +(require 'cl) +(require 'dash) + +(defun origami-get-positions (content regex) + "Returns a list of positions where REGEX matches in CONTENT. A +position is a cons cell of the character and the numerical +position in the CONTENT." + (with-temp-buffer + (insert content) + (goto-char (point-min)) + (let (acc) + (while (re-search-forward regex nil t) + (let ((match (match-string 0))) + (setq acc (cons (cons match (- (point) (length match))) + acc)))) + (reverse acc)))) + +(defun origami-indent-parser (create) + (cl-labels ((lines (string) (origami-get-positions string ".*?\r?\n")) + (annotate-levels (lines) + (-map (lambda (line) + ;; TODO: support tabs + (let ((indent (length (car (s-match "^ *" (car line))))) + (beg (cdr line)) + (end (+ (cdr line) (length (car line)) -1))) + (if (s-blank? (s-trim (car line))) + 'newline ;sentinel representing line break + (vector indent beg end (- end beg))))) + lines)) + (indent (line) (if (eq line 'newline) -1 (aref line 0))) + (beg (line) (aref line 1)) + (end (line) (aref line 2)) + (offset (line) (aref line 3)) + (collapse-same-level (lines) + (->> + (cdr lines) + (-reduce-from (lambda (acc line) + (cond ((and (eq line 'newline) (eq (car acc) 'newline)) acc) + ((= (indent line) (indent (car acc))) + (cons (vector (indent (car acc)) + (beg (car acc)) + (end line) + (offset (car acc))) + (cdr acc))) + (t (cons line acc)))) + (list (car lines))) + (remove 'newline) + reverse)) + (create-tree (levels) + (if (null levels) + levels + (let ((curr-indent (indent (car levels)))) + (->> levels + (-partition-by (lambda (l) (= (indent l) curr-indent))) + (-partition-all 2) + (-mapcat (lambda (x) + ;takes care of multiple identical levels, introduced when there are newlines + (-concat + (-map 'list (butlast (car x))) + (list (cons (-last-item (car x)) (create-tree (cadr x))))))))))) + (build-nodes (tree) + (if (null tree) (cons 0 nil) + ;; complexity here is due to having to find the end of the children so that the + ;; parent encompasses them + (-reduce-r-from (lambda (nodes acc) + (destructuring-bind (children-end . children) (build-nodes (cdr nodes)) + (let ((this-end (max children-end (end (car nodes))))) + (cons (max this-end (car acc)) + (cons (funcall create + (beg (car nodes)) + this-end + (offset (car nodes)) + children) + (cdr acc)))))) + '(0 . nil) + tree)))) + (lambda (content) + (-> content + lines + annotate-levels + collapse-same-level + create-tree + build-nodes + cdr)))) + +(defun origami-build-pair-tree (create open close positions) + (cl-labels ((build (positions) + ;; this is so horrible, but fast + (let (acc beg (should-continue t)) + (while (and should-continue positions) + (cond ((equal (caar positions) open) + (if beg ;go down a level + (let* ((res (build positions)) + (new-pos (car res)) + (children (cdr res))) + (setq positions (cdr new-pos)) + (setq acc (cons (funcall create beg (cdar new-pos) (length open) children) + acc)) + (setq beg nil)) + ;; begin a new pair + (setq beg (cdar positions)) + (setq positions (cdr positions)))) + ((equal (caar positions) close) + (if beg + (progn ;close with no children + (setq acc (cons (funcall create beg (cdar positions) (length close) nil) + acc)) + (setq positions (cdr positions)) + (setq beg nil)) + (setq should-continue nil))))) + (cons positions (reverse acc))))) + (cdr (build positions)))) + +;;; TODO: tag these nodes? have ability to manipulate nodes that are +;;; tagged? in a scoped fashion? +(defun origami-javadoc-parser (create) + (lambda (content) + (let ((positions (->> (origami-get-positions content "/\\*\\*\\|\\*/") + (-filter (lambda (position) + (eq (get-text-property 0 'face (car position)) + 'font-lock-doc-face)))))) + (origami-build-pair-tree create "/**" "*/" positions)))) + +(defun origami-c-style-parser (create) + (lambda (content) + (let ((positions (->> (origami-get-positions content "[{}]") + (remove-if (lambda (position) + (let ((face (get-text-property 0 'face (car position)))) + (-any? (lambda (f) + (memq f '(font-lock-doc-face + font-lock-comment-face + font-lock-string-face))) + (if (listp face) face (list face))))))))) + (origami-build-pair-tree create "{" "}" positions)))) + +(defun origami-c-macro-parser (create) + (lambda (content) + (let ((positions (origami-get-positions content "#if\\|#endif"))) + (origami-build-pair-tree create "#if" "#endif" positions)))) + +(defun origami-c-parser (create) + (let ((c-style (origami-c-style-parser create)) + (macros (origami-c-macro-parser create))) + (lambda (content) + (origami-fold-children + (origami-fold-shallow-merge + (origami-fold-root-node (funcall c-style content)) + (origami-fold-root-node (funcall macros content))))))) + +(defun origami-java-parser (create) + (let ((c-style (origami-c-style-parser create)) + (javadoc (origami-javadoc-parser create))) + (lambda (content) + (origami-fold-children + (origami-fold-shallow-merge (origami-fold-root-node (funcall c-style content)) + (origami-fold-root-node (funcall javadoc content))))))) + +(defun origami-python-parser (create) + (lambda (content) + (with-temp-buffer + (insert content) + (python-mode) + (defun python-subparser (beg end) + "find all fold block between beg and end." + (goto-char beg) + (let (acc) + ;; iterate all same level children. + (while (and (beginning-of-defun -1) (<= (point) end)) ;; have children between beg and end? + (let* ((new-beg (point)) + (new-offset (progn (search-forward-regexp ":" nil t) (- (point) new-beg))) + (new-end (progn (end-of-defun) (point)))) + (setq acc (cons (funcall create new-beg new-end new-offset + (python-subparser new-beg new-end)) + acc)) + (goto-char new-end))) + acc)) + (python-subparser (point-min) (point-max))))) + +(defun origami-lisp-parser (create regex) + (lambda (content) + (with-temp-buffer + (insert content) + (goto-char (point-min)) + (beginning-of-defun -1) + (let (beg end offset acc) + (while (< (point) (point-max)) + (setq beg (point)) + (search-forward-regexp regex nil t) + (setq offset (- (point) beg)) + (end-of-defun) + (backward-char) ;move point to one after the last paren + (setq end (1- (point))) ;don't include the last paren in the fold + (when (> offset 0) + (setq acc (cons (funcall create beg end offset nil) acc))) + (beginning-of-defun -1)) + (reverse acc))))) + +(defun origami-elisp-parser (create) + (origami-lisp-parser create "(def\\w*\\s-*\\(\\s_\\|\\w\\|[:?!]\\)*\\([ \\t]*(.*?)\\)?")) + +(defun origami-clj-parser (create) + (origami-lisp-parser create "(def\\(\\w\\|-\\)*\\s-*\\(\\s_\\|\\w\\|[?!]\\)*\\([ \\t]*\\[.*?\\]\\)?")) + +(defun origami-markers-parser (start-marker end-marker) + "Create a parser for simple start and end markers." + (let ((regex (rx-to-string `(or ,start-marker ,end-marker)))) + (lambda (create) + (lambda (content) + (let ((positions (origami-get-positions content regex))) + (origami-build-pair-tree create start-marker end-marker positions)))))) + +(defcustom origami-parser-alist + `((java-mode . origami-java-parser) + (c-mode . origami-c-parser) + (c++-mode . origami-c-style-parser) + (perl-mode . origami-c-style-parser) + (cperl-mode . origami-c-style-parser) + (js-mode . origami-c-style-parser) + (js2-mode . origami-c-style-parser) + (js3-mode . origami-c-style-parser) + (go-mode . origami-c-style-parser) + (php-mode . origami-c-style-parser) + (python-mode . origami-python-parser) + (emacs-lisp-mode . origami-elisp-parser) + (lisp-interaction-mode . origami-elisp-parser) + (clojure-mode . origami-clj-parser) + (triple-braces . ,(origami-markers-parser "{{{" "}}}"))) + "alist mapping major-mode to parser function." + :type 'hook + :group 'origami) + +(provide 'origami-parsers) + +;;; origami-parsers.el ends here diff --git a/org/elpa/origami-20200331.1019/origami-pkg.el b/org/elpa/origami-20200331.1019/origami-pkg.el new file mode 100644 index 0000000..430657b --- /dev/null +++ b/org/elpa/origami-20200331.1019/origami-pkg.el @@ -0,0 +1,15 @@ +(define-package "origami" "20200331.1019" "Flexible text folding" + '((s "1.9.0") + (dash "2.5.0") + (emacs "24") + (cl-lib "0.5")) + :commit "e558710a975e8511b9386edc81cd6bdd0a5bda74" :authors + '(("Greg Sexton" . "gregsexton@gmail.com")) + :maintainer + '("Greg Sexton" . "gregsexton@gmail.com") + :keywords + '("folding") + :url "https://github.com/gregsexton/origami.el") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/org/elpa/origami-20200331.1019/origami.el b/org/elpa/origami-20200331.1019/origami.el new file mode 100644 index 0000000..b9667fd --- /dev/null +++ b/org/elpa/origami-20200331.1019/origami.el @@ -0,0 +1,828 @@ +;;; origami.el --- Flexible text folding -*- lexical-binding: t -*- + +;; Author: Greg Sexton +;; Version: 1.0 +;; Keywords: folding +;; URL: https://github.com/gregsexton/origami.el +;; Package-Requires: ((s "1.9.0") (dash "2.5.0") (emacs "24") (cl-lib "0.5")) + +;; The MIT License (MIT) + +;; Copyright (c) 2014 Greg Sexton + +;; Permission is hereby granted, free of charge, to any person obtaining a copy +;; of this software and associated documentation files (the "Software"), to deal +;; in the Software without restriction, including without limitation the rights +;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +;; copies of the Software, and to permit persons to whom the Software is +;; furnished to do so, subject to the following conditions: + +;; The above copyright notice and this permission notice shall be included in +;; all copies or substantial portions of the Software. + +;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +;; THE SOFTWARE. + +;;; Commentary: + +;;; Code: + +(require 'dash) +(require 's) +(require 'cl-lib) +(require 'origami-parsers) + +;;; fold display mode and faces + +(defgroup origami nil + "Flexible text folding" + :prefix "origami-" + :group 'convenience) + +(defcustom origami-fold-replacement "..." + ;; TODO: this should also be specifiable as a function: folded text -> string + "Show this string instead of the folded text." + :type 'string + :group 'origami) + +(defcustom origami-show-fold-header nil + "Highlight the line the fold start on." + :type 'boolean + :group 'origami) + +(defface origami-fold-header-face + `((t (:box (:line-width 1 :color ,(face-attribute 'highlight :background)) + :background ,(face-attribute 'highlight :background)))) + "Face used to display fold headers.") + +(defface origami-fold-fringe-face + '((t ())) + "Face used to display fringe contents.") + +(defface origami-fold-replacement-face + '((t :inherit 'font-lock-comment-face)) + "Face used to display the fold replacement text.") + +;;; overlay manipulation + +(defun origami-header-overlay-range (fold-overlay) + "Given a `fold-overlay', return the range that the corresponding +header overlay should cover. Result is a cons cell of (begin . end)." + (with-current-buffer (overlay-buffer fold-overlay) + (let ((fold-begin + (save-excursion + (goto-char (overlay-start fold-overlay)) + (line-beginning-position))) + (fold-end + ;; Find the end of the folded region -- include the following + ;; newline if possible. The header will span the entire fold. + (save-excursion + (goto-char (overlay-end fold-overlay)) + (when (looking-at ".") + (forward-char 1) + (when (looking-at "\n") + (forward-char 1))) + (point)))) + (cons fold-begin fold-end)))) + +(defun origami-header-overlay-reset-position (header-overlay) + (-when-let (fold-ov (overlay-get header-overlay 'fold-overlay)) + (let ((range (origami-header-overlay-range fold-ov))) + (move-overlay header-overlay (car range) (cdr range))))) + +(defun origami-header-modify-hook (header-overlay after-p b e &optional l) + (if after-p (origami-header-overlay-reset-position header-overlay))) + +(defun origami-create-overlay (beg end offset buffer) + (when (> (- end beg) 0) + (let ((ov (make-overlay (+ beg offset) end buffer))) + (overlay-put ov 'creator 'origami) + (overlay-put ov 'isearch-open-invisible 'origami-isearch-show) + (overlay-put ov 'isearch-open-invisible-temporary + (lambda (ov hide-p) (if hide-p (origami-hide-overlay ov) + (origami-show-overlay ov)))) + ;; We create a header overlay even when disabled; this could be avoided, + ;; especially if we called origami-reset for each buffer if customizations + ;; changed. + (let* ((range (origami-header-overlay-range ov)) + (header-ov (make-overlay (car range) (cdr range) buffer + nil))) ;; no front advance + (overlay-put header-ov 'creator 'origami) + (overlay-put header-ov 'fold-overlay ov) + (overlay-put header-ov 'modification-hooks '(origami-header-modify-hook)) + (overlay-put ov 'header-ov header-ov)) + ov))) + +(defun origami-hide-overlay (ov) + (overlay-put ov 'invisible 'origami) + (overlay-put ov 'display origami-fold-replacement) + (overlay-put ov 'face 'origami-fold-replacement-face) + (if origami-show-fold-header + (origami-activate-header (overlay-get ov 'header-ov)))) + +(defun origami-show-overlay (ov) + (overlay-put ov 'invisible nil) + (overlay-put ov 'display nil) + (overlay-put ov 'face nil) + (origami-deactivate-header (overlay-get ov 'header-ov))) + +(defun origami-hide-node-overlay (node) + (-when-let (ov (origami-fold-data node)) + (origami-hide-overlay ov))) + +(defun origami-show-node-overlay (node) + (-when-let (ov (origami-fold-data node)) + (origami-show-overlay ov))) + +(defun origami-activate-header (ov) + ;; Reposition the header overlay. Since it extends before the folded area, it + ;; may no longer cover the appropriate locations. + (origami-header-overlay-reset-position ov) + (overlay-put ov 'origami-header-active t) + (overlay-put ov 'face 'origami-fold-header-face) + (overlay-put ov 'before-string + (propertize + "…" + 'display + '(left-fringe empty-line origami-fold-fringe-face)))) + +(defun origami-deactivate-header (ov) + (overlay-put ov 'origami-header-active nil) + (overlay-put ov 'face nil) + (overlay-put ov 'before-string nil) + (overlay-put ov 'after-string nil)) + +(defun origami-isearch-show (ov) + (origami-show-node (current-buffer) (point))) + +(defun origami-hide-overlay-from-fold-tree-fn (node) + (origami-fold-postorder-each node 'origami-hide-node-overlay)) + +(defun origami-show-overlay-from-fold-tree-fn (node) + (origami-fold-postorder-each node 'origami-show-node-overlay)) + +(defun origami-change-overlay-from-fold-node-fn (old new) + (if (origami-fold-open? new) + (origami-show-node-overlay old) + (origami-hide-node-overlay new))) + +(defun origami-remove-all-overlays (buffer) + (with-current-buffer buffer + (remove-overlays (point-min) (point-max) 'creator 'origami))) + +;;; fold structure + +(defun origami-fold-node (beg end offset open &optional children data) + (let ((sorted-children (-sort (lambda (a b) + (or (< (origami-fold-beg a) (origami-fold-beg b)) + (and (= (origami-fold-beg a) (origami-fold-beg b)) + (< (origami-fold-end a) (origami-fold-end b))))) + (remove nil children)))) + ;; ensure invariant: no children overlap + (when (-some? (lambda (pair) + (let ((a (car pair)) + (b (cadr pair))) + (when b ;for the odd numbered case - there may be a single item + ;; the < function doesn't support varargs + (or (>= (origami-fold-beg a) (origami-fold-end a)) + (>= (origami-fold-end a) (origami-fold-beg b)) + (>= (origami-fold-beg b) (origami-fold-end b)))))) + (-partition-all-in-steps 2 1 sorted-children)) + (error "Tried to construct a node where the children overlap or are not distinct regions: %s" + sorted-children)) + ;; ensure invariant: parent encompases children + (let ((beg-children (origami-fold-beg (car sorted-children))) + (end-children (origami-fold-end (-last-item sorted-children)))) + (if (and beg-children (or (> beg beg-children) (< end end-children))) + (error "Node does not overlap children in range. beg=%s end=%s beg-children=%s end-children=%s" + beg end beg-children end-children) + (if (> (+ beg offset) end) + (error "Offset is not within the range of the node: beg=%s end=%s offset=%s" beg end offset) + (vector beg end offset open sorted-children data)))))) + +(defun origami-fold-root-node (&optional children) + "Create a root container node." + (origami-fold-node 1 most-positive-fixnum 0 t children 'root)) + +(defun origami-fold-is-root-node? (node) (eq (origami-fold-data node) 'root)) + +(defun origami-fold-beg (node) + (when node + (if (origami-fold-is-root-node? node) + (aref node 0) + (- (overlay-start (origami-fold-data node)) (origami-fold-offset node))))) + +(defun origami-fold-end (node) + (when node + (if (origami-fold-is-root-node? node) + (aref node 1) + (overlay-end (origami-fold-data node))))) + +(defun origami-fold-offset (node) (when node (aref node 2))) + +(defun origami-fold-open? (node) (when node (aref node 3))) + +(defun origami-fold-open-set (node value) + (when node + (if (origami-fold-is-root-node? node) + node + (origami-fold-node (origami-fold-beg node) + (origami-fold-end node) + (origami-fold-offset node) + value + (origami-fold-children node) + (origami-fold-data node))))) + +(defun origami-fold-children (node) (when node (aref node 4))) + +(defun origami-fold-children-set (node children) + (when node + (origami-fold-node (origami-fold-beg node) + (origami-fold-end node) + (origami-fold-offset node) + (origami-fold-open? node) + children + (origami-fold-data node)))) + +(defun origami-fold-data (node) (when node (aref node 5))) + +;;; fold structure utils + +(defun origami-fold-range-equal (a b) + (and (equal (origami-fold-beg a) (origami-fold-beg b)) + (equal (origami-fold-end a) (origami-fold-end b)))) + +(defun origami-fold-state-equal (a b) + (equal (origami-fold-open? a) (origami-fold-open? b))) + +(defun origami-fold-add-child (node new) + (origami-fold-children-set node + (cons new (origami-fold-children node)))) + +(defun origami-fold-replace-child (node old new) + (origami-fold-children-set node + (cons new (remove old (origami-fold-children node))))) + +(defun origami-fold-assoc (path f) + "Rewrite the tree, replacing the node referenced by PATH with +F applied to the leaf." + (cdr + (-reduce-r-from (lambda (node acc) + (destructuring-bind (old-node . new-node) acc + (cons node (origami-fold-replace-child node old-node new-node)))) + (let ((leaf (-last-item path))) (cons leaf (funcall f leaf))) + (butlast path)))) + +(defun origami-fold-diff (old new on-add on-remove on-change) + (cl-labels ((diff-children (old-children new-children) + (let ((old (car old-children)) + (new (car new-children))) + (cond ((null old) (-each new-children on-add)) + ((null new) (-each old-children on-remove)) + ((and (null old) (null new)) nil) + ((origami-fold-range-equal old new) + (origami-fold-diff old new on-add on-remove on-change) + (diff-children (cdr old-children) (cdr new-children))) + ((<= (origami-fold-beg old) (origami-fold-beg new)) + (funcall on-remove old) + (diff-children (cdr old-children) new-children)) + (t (funcall on-add new) + (diff-children old-children (cdr new-children))))))) + (unless (origami-fold-range-equal old new) + (error "Precondition invalid: old must have the same range as new.")) + (unless (origami-fold-state-equal old new) + (funcall on-change old new)) + (diff-children (origami-fold-children old) + (origami-fold-children new)))) + +(defun origami-fold-postorder-each (node f) + (-each (origami-fold-children node) f) + (funcall f node)) + +(defun origami-fold-map (f tree) + "Map F over the tree. Replacing each node with the result of (f +node). The children cannot be manipulated using f as the map will +replace them. This cannot change the structure of the tree, just +the state of each node." + (origami-fold-children-set + (funcall f tree) + (-map (lambda (node) (origami-fold-map f node)) + (origami-fold-children tree)))) + +(defun origami-fold-path-map (f path) + "Map F over the nodes in path. As with `origami-fold-map', +children cannot be manipulated." + (cond ((null path) nil) + ((cdr path) (funcall f (origami-fold-replace-child (car path) + (cadr path) + (origami-fold-path-map f (cdr path))))) + (t (funcall f (car path))))) + +(defun origami-fold-find-deepest (tree pred) + (when tree + (when (funcall pred tree) + (-if-let (child (-first pred (origami-fold-children tree))) + (cons tree (origami-fold-find-deepest child pred)) + (list tree))))) + +(defun origami-fold-find-path-containing-range (tree beg end) + (origami-fold-find-deepest tree + (lambda (node) + (and (>= beg (origami-fold-beg node)) + (<= end (origami-fold-end node)))))) + +(defun origami-fold-find-path-with-range (tree beg end) + "Return the path to the most specific (deepest) node that has +exactly the range BEG-END, or null." + (-when-let (path (origami-fold-find-path-containing-range tree beg end)) + (let ((last (-last-item path))) + (when (and (= beg (origami-fold-beg last)) + (= end (origami-fold-end last))) + path)))) + +(defun origami-fold-find-path-containing (tree point) + "Return the path to the most specific (deepest) node that +contains point, or null." + (origami-fold-find-deepest tree + (lambda (node) + (and (<= (origami-fold-beg node) point) + (>= (origami-fold-end node) point))))) + +(defun origami-fold-preorder-reduce (tree f initial-state) + "Reduce the tree by doing a preorder traversal. F is applied +with the current state and the current node at each iteration." + (-reduce-from (lambda (state node) (origami-fold-preorder-reduce node f state)) + (funcall f initial-state tree) + (origami-fold-children tree))) + +(defun origami-fold-postorder-reduce (tree f initial-state) + "Reduce the tree by doing a postorder traversal. F is applied +with the current state and the current node at each iteration." + (funcall f (-reduce-from (lambda (state node) (origami-fold-postorder-reduce node f state)) + initial-state + (origami-fold-children tree)) + tree)) + +(defun origami-fold-node-recursively-closed? (node) + (origami-fold-postorder-reduce node (lambda (acc node) + (and acc (not (origami-fold-open? node)))) t)) + +(defun origami-fold-node-recursively-open? (node) + (origami-fold-postorder-reduce node (lambda (acc node) + (and acc (origami-fold-open? node))) t)) + +(defun origami-fold-shallow-merge (tree1 tree2) + "Shallow merge the children of TREE2 in to TREE1." + (-reduce-from (lambda (tree node) + (origami-fold-assoc (origami-fold-find-path-containing-range tree + (origami-fold-beg node) + (origami-fold-end node)) + (lambda (leaf) + (origami-fold-add-child leaf node)))) + tree1 (origami-fold-children tree2))) + +(defun origami-fold-parent (path) + (-last-item (-butlast path))) + +(defun origami-fold-prev-sibling (siblings node) + (->> siblings + (-partition-in-steps 2 1) + (-drop-while (lambda (pair) (not (equal (cadr pair) node)))) + caar)) + +(defun origami-fold-next-sibling (siblings node) + (->> siblings + (-drop-while (lambda (n) (not (equal n node)))) + cadr)) + +;;; linear history structure + +(defun origami-h-new (present) + "Create a new history structure." + (vector nil present nil)) + +(defun origami-h-push (h new) + "Create a new history structure with new as the present value." + (when new + (let ((past (aref h 0)) + (present (aref h 1))) + (vector (cons present (-take 19 past)) new nil)))) + +(defun origami-h-undo (h) + (let ((past (aref h 0)) + (present (aref h 1)) + (future (aref h 2))) + (if (null past) h + (vector (cdr past) (car past) (cons present future))))) + +(defun origami-h-redo (h) + (let ((past (aref h 0)) + (present (aref h 1)) + (future (aref h 2))) + (if (null future) h + (vector (cons present past) (car future) (cdr future))))) + +(defun origami-h-present (h) + (when h (aref h 1))) + +;;; interactive utils + +(defun origami-setup-local-vars (buffer) + (with-current-buffer buffer + (set (make-local-variable 'origami-history) + (origami-h-new (origami-fold-root-node))) + (set (make-local-variable 'origami-tree-tick) 0))) + +(defun origami-get-cached-tree (buffer) + (or (local-variable-p 'origami-history buffer) + (error "Necessary local variables were not available")) + (origami-h-present (buffer-local-value 'origami-history buffer))) + +(defun origami-store-cached-tree (buffer tree) + (or (and (local-variable-p 'origami-history buffer) + (local-variable-p 'origami-tree-tick buffer)) + (error "Necessary local variables were not available")) + (with-current-buffer buffer + (setq origami-tree-tick (buffer-modified-tick)) + (setq origami-history (origami-h-push origami-history tree))) + tree) + +(defun origami-update-history (buffer f) + (or (local-variable-p 'origami-history buffer) + (error "Necessary local variables were not available")) + (with-current-buffer buffer + (setq origami-history (funcall f origami-history)))) + +(defun origami-rebuild-tree? (buffer) + "Determines if the tree needs to be rebuilt for BUFFER since it +was last built." + (not (= (buffer-local-value 'origami-tree-tick buffer) + (buffer-modified-tick buffer)))) + +(defun origami-build-tree (buffer parser) + (when parser + (with-current-buffer buffer + (let ((contents (buffer-string))) + (-> parser + (funcall contents) + origami-fold-root-node))))) + +(defun origami-get-parser (buffer) + (let* ((cached-tree (origami-get-cached-tree buffer)) + (create (lambda (beg end offset children) + (let ((previous-fold (-last-item (origami-fold-find-path-with-range cached-tree beg end)))) + (origami-fold-node beg end offset + (if previous-fold (origami-fold-open? previous-fold) t) + children + (or (-> (origami-fold-find-path-with-range + (origami-get-cached-tree buffer) beg end) + -last-item + origami-fold-data) + (origami-create-overlay beg end offset buffer))))))) + (-when-let (parser-gen (or (cdr (assoc (if (local-variable-p 'origami-fold-style) + (buffer-local-value 'origami-fold-style buffer) + (buffer-local-value 'major-mode buffer)) + origami-parser-alist)) + 'origami-indent-parser)) + (funcall parser-gen create)))) + +(defun origami-get-fold-tree (buffer) + "Facade. Build the tree if it hasn't already been built +otherwise fetch cached tree." + (when origami-mode + (if (origami-rebuild-tree? buffer) + (origami-build-tree buffer (origami-get-parser buffer)) + (origami-get-cached-tree buffer)))) + +(defun origami-apply-new-tree (buffer old-tree new-tree) + (when new-tree + (origami-fold-diff old-tree new-tree + 'origami-hide-overlay-from-fold-tree-fn + 'origami-show-overlay-from-fold-tree-fn + 'origami-change-overlay-from-fold-node-fn))) + +(defun origami-search-forward-for-path (buffer point) + (let (end) + (with-current-buffer buffer + (save-excursion + (goto-char point) + (setq end (line-end-position)))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (let ((forward-node (-first (lambda (node) + (and (>= (origami-fold-beg node) point) + (<= (origami-fold-beg node) end))) + (origami-fold-children (-last-item path))))) + (if forward-node (append path (list forward-node)) path)))))) + +;;; commands + +(defun origami-open-node (buffer point) + "Open the fold node at POINT in BUFFER. The fold node opened +will be the deepest nested at POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc path (lambda (node) + (origami-fold-open-set node t)))))))) + +(defun origami-open-node-recursively (buffer point) + "Open the fold node and all of its children at POINT in BUFFER. +The fold node opened will be the deepest nested at POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree + buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc path + (lambda (node) + (origami-fold-map (lambda (node) + (origami-fold-open-set node t)) + node)))))))) + +(defun origami-show-node (buffer point) + "Like `origami-open-node' but also opens parent fold nodes +recursively so as to ensure the position where POINT is is +visible." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-path-map + (lambda (node) + (origami-fold-open-set node t)) + path)))))) + +(defun origami-close-node (buffer point) + "Close the fold node at POINT in BUFFER. The fold node closed +will be the deepest nested at POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc + path (lambda (node) + (origami-fold-open-set node nil)))))))) + +(defun origami-close-node-recursively (buffer point) + "Close the fold node and all of its children at POINT in BUFFER. +The fold node closed will be the deepest nested at POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree + buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc path + (lambda (node) + (origami-fold-map (lambda (node) + (origami-fold-open-set node nil)) + node)))))))) + +(defun origami-toggle-node (buffer point) + "Toggle the fold node at POINT in BUFFER open or closed. The +fold node opened or closed will be the deepest nested at POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc + path (lambda (node) + (origami-fold-open-set + node (not (origami-fold-open? + (-last-item path))))))))))) + +(defun origami-forward-toggle-node (buffer point) + "Like `origami-toggle-node' but search forward in BUFFER for a +fold node. If a fold node is found after POINT and before the +next line break, this will be toggled. Otherwise, behave exactly +as `origami-toggle-node'." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-search-forward-for-path buffer point)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-assoc + path (lambda (node) + (origami-fold-open-set + node (not (origami-fold-open? + (-last-item path))))))))))) + +(defun origami-recursively-toggle-node (buffer point) + "Cycle a fold node between recursively closed, open and +recursively open depending on its current state. The fold node +acted upon is searched for forward in BUFFER from POINT. If a +fold node is found after POINT and before the next line break, +this will be toggled otherwise the fold node nested deepest at +POINT will be acted upon. + +This command will only work if bound to a key. For those familiar +with org-mode heading opening and collapsing, this will feel +familiar. It's easiest to grasp this just by giving it a go." + (interactive (list (current-buffer) (point))) + (-when-let (path (origami-search-forward-for-path buffer point)) + (let ((node (-last-item path))) + (if (eq last-command 'origami-recursively-toggle-node) + (cond ((origami-fold-node-recursively-open? node) + (origami-close-node-recursively buffer (origami-fold-beg node))) + ((origami-fold-node-recursively-closed? node) + (origami-toggle-node buffer (origami-fold-beg node))) + (t (origami-open-node-recursively buffer (origami-fold-beg node)))) + (origami-forward-toggle-node buffer point))))) + +(defun origami-open-all-nodes (buffer) + "Recursively open every fold node in BUFFER." + (interactive (list (current-buffer))) + (-when-let (tree (origami-get-fold-tree buffer)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-map + (lambda (node) + (origami-fold-open-set node t)) + tree))))) + +(defun origami-close-all-nodes (buffer) + "Recursively close every fold node in BUFFER." + (interactive (list (current-buffer))) + (-when-let (tree (origami-get-fold-tree buffer)) + (origami-apply-new-tree buffer tree (origami-store-cached-tree + buffer + (origami-fold-map + (lambda (node) + (origami-fold-open-set node nil)) + tree))))) + +(defun origami-toggle-all-nodes (buffer) + "Toggle all fold nodes in the buffer recursively open or +recursively closed." + (interactive (list (current-buffer))) + (-when-let (tree (origami-get-fold-tree buffer)) + ;; use the first child as root is always open + (if (-> tree origami-fold-children car origami-fold-open?) + (origami-close-all-nodes buffer) + (origami-open-all-nodes buffer)))) + +(defun origami-show-only-node (buffer point) + "Close all fold nodes in BUFFER except for those necessary to +make POINT visible. Very useful for quickly collapsing everything +in the buffer other than what you are looking at." + (interactive (list (current-buffer) (point))) + (origami-close-all-nodes buffer) + (origami-show-node buffer point)) + +(defun origami-previous-fold (buffer point) + "Move point to the beginning of the fold before POINT. If POINT +is in a fold, move to the beginning of the fold that POINT is +in." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (push-mark) + (-> tree + (origami-fold-preorder-reduce (lambda (state n) + (cons (origami-fold-beg n) state)) nil) + (->> (-reduce (lambda (state pos) + (if (< state point) state pos)))) + goto-char))) + +(defun origami-next-fold (buffer point) + "Move point to the end of the fold after POINT. If POINT is in +a fold, move to the end of the fold that POINT is in." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (push-mark) + (-> tree + (origami-fold-postorder-reduce (lambda (state n) + (cons (origami-fold-end n) state)) nil) + (->> (-last (lambda (pos) (> pos point)))) + goto-char))) + +(defun origami-forward-fold (buffer point) + "Move point to the beginning of the first fold in the BUFFER +after POINT." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (push-mark) + (-> tree + (origami-fold-preorder-reduce (lambda (state n) + (cons (origami-fold-beg n) state)) nil) + (->> (-last (lambda (pos) (> pos point)))) + goto-char))) + +(defun origami-forward-fold-same-level (buffer point) + "Move point to the beginning of the next fold in the buffer +that is a sibling of the fold the point is currently in." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (push-mark) + (-when-let (c (-> (origami-fold-next-sibling (origami-fold-children + (origami-fold-parent path)) + (-last-item path)) + origami-fold-beg)) + (goto-char c))))) + +(defun origami-backward-fold-same-level (buffer point) + "Move point to the beginning of the previous fold in the buffer +that is a sibling of the fold the point is currently in." + (interactive (list (current-buffer) (point))) + (-when-let (tree (origami-get-fold-tree buffer)) + (-when-let (path (origami-fold-find-path-containing tree point)) + (push-mark) + (-when-let (c (-> (origami-fold-prev-sibling (origami-fold-children + (origami-fold-parent path)) + (-last-item path)) + origami-fold-beg)) + (goto-char c))))) + +(defun origami-undo (buffer) + "Undo the last folding operation applied to BUFFER. Undo +history is linear. If you undo some fold operations and then +perform a new fold operation you will lose the history of +operations undone." + (interactive (list (current-buffer))) + (let ((current-tree (origami-get-cached-tree buffer))) + (origami-update-history buffer (lambda (h) (origami-h-undo h))) + (let ((old-tree (origami-get-cached-tree buffer))) + (origami-apply-new-tree buffer current-tree old-tree)))) + +(defun origami-redo (buffer) + "Redo the last folding operation applied to BUFFER. You can +only redo undone operations while a new folding operation hasn't +been performed to BUFFER." + (interactive (list (current-buffer))) + (let ((current-tree (origami-get-cached-tree buffer))) + (origami-update-history buffer (lambda (h) (origami-h-redo h))) + (let ((new-tree (origami-get-cached-tree buffer))) + (origami-apply-new-tree buffer current-tree new-tree)))) + +(defun origami-reset (buffer) + "Remove all folds from BUFFER and reset all origami state +associated with this buffer. Useful during development or if you +uncover any bugs." + (interactive (list (current-buffer))) + (origami-setup-local-vars buffer) + (origami-remove-all-overlays buffer)) + +;;; minor mode + +(defvar origami-mode-map + (let ((map (make-sparse-keymap))) + map) + "Keymap for `origami-mode'.") + +(defcustom origami-mode-hook nil + "Hook called when origami minor mode is activated or deactivated." + :type 'hook + :group 'origami) + +(defun origami-find-occurrence-show-node () + (call-interactively 'origami-show-node)) + +;;;###autoload +(define-minor-mode origami-mode + "Minor mode to selectively hide/show text in the current buffer. +With a prefix argument ARG, enable the mode if ARG is positive, +and disable it otherwise. If called from Lisp, enable the mode +if ARG is omitted or nil. + +Lastly, the normal hook `origami-mode-hook' is run using +`run-hooks'. + +Key bindings: +\\{origami-mode-map}" + :group 'origami + :lighter nil + :keymap origami-mode-map + :init-value nil + (if origami-mode + (progn + (add-hook 'occur-mode-find-occurrence-hook + 'origami-find-occurrence-show-node nil t) + (setq next-error-move-function (lambda (ignored pos) + (goto-char pos) + (call-interactively 'origami-show-node))) + (add-hook 'clone-indirect-buffer-hook + (lambda () (origami-reset (current-buffer))))) + (remove-hook 'occur-mode-find-occurrence-hook + 'origami-find-occurrence-show-node t) + (setq next-error-move-function nil)) + (origami-reset (current-buffer))) + +;;;###autoload +(define-global-minor-mode global-origami-mode origami-mode + (lambda () (origami-mode 1))) + +(provide 'origami) + +;;; origami.el ends here