From 03538e2ec6aec62fe94bfb79fa089a3b1b4d858b Mon Sep 17 00:00:00 2001 From: KemoNine Date: Sat, 8 Apr 2023 09:23:13 -0400 Subject: [PATCH] re-install persp-mode for buffer list saving and possible session restore --- code/elpa/archives/melpa/archive-contents | 74 +- org/elpa/archives/melpa/archive-contents | 74 +- .../persp-mode-autoloads.el | 69 + .../persp-mode-pkg.el | 2 + .../persp-mode-20230110.1045/persp-mode.el | 4175 +++++++++++++++++ 5 files changed, 4320 insertions(+), 74 deletions(-) create mode 100644 org/elpa/persp-mode-20230110.1045/persp-mode-autoloads.el create mode 100644 org/elpa/persp-mode-20230110.1045/persp-mode-pkg.el create mode 100644 org/elpa/persp-mode-20230110.1045/persp-mode.el diff --git a/code/elpa/archives/melpa/archive-contents b/code/elpa/archives/melpa/archive-contents index b42afe9..af7c952 100644 --- a/code/elpa/archives/melpa/archive-contents +++ b/code/elpa/archives/melpa/archive-contents @@ -113,7 +113,7 @@ (ample-regexps . [(20200508 1021) nil "ample regular expressions for Emacs" tar ((:commit . "153969ce547afe410b8986f01c9ed4087c9cd20b") (:authors ("immerrr" . "immerrr@gmail.com")) (:maintainer "immerrr" . "immerrr@gmail.com") (:keywords "regexps" "extensions" "tools"))]) (ample-theme . [(20180207 1745) nil "Calm Dark Theme for Emacs" tar ((:commit . "366698400c555211c2082962a5d74f3dd79a78c8") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com") (:keywords "theme" "dark") (:url . "https://github.com/jordonbiondo/ample-theme"))]) (ample-zen-theme . [(20150119 2154) nil "AmpleZen Theme for Emacs 24" single ((:commit . "b277bb7abd4b6624e8d59f02474b79af50a007bd") (:authors ("Michael Wall")) (:maintainer "Michael Wall") (:keywords "theme" "dark" "emacs 24") (:url . "https://github.com/mjwall/ample-zen"))]) - (amread-mode . [(20230406 1202) ((emacs (24 3)) (cl-lib (0 6 1)) (pyim (5 2 8))) "A minor mode helper user speed-reading" single ((:commit . "f5b46f83ce205b1f6c1cf54e99da3e46ad17dfad") (:keywords "wp") (:url . "https://repo.or.cz/amread-mode.git"))]) + (amread-mode . [(20230408 334) ((emacs (24 3)) (cl-lib (0 6 1)) (pyim (5 2 8))) "A minor mode helper user speed-reading" single ((:commit . "65da842cae9878b0ed7ca518302df0dd4beaae49") (:keywords "wp") (:url . "https://repo.or.cz/amread-mode.git"))]) (amsreftex . [(20220115 1838) ((emacs (25 1))) "Add amsrefs bibliography support for reftex" single ((:commit . "facf47b82572e3f62bd8d9b8d4f4d5258f6c8a38") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com") (:keywords "tex") (:url . "https://github.com/franburstall/amsreftex"))]) (amx . [(20210305 118) ((emacs (24 4)) (s (0))) "Alternative M-x with extra features." single ((:commit . "37f9c7ae55eb0331b27200fb745206fc58ceffc0") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org") ("Cornelius Mika" . "cornelius.mika@gmail.com")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "convenience" "usability" "completion") (:url . "http://github.com/DarwinAwardWinner/amx/"))]) (anaconda-mode . [(20230306 2112) ((emacs (25 1)) (pythonic (0 1 0)) (dash (2 6 0)) (s (1 9)) (f (0 16 2))) "Code navigation, documentation lookup and completion for Python" tar ((:commit . "e250596f5587129f55f446ef127d0dac5e9730a3") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/anaconda-mode"))]) @@ -576,7 +576,7 @@ (clojure-quick-repls . [(20150814 736) ((cider (0 8 1)) (dash (2 9 0))) "Quickly create Clojure and ClojureScript repls for a project." single ((:commit . "8fe4e44939e8a01a4cdf60c0001d9a6abf8a73c3") (:keywords "languages" "clojure" "cider" "clojurescript") (:url . "https://github.com/symfrog/clojure-quick-repls"))]) (clojure-snippets . [(20220914 950) ((yasnippet (0 10 0))) "Yasnippets for clojure" tar ((:commit . "66d23f0ffedf2cc2be0387c3504b5f89d7300cfa") (:authors ("Max Penet" . "m@qbits.cc")) (:maintainer "Max Penet" . "m@qbits.cc") (:keywords "snippets"))]) (clomacs . [(20220415 1035) ((emacs (24 3)) (cider (0 22 1)) (s (1 12 0)) (simple-httpd (1 4 6)) (dash (2 19 1))) "Simplifies Emacs Lisp interaction with Clojure." single ((:commit . "9cd7c9fd86bc7bc627a31275d1ef131378b90a49") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "clojure" "interaction") (:url . "https://github.com/clojure-emacs/clomacs"))]) - (closql . [(20230224 1619) ((emacs (25 1)) (compat (29 1 3 4)) (emacsql (20230220))) "Store EIEIO objects using EmacSQL" single ((:commit . "0a7226331ff1f96142199915c0ac7940bac4afdd") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "extensions") (:url . "https://github.com/emacscollective/closql"))]) + (closql . [(20230407 2158) ((emacs (25 1)) (compat (29 1 3 4)) (emacsql (20230220))) "Store EIEIO objects using EmacSQL" single ((:commit . "c3b34a6ec438d2e73309eed7bda26768b9a50335") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "extensions") (:url . "https://github.com/emacscollective/closql"))]) (closure-lint-mode . [(20101118 2124) nil "minor mode for the Closure Linter" single ((:commit . "bc3d2fd5c35580bf1b8af43b12484c95a343b4b5") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com") (:keywords "tools" "closure" "javascript" "lint" "flymake") (:url . "https://github.com/r0man/closure-lint-mode"))]) (cloud-theme . [(20220205 1336) ((emacs (24))) "A light colored theme" single ((:commit . "16ef7fbf0a423b29e3c3a0a2d9525afaf265aaed") (:authors ("Valerii Lysenko" . "vallyscode@gmail.com")) (:maintainer "Valerii Lysenko" . "vallyscode@gmail.com") (:keywords "color" "theme") (:url . "https://github.com/vallyscode/cloud-theme"))]) (cloud-to-butt-erc . [(20130627 2308) nil "Replace 'the cloud' with 'my butt'" single ((:commit . "6710c03d1bc91736435cbfe845924940cae34e5c") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/cloud-to-butt-erc"))]) @@ -931,7 +931,7 @@ (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 . [(20230201 134) ((emacs (27 1))) "Display diff's using alternative diffing tools" single ((:commit . "84446e315a163cecb7259858c9b01d2e6726775e") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-diff-ansi"))]) (diff-at-point . [(20230320 2355) ((emacs (26 2))) "Diff navigation" single ((:commit . "0a4815a364b636eadf2f9ca6f468fb5996ff8d6f") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-diff-at-point"))]) - (diff-hl . [(20230218 2323) ((cl-lib (0 2)) (emacs (25 1))) "Highlight uncommitted changes using VC" tar ((:commit . "d20f16bf5eadd66e775f215e800f25caddae8cb5") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "vc" "diff") (:url . "https://github.com/dgutov/diff-hl"))]) + (diff-hl . [(20230408 35) ((cl-lib (0 2)) (emacs (25 1))) "Highlight uncommitted changes using VC" tar ((:commit . "170320efda0db99dc234b7759cf41539f6b6d9a8") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "vc" "diff") (:url . "https://github.com/dgutov/diff-hl"))]) (diffed . [(20230208 1546) ((emacs (27 1))) "Diffed is for recursive diff like Dired is for ls" single ((:commit . "f7dc37f13a4f1660212c41a6e9faba61eb8cc078") (:authors ("Bernhard Rotter" . "bernhard@b-rotter.de")) (:maintainer "Bernhard Rotter" . "bernhard@b-rotter.de") (:keywords "tools") (:url . "https://github.com/ber-ro/diffed"))]) (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"))]) (diffpdf . [(20210626 1447) ((emacs (25 1)) (transient (0 3 0))) "Transient diffpdf" single ((:commit . "a5b203b549e373cb9b0ef3f00c0010bd34dd644a") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/diffpdf.el"))]) @@ -1087,7 +1087,7 @@ (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"))]) (dw . [(20210331 2311) ((emacs (25 1))) "Diceware passphrase generation commands" single ((:commit . "61c5718ba64ace4c9e29de18aa2690ecc3f0f258") (:authors ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net") (:keywords "convenience" "games") (:url . "https://github.com/integral-dw/dw-passphrase-generator"))]) - (dwim-shell-command . [(20230407 1000) ((emacs (28 1))) "Shell commands with DWIM behaviour" tar ((:commit . "a4386911668eaccf726a3024d989863be49b62c4") (:authors ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/dwim-shell-command"))]) + (dwim-shell-command . [(20230407 2002) ((emacs (28 1))) "Shell commands with DWIM behaviour" tar ((:commit . "2222c483660ac04c77b51a0bd5e7871259aa526c") (:authors ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/dwim-shell-command"))]) (dyalog-mode . [(20230214 1027) ((cl-lib (0 2)) (emacs (24 3))) "Major mode for editing Dyalog APL source code" tar ((:commit . "13c0d391aa878a1609259a89fe3e6db8d21935e8") (:authors ("Joakim Hårsman" . "joakim.harsman@gmail.com")) (:maintainer "Joakim Hårsman" . "joakim.harsman@gmail.com") (:keywords "languages") (:url . "https://github.com/harsman/dyalog-mode.git"))]) (dylan . [(20220115 1804) ((emacs (25 1))) "Dylan editing modes" tar ((:commit . "9d2891e3e06405b75072d296f385fa795aeb9835") (:url . "https://opendylan.org/"))]) (dynamic-fonts . [(20140731 1226) ((font-utils (0 7 0)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Set faces based on available fonts" single ((:commit . "004ee6014dc7dbff8f14d26015c91d9229f6eac0") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "faces" "frames") (:url . "http://github.com/rolandwalker/dynamic-fonts"))]) @@ -1319,7 +1319,7 @@ (epc . [(20140610 534) ((concurrent (0 3 1)) (ctable (0 1 2))) "A RPC stack for the Emacs Lisp" tar ((:commit . "94cd36a3bec752263ac9b1b3a9dd2def329d2af7") (:authors ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "lisp" "rpc") (:url . "https://github.com/kiwanami/emacs-epc"))]) (epic . [(20170210 23) ((htmlize (1 47))) "Evernote Picker for Cocoa Emacs" single ((:commit . "a41826c330eb0ea061d58a08cc861b0c4ac8ec4e") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "evernote" "applescript") (:url . "https://github.com/yoshinari-nomura/epic"))]) (eping . [(20201027 2149) ((emacs (25 1))) "Ping websites to check internet connectivity" tar ((:commit . "004496ee06c0b8ead4a4f49e17109e8eb32eb49d") (:authors ("Sean Hutchings" . "seanhut@yandex.com")) (:maintainer "Sean Hutchings" . "seanhut@yandex.com") (:keywords "comm" "processes" "terminals" "unix") (:url . "https://github.com/sean-hut/eping"))]) - (epkg . [(20230312 1644) ((emacs (25 1)) (compat (29 1 3 4)) (closql (20230220)) (emacsql (20230220)) (llama (0 2 0))) "Browse the Emacsmirror package database" tar ((:commit . "e2021f6cff73902bec79b19c492ea2c5930cdc50") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg"))]) + (epkg . [(20230407 2200) ((emacs (25 1)) (compat (29 1 3 4)) (closql (20230220)) (emacsql (20230220)) (llama (0 2 0))) "Browse the Emacsmirror package database" tar ((:commit . "c1117eb93f65c15c81cb4822c5eec9a12fe268ed") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg"))]) (epkg-marginalia . [(20230212 2018) ((emacs (27 1)) (compat (29 1 3 4)) (epkg (3 3 1)) (llama (0 2 0)) (marginalia (0 12))) "Show Epkg information in completion annotations" single ((:commit . "4f3a66946b1be11c40d1635b60ea21941c882e8f") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg-marginalia"))]) (epl . [(20180205 2049) ((cl-lib (0 3))) "Emacs Package Library" single ((:commit . "78ab7a85c08222cd15582a298a364774e3282ce6") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "convenience") (:url . "http://github.com/cask/epl"))]) (epm . [(20190509 443) ((emacs (24 3)) (epl (0 8))) "Emacs Package Manager" tar ((:commit . "6375ddbf93c5f25647f6ebb25b54045b3c93a5be") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:url . "https://github.com/xuchunyang/epm"))]) @@ -1375,7 +1375,7 @@ (eshell-info-banner . [(20220728 1006) ((emacs (25 1)) (s (1))) "System information as your Eshell banner" single ((:commit . "987e69a66276ca057798896c606e5c5d5fb9ee5c") (:authors ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainer "Lucien Cartier-Tilet" . "lucien@phundrak.com") (:url . "https://github.com/Phundrak/eshell-info-banner.el"))]) (eshell-outline . [(20201121 620) ((emacs (25 1))) "Enhanced outline-mode for Eshell" single ((:commit . "6f917afa5b3d36764d76d7864589094647d8c3b4") (:authors ("Jamie Beardslee" . "jdb@jamzattack.xyz")) (:maintainer "Jamie Beardslee" . "jdb@jamzattack.xyz") (:keywords "unix" "eshell" "outline" "convenience") (:url . "https://git.jamzattack.xyz/eshell-outline"))]) (eshell-prompt-extras . [(20210925 110) ((emacs (25))) "Display extra information for your eshell prompt." single ((:commit . "c2078093323206b91a1b1f5786d79faa00b76be7") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "eshell" "prompt") (:url . "https://github.com/zwild/eshell-prompt-extras"))]) - (eshell-syntax-highlighting . [(20230402 2034) ((emacs (25 1))) "Highlight eshell commands" single ((:commit . "0ac5259d497a9794e147d2b9dc23edf5bc844e3c") (:authors ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainer "Alex Kreisher" . "akreisher18@gmail.com") (:keywords "convenience") (:url . "https://github.com/akreisher/eshell-syntax-highlighting"))]) + (eshell-syntax-highlighting . [(20230408 805) ((emacs (25 1))) "Highlight eshell commands" single ((:commit . "4b09435b8226da5d8221b0bd760e6bbdae00426f") (:authors ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainer "Alex Kreisher" . "akreisher18@gmail.com") (:keywords "convenience") (:url . "https://github.com/akreisher/eshell-syntax-highlighting"))]) (eshell-toggle . [(20220718 729) ((emacs (25 1)) (dash (2 11 0))) "Show/hide eshell under active window." single ((:commit . "d4e884624f02e68b267b0044322ad17baa6780f8") (:authors ("Dmitry Cherkassov" . "dcherkassov@gmail.com")) (:maintainer "Dmitry Cherkassov" . "dcherkassov@gmail.com") (:keywords "processes") (:url . "https://github.com/4da/eshell-toggle"))]) (eshell-up . [(20170425 1737) ((emacs (24))) "Quickly go to a specific parent directory in eshell" single ((:commit . "b00e447ad7941ab31bcbb6bc0205fd492e887e7d") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "eshell") (:url . "https://github.com/peterwvj/eshell-up"))]) (eshell-vterm . [(20221229 1328) ((emacs (27 1)) (vterm (0 0 1))) "Vterm for visual commands in eshell" single ((:commit . "e96c30ad5e7d63b778fc3232e81b090b63b13277") (:authors ("Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com")) (:maintainer "Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com") (:keywords "eshell" "vterm" "terminals" "shell" "visual" "tools" "processes") (:url . "https://github.com/iostapyshyn/eshell-vterm"))]) @@ -1487,7 +1487,7 @@ (evil-textobj-syntax . [(20181210 1213) ((names (0 5)) (emacs (24)) (evil (0))) "Provides syntax text objects." single ((:commit . "2d9ba8c75c754b409aea7469f46a5cfa52a872f3") (:keywords "evil" "syntax" "highlight" "text-object") (:url . "https://github.com/laishulu/evil-textobj-syntax"))]) (evil-textobj-tree-sitter . [(20230311 1441) ((emacs (25 1)) (tree-sitter (0 15 0))) "Provides evil textobjects using tree-sitter" tar ((:commit . "11bbbab2412aec2bca16381ff639385644ca4b98") (:keywords "evil" "tree-sitter" "text-object" "convenience") (:url . "https://github.com/meain/evil-textobj-tree-sitter"))]) (evil-traces . [(20191214 558) ((emacs (25 1)) (evil (1 2 13))) "Visual hints for `evil-ex'" single ((:commit . "05e201cd63b549e3c88b5c3fc9b264bd6fe5a42c") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:keywords "emulations" "evil" "visual") (:url . "https://github.com/mamapanda/evil-traces"))]) - (evil-tree-edit . [(20220425 2355) ((emacs (27 1)) (tree-edit (0 1 0)) (tree-sitter (0 15 0)) (evil (1 0 0)) (avy (0 5 0)) (s (0 0 0))) "Evil structural editing for any language!" tar ((:commit . "eafee31ca4f532a9dbee326d3ec3bdd1e997223b") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) + (evil-tree-edit . [(20230407 2105) ((emacs (27 1)) (tree-edit (0 1 0)) (tree-sitter (0 15 0)) (evil (1 0 0)) (avy (0 5 0)) (s (0 0 0))) "Evil structural editing for any language!" single ((:commit . "86aef84896d67bcc61923663f799ab8dba05d108") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) (evil-tutor . [(20150103 653) ((evil (1 0 9))) "Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:commit . "909273bac88b98a565f1b89bbb13d523b7edce2b") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil") (:url . "https://github.com/syl20bnr/evil-tutor"))]) (evil-tutor-ja . [(20160917 132) ((evil (1 0 9)) (evil-tutor (0 1))) "Japanese Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:commit . "06b9ad853a15ce6f2c53c2cf379b9ff358369f2d") (:authors ("Kenji Miyazaki" . "kenjizmyzk@gmail.com")) (:maintainer "Kenji Miyazaki" . "kenjizmyzk@gmail.com") (:keywords "convenience" "editing" "evil" "japanese") (:url . "https://github.com/kenjimyzk/evil-tutor-ja"))]) (evil-vimish-fold . [(20200122 117) ((emacs (24 4)) (evil (1 0 0)) (vimish-fold (0 2 0))) "Integrate vimish-fold with evil" single ((:commit . "b6e0e6b91b8cd047e80debef1a536d9d49eef31a") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/evil-vimish-fold"))]) @@ -1562,7 +1562,7 @@ (feebleline . [(20190822 1401) nil "Replace modeline with a slimmer proxy" single ((:commit . "b2f2db25cac77817bf0c49ea2cea6383556faea0") (:authors ("Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com")) (:maintainer "Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com") (:url . "https://github.com/tautologyclub/feebleline"))]) (feed-discovery . [(20200714 1118) ((emacs (25 1)) (dash (2 16 0))) "Discover feed url by RSS/Atom autodiscovery" single ((:commit . "3812439c845c184eaf164d3ac8935de135259855") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/feed-discovery"))]) (feline . [(20230315 1821) ((emacs (28 1))) "A modeline with very little" single ((:commit . "3f9247f48058285d3e03957680e011ecf58d6feb") (:authors ("chee" . "emacs@chee.party")) (:maintainer "chee" . "emacs@chee.party") (:url . "https://opensource.chee.party/chee/feline-mode"))]) - (fennel-mode . [(20230215 1641) ((emacs (26 1))) "A major-mode for editing Fennel code" tar ((:commit . "52da9715b0d046597cb322d3a98cb27ae6e5719e") (:authors ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "languages" "tools") (:url . "https://git.sr.ht/~technomancy/fennel-mode"))]) + (fennel-mode . [(20230408 619) ((emacs (26 1))) "A major-mode for editing Fennel code" tar ((:commit . "dd2d0845cd8f21f6487c4e8ca5ea104d1fcba11a") (:authors ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "languages" "tools") (:url . "https://git.sr.ht/~technomancy/fennel-mode"))]) (fetch . [(20131201 730) nil "Fetch and unpack resources" single ((:commit . "3f2793afcbbc32f320e572453166f9354ecc6d06") (:authors ("Christian 'crshd' Brassat" . "christian.brassat@gmail.com")) (:maintainer "Christian 'crshd' Brassat" . "christian.brassat@gmail.com") (:url . "https://github.com/crshd/fetch.el"))]) (ffmpeg-player . [(20220704 641) ((emacs (24 4)) (s (1 12 0)) (f (0 20 0))) "Play video using ffmpeg" single ((:commit . "2c41d715b012f399e661a816376824a8dea0b941") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "multimedia" "video" "ffmpeg" "buffering" "images") (:url . "https://github.com/jcs-elpa/ffmpeg-player"))]) (ffmpeg-utils . [(20230305 709) ((emacs (25 1)) (alert (1 2)) (transient (0 1 0))) "FFmpeg command utilities wrappers" single ((:commit . "064d61527bc6b6a1d0fb0065f8a7bae3bbd4cefc") (:keywords "multimedia") (:url . "https://repo.or.cz/ffmpeg-utils.git"))]) @@ -1822,7 +1822,7 @@ (foreign-regexp . [(20200325 50) nil "search and replace by foreign regexp." tar ((:commit . "e2dd47f2160cadc194eb156e7c76c3c869e6706e") (:authors ("K-talo Miyazaki ")) (:maintainer "K-talo Miyazaki ") (:keywords "convenience" "emulations" "matching" "tools" "unix" "wp"))]) (foreman-mode . [(20170725 1422) ((s (1 9 0)) (dash (2 10 0)) (dash-functional (1 2 0)) (f (0 17 2)) (emacs (24))) "View and manage Procfile-based applications" single ((:commit . "22b3bb13134b617870ed1e888af739f4818be929") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "foreman") (:url . "http://github.com/zweifisch/foreman-mode"))]) (forest-blue-theme . [(20160627 842) ((emacs (24))) "Emacs theme with a dark background." single ((:commit . "58096ce1a25615d2bae806c3775bae3e2775019d") (:authors ("olkinn")) (:maintainer "olkinn"))]) - (forge . [(20230326 2058) ((emacs (25 1)) (compat (29 1 3 4)) (closql (20230220)) (dash (2 19 1)) (emacsql (20230220)) (ghub (20220621)) (let-alist (1 0 6)) (magit (20230319)) (markdown-mode (2 4)) (transient (0 3 6)) (yaml (0 3 5))) "Access Git forges from Magit." tar ((:commit . "422881e552afd9df15e591dbf52aa36e2d481758") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/forge"))]) + (forge . [(20230407 2159) ((emacs (25 1)) (compat (29 1 3 4)) (closql (20230220)) (dash (2 19 1)) (emacsql (20230220)) (ghub (20220621)) (let-alist (1 0 6)) (magit (20230319)) (markdown-mode (2 4)) (transient (0 3 6)) (yaml (0 3 5))) "Access Git forges from Magit." tar ((:commit . "398ca3a17a3f1c63f7c49f36bf031f71d15f6ede") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/forge"))]) (form-feed . [(20210508 1627) ((emacs (24 1))) "Display ^L glyphs as horizontal lines" single ((:commit . "ac1f0ef30a11979f5dfe12d8c05a666739e486ff") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "faces") (:url . "https://depp.brause.cc/form-feed"))]) (format-all . [(20230306 534) ((emacs (24 4)) (inheritenv (0 1)) (language-id (0 19))) "Auto-format C, C++, JS, Python, Ruby and 50 other languages" single ((:commit . "91ea3c16f594294b8064e61c4b14c5264d88e24d") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-format-all-the-code"))]) (format-sql . [(20150422 1333) nil "Use format-sql to make your SQL readable in directly Emacs." single ((:commit . "97f475c245cd6c81a72a265678e2087cee66ac7b") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm") (:url . "https://github.com/paetzke/format-sql.el"))]) @@ -2437,7 +2437,7 @@ (hydandata-light-theme . [(20190809 1925) nil "A light color theme that is easy on your eyes" single ((:commit . "812ffa4bee3163098ef66ee4506feed45018be4e") (:authors ("David Chkhikvadze" . "david@chkhd.net")) (:maintainer "David Chkhikvadze" . "david@chkhd.net") (:keywords "color-theme" "theme") (:url . "https://github.com/chkhd/hydandata-light-theme"))]) (hyde . [(20160508 308) nil "Major mode to help create and manage Jekyll blogs" tar ((:commit . "a8cd6ed00ecd8d7de0ded2f4867015b412b15b76"))]) (hydra . [(20220910 1206) ((cl-lib (0 5)) (lv (0))) "Make bindings that stick around." tar ((:commit . "317e1de33086637579a7aeb60f77ed0405bf359b") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "bindings") (:url . "https://github.com/abo-abo/hydra"))]) - (hyperdrive . [(20230404 2049) ((emacs (27 1)) (map (3 0)) (compat (29 1 3 2)) (plz (0 4)) (persist (0 5))) "P2P filesystem in Emacs" tar ((:commit . "349be636e7dc4ba61262c9cf8d669b9b0637cd54") (:authors ("Joseph Turner")) (:maintainer "Joseph Turner" . "joseph@ushin.org") (:url . "https://git.sr.ht/~ushin/hyperdrive.el"))]) + (hyperdrive . [(20230407 2151) ((emacs (27 1)) (map (3 0)) (compat (29 1 3 2)) (plz (0 4)) (persist (0 5))) "P2P filesystem in Emacs" tar ((:commit . "959f6b576979c1e6aa74e5ef81c1ac7a67c425e3") (:authors ("Joseph Turner")) (:maintainer "Joseph Turner" . "joseph@ushin.org") (:url . "https://git.sr.ht/~ushin/hyperdrive.el"))]) (hyperkitty . [(20220226 1951) ((request (0 3 2)) (emacs (25 1))) "Emacs interface for Hyperkitty archives" single ((:commit . "2c1d22ff017d096c359aa151e6a29f7214a58118") (:authors ("Abhilash Raj" . "maxking@asynchronous.in")) (:maintainer "Abhilash Raj" . "maxking@asynchronous.in") (:keywords "mail" "hyperkitty" "mailman") (:url . "https://github.com/maxking/hyperkitty.el"))]) (hyperlist-mode . [(20230119 28) ((emacs (24))) "A major-mode for viewing Hyperlists" single ((:commit . "480dbf33ca72e7b5fade952aaf0d5a5eb43acb1d") (:authors ("Wojciech Siewierski")) (:maintainer "Wojciech Siewierski") (:keywords "outlines") (:url . "https://github.com/vifon/hyperlist-mode"))]) (hyperspace . [(20210603 1825) ((emacs (25)) (s (1 12 0))) "Get there from here" single ((:commit . "c4c363c140250ba6b775516082063878975a6154") (:authors ("Ian Eure" . "ian@retrospec.tv")) (:maintainer "Ian Eure" . "ian@retrospec.tv") (:keywords "tools" "convenience") (:url . "https://github.com/ieure/hyperspace-el"))]) @@ -2522,7 +2522,7 @@ (indicators . [(20161211 1126) ((dash (2 13 0)) (cl-lib (0 5 0))) "Display the buffer relative location of line in the fringe." single ((:commit . "f62a1201f21453e3aca93f48483e65ae8251432e") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "fringe" "frames") (:url . "https://github.com/Fuco1/indicators.el"))]) (indium . [(20210309 1210) ((emacs (25)) (seq (2 16)) (js2-mode (20140114)) (js2-refactor (0 9 0)) (company (0 9 0)) (json-process-client (0 2 0))) "JavaScript Awesome Development Environment" tar ((:commit . "8499e156bf7286846c3a2bf8c9e0c4d4f24b224c") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "tools" "javascript") (:url . "https://github.com/NicolasPetton/indium"))]) (indy . [(20190807 625) nil "A minor mode and EDSL to manage your mode's indentation rules." single ((:commit . "abc5bee424780ad2de5520f8fefbf8e120c0d9ed") (:authors ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainer "Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com") (:keywords "convenience" "matching" "tools"))]) - (inf-clojure . [(20230326 1946) ((emacs (26 2)) (clojure-mode (5 11))) "Run an external Clojure process in an Emacs buffer" single ((:commit . "8ad2242b75ea1a06fad391deb8f858a392408a94") (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "processes" "comint" "clojure") (:url . "http://github.com/clojure-emacs/inf-clojure"))]) + (inf-clojure . [(20230408 952) ((emacs (26 2)) (clojure-mode (5 11))) "Run an external Clojure process in an Emacs buffer" single ((:commit . "b153e5126419910c38691088aab569b7c281068c") (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "processes" "comint" "clojure") (:url . "http://github.com/clojure-emacs/inf-clojure"))]) (inf-crystal . [(20180119 211) ((emacs (24 3)) (crystal-mode (0 1 0))) "Run a Inferior-Crystal process in a buffer" single ((:commit . "dd5c85e621976ea09b602182a15396e3b510ec63") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "languages" "crystal") (:url . "https://github.com/brantou/inf-crystal.el"))]) (inf-elixir . [(20221120 2028) ((emacs (25 1))) "Run an interactive Elixir shell" single ((:commit . "6fbb0867b586ad1bf8adc09cc55f33dfa72db833") (:authors ("Jonathan Arnett" . "jonathan.arnett@protonmail.com")) (:maintainer "Jonathan Arnett" . "jonathan.arnett@protonmail.com") (:keywords "languages" "processes" "tools") (:url . "https://github.com/J3RN/inf-elixir"))]) (inf-mongo . [(20180408 1338) nil "Run a MongoDB shell process in a buffer" single ((:commit . "2e498d1c88bd1904eeec18ed06b1a0cf8bdc2a92") (:authors ("Tobias Svensson")) (:maintainer "Tobias Svensson") (:keywords "databases" "mongodb") (:url . "http://github.com/endofunky/inf-mongo"))]) @@ -2686,7 +2686,7 @@ (js-react-redux-yasnippets . [(20200316 1144) ((emacs (24 3)) (yasnippet (0 8 0))) "JavaScript,React,Redux yasnippets" tar ((:commit . "9f509043f01fa59bff4daf31b2e95d63f8deab4a") (:authors ("sooqua")) (:maintainer "sooqua") (:keywords "convenience" "snippets") (:url . "https://github.com/sooqua/js-react-redux-yasnippets"))]) (js2-closure . [(20170816 1918) ((js2-mode (20150909))) "Google Closure dependency manager" single ((:commit . "74a75f001a8bc2b9c02b9e8b4557f7ee3c5f84fb") (:authors ("Justine Tunney" . "jart@google.com")) (:maintainer "Justine Tunney" . "jart@google.com") (:keywords "javascript" "closure") (:url . "http://github.com/jart/js2-closure"))]) (js2-highlight-vars . [(20170418 1829) ((emacs (24 4)) (js2-mode (20150908))) "highlight occurrences of the variable under cursor" single ((:commit . "e3bb177e50f76b272e8073a94d4f46be6512a163") (:authors ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainer "Mihai Bazon" . "mihai.bazon@gmail.com") (:url . "http://mihai.bazon.net/projects/editing-javascript-with-emacs-js2-mode/js2-highlight-vars-mode"))]) - (js2-mode . [(20221028 1819) ((emacs (24 1)) (cl-lib (0 5))) "Improved JavaScript editing mode" tar ((:commit . "a297ec2c2d9aa50ddc6c06959bb5a054e17b692a") (:authors ("Steve Yegge" . "steve.yegge@gmail.com") ("mooz" . "stillpedant@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Steve Yegge" . "steve.yegge@gmail.com") (:keywords "languages" "javascript") (:url . "https://github.com/mooz/js2-mode/"))]) + (js2-mode . [(20230408 115) ((emacs (24 1)) (cl-lib (0 5))) "Improved JavaScript editing mode" tar ((:commit . "7d928272bc311b1dd6f38d3f6365c18153e28636") (:authors ("Steve Yegge" . "steve.yegge@gmail.com") ("mooz" . "stillpedant@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Steve Yegge" . "steve.yegge@gmail.com") (:keywords "languages" "javascript") (:url . "https://github.com/mooz/js2-mode/"))]) (js2-refactor . [(20210306 2003) ((js2-mode (20101228)) (s (1 9 0)) (multiple-cursors (1 0 0)) (dash (1 0 0)) (s (1 0 0)) (yasnippet (0 9 0 1))) "A JavaScript refactoring library for emacs." tar ((:commit . "1372f8449c620d6209173ac12bcb7ac4ce6a3651") (:authors ("Magnar Sveen" . "magnars@gmail.com") ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "conveniences"))]) (js2hl . [(20201119 816) ((emacs (25 1)) (js2-mode (20190219))) "Highlight/rename things using js2-mode parser" single ((:commit . "8a9a53a861d20ce51a382d6caef48ccd978d8212") (:authors ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "convenience") (:url . "https://github.com/redguardtoo/js2hl"))]) (js3-mode . [(20160515 1550) nil "An improved JavaScript editing mode" tar ((:commit . "7fceb21ec56aac7af4b189bb0c0d0cf620327f5a") (:authors ("Thom Blake" . "webmaster@thomblake.com")) (:maintainer "Thom Blake" . "webmaster@thomblake.com") (:keywords "javascript" "languages"))]) @@ -2870,7 +2870,7 @@ (lexic . [(20220501 1432) ((emacs (26 3))) "A major mode to find out more about words" single ((:commit . "f9b3de4d9c2dd1ce5022383e1a504b87bf7d1b09") (:authors ("pluskid" . "pluskid@gmail.com") ("gucong" . "gucong43216@gmail.com") ("TEC" . "tec@tecosaur.com")) (:maintainer "TEC" . "tec@tecosaur.com") (:url . "https://github.com/tecosaur/lexic"))]) (lf . [(20210808 1921) ((s (1 12 0)) (dash (2 16 0)) (emacs (27 1))) "A Language Features library for Emacs Lisp" single ((:commit . "35db92ca765a0544721fdeea036d77b7d192d083") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:keywords "convenience" "programming") (:url . "https://alhassy.github.io/lf.el/"))]) (lfe-mode . [(20220822 911) nil "Lisp Flavoured Erlang mode" tar ((:commit . "42fc3dc57d4229800f44a0d6907185ebdf7175e2"))]) - (lgr . [(20230313 2155) ((emacs (26 1))) "A fully featured logging framework" single ((:commit . "a46f7e6c58e0c343c81e464f4233acfaa0434b4f") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "tools") (:url . "https://github.com/Fuco1/emacs-lgr"))]) + (lgr . [(20230407 1317) ((emacs (26 1))) "A fully featured logging framework" single ((:commit . "4ab6c22bcbc533acace3c854876f40fa9d2f7819") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "tools") (:url . "https://github.com/Fuco1/emacs-lgr"))]) (libbcel . [(20221003 1827) ((emacs (26 1)) (request (0 3 1))) "Library to connect to basecamp 3 API" tar ((:commit . "3d506a3fb5b377bf460e7b8096f7211949567f75") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/bcel/libbcel"))]) (libelcouch . [(20230129 1000) ((emacs (26 1)) (request (0 3 0))) "Communication with CouchDB" single ((:commit . "595697f4199519dd018fe489e885f237c54b0675") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "tools") (:url . "https://gitlab.petton.fr/elcouch/libelcouch/"))]) (liberime . [(20230113 556) ((emacs (25 1))) "Rime elisp binding" tar ((:commit . "cc9eb9812fd6f68e78ed6a0c0a85da7a18765753") (:authors ("A.I.")) (:maintainer "A.I.") (:keywords "convenience" "chinese" "input-method" "rime") (:url . "https://github.com/merrickluo/liberime"))]) @@ -2922,7 +2922,7 @@ (litex-mode . [(20221107 147) ((emacs (24 4)) (units-mode (0 1 1))) "Minor mode for converting lisp to LaTeX" tar ((:commit . "45004b3a865771799b739d17ebb7849190fffa63") (:authors ("Gaurav Atreya" . "allmanpride@gmail.com")) (:maintainer "Gaurav Atreya" . "allmanpride@gmail.com") (:keywords "calculator" "lisp" "latex") (:url . "https://github.com/Atreyagaurav/litex-mode"))]) (live-code-talks . [(20180907 1647) ((emacs (24)) (cl-lib (0 5)) (narrowed-page-navigation (0 1))) "Support for slides with live code in them" single ((:commit . "97f16a9ee4e6ff3e0f9291eaead772c66e3e12ae") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk") (:keywords "docs" "multimedia"))]) (live-preview . [(20201010 1948) ((emacs (24 4))) "Live preview by any shell command while editing" single ((:commit . "603a4a1759fbec92e7a1cabc249517c78e59ce7e") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-live-preview"))]) - (live-py-mode . [(20230330 58) ((emacs (24 3))) "Live Coding in Python" tar ((:commit . "4ea88695df456108adf37a547884cb37ea55438c") (:authors ("Don Kirkby http://donkirkby.github.io")) (:maintainer "Don Kirkby http://donkirkby.github.io") (:keywords "live" "coding") (:url . "http://donkirkby.github.io/live-py-plugin/"))]) + (live-py-mode . [(20230408 607) ((emacs (24 3))) "Live Coding in Python" tar ((:commit . "4e312c322e1520f71c192ad40eb210469cef3d70") (:authors ("Don Kirkby http://donkirkby.github.io")) (:maintainer "Don Kirkby http://donkirkby.github.io") (:keywords "live" "coding") (:url . "http://donkirkby.github.io/live-py-plugin/"))]) (lively . [(20171005 754) nil "interactively updating text" single ((:commit . "348675828c6a81bfa1ac311ca465aad813542c1b") (:authors ("Luke Gorrie" . "luke@bup.co.nz")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) (livereload . [(20170629 650) ((emacs (25)) (websocket (1 8))) "Livereload server" tar ((:commit . "1e501d7e46dbd476c2c7cc9d20b5ac9d41fb1955") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "convenience"))]) (livescript-mode . [(20221015 1316) ((emacs (24 3))) "Major mode for editing LiveScript files" single ((:commit . "e71a82a400e9d451c966c397bb8fa7887d35637b") (:authors ("Hisamatsu Yasuyuki" . "yas@null.net")) (:maintainer "Hisamatsu Yasuyuki" . "yas@null.net") (:keywords "languages" "livescript") (:url . "https://github.com/yhisamatsu/livescript-mode"))]) @@ -2974,7 +2974,7 @@ (lsp-latex . [(20230316 1906) ((emacs (26 3)) (lsp-mode (6 0))) "LSP-mode client for LaTeX, on texlab" single ((:commit . "4f3d7166aeda16099d226066928d89bb44849624") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "languages" "tex") (:url . "https://github.com/ROCKTAKEY/lsp-latex"))]) (lsp-ltex . [(20221231 1658) ((emacs (27 1)) (lsp-mode (6 1))) "LSP Clients for LTEX" single ((:commit . "d1a599c8ec3748c2b81899d5831b6e7158255479") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "lsp" "languagetool" "checker") (:url . "https://github.com/emacs-languagetool/lsp-ltex"))]) (lsp-metals . [(20230406 755) ((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)) (posframe (1 4 1))) "Scala Client settings" tar ((:commit . "a11099b79f032aa2fc92a727d2c1e40987727d65") (: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 . [(20230401 434) ((emacs (26 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0)) (eldoc (1 11))) "LSP mode" tar ((:commit . "955b2805b4e3488189da9230382de27f74d20290") (: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 . [(20230407 1752) ((emacs (26 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0)) (eldoc (1 11))) "LSP mode" tar ((:commit . "3143400be9dfc1335483838e24ae5e0f5705d420") (: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 . [(20230316 1612) ((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 . "9d9a14a2b40c5fd13b8e33fccd397283a2437526") (: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 . "084e33a5782f9153502d9b03e63d9cbbe81cdaeb") (:authors ("Dmitri Makarov")) (:maintainer "Dmitri Makarov") (:keywords "lsp" "p4") (:url . "https://github.com/dmakarov/p4ls"))]) @@ -3013,7 +3013,7 @@ (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 . [(20230103 1503) nil "mode for editing Magik + some utils." tar ((:commit . "a2ddc7cad487e6165c2e2ac26acec62b1f7bbeca") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))]) - (magit . [(20230402 1342) ((emacs (25 1)) (compat (29 1 3 4)) (dash (20221013)) (git-commit (20230101)) (magit-section (20230101)) (transient (20230201)) (with-editor (20230118))) "A Git porcelain inside Emacs." tar ((:commit . "1abfb52886536f90f3561b18a49182ad21b6d8e8") (: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 . [(20230408 517) ((emacs (25 1)) (compat (29 1 3 4)) (dash (20221013)) (git-commit (20230101)) (magit-section (20230101)) (transient (20230201)) (with-editor (20230118))) "A Git porcelain inside Emacs." tar ((:commit . "beb3d6cae23e10a92797ac3c6d9f581d75e59cc3") (: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 . [(20230407 1200) ((cl-lib (0 3)) (magit (3 0 0))) "Control git-annex from Magit" single ((:commit . "255e443e19a32e716ff414e09ad5e00f6f8bc8fb") (: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-commit-mark . [(20230214 1821) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" single ((:commit . "6ed61986ae28c01d0f8c4f2bcff8ab70707488df") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/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"))]) @@ -3131,7 +3131,7 @@ (metaweblog . [(20221118 536) ((emacs (27 1))) "An XML-RPC MetaWeblog and WordPress API client" single ((:commit . "0d435af91c237351f0880536cb3cf21a91041ba4") (:authors ("Puneeth Chaganti" . "punchagan+org2blog@gmail.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com") (:keywords "comm") (:url . "https://github.com/org2blog/org2blog"))]) (metrics-tracker . [(20221030 42) ((emacs (24 4)) (seq (2 3))) "Generate reports of personal metrics from diary entries" single ((:commit . "ace35dfb6d00749a24993f3fb8f838938826b45e") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:keywords "calendar") (:url . "https://github.com/ianxm/emacs-tracker"))]) (metronome . [(20220210 147) ((emacs (25 1))) "A simple metronome" tar ((:commit . "1e1bd5234f3ecfb608041d423be7412c461ad3c2") (:authors ("Jonathan Gregory ")) (:maintainer "Jonathan Gregory ") (:url . "https://gitlab.com/jagrg/metronome"))]) - (mew . [(20230209 1231) nil "Messaging in the Emacs World" tar ((:commit . "2f9143f5865cdbd31701be58093961b41def0edc") (:authors ("Kazu Yamamoto" . "Kazu@Mew.org")) (:maintainer "Kazu Yamamoto" . "Kazu@Mew.org"))]) + (mew . [(20230329 39) nil "Messaging in the Emacs World" tar ((:commit . "8c554e08f4ad5a023057af52b01c740727c454f4") (:authors ("Mew developing team")) (:maintainer "Mew developing team"))]) (mexican-holidays . [(20210604 1421) nil "Mexico holidays for Emacs calendar." single ((:commit . "8e28907ea69f2c0ed9aad9f3b99664ca147379d0") (:authors ("Saúl Gutiérrez" . "me@sggc.me")) (:maintainer "Saúl Gutiérrez" . "me@sggc.me") (:keywords "calendar") (:url . "https://github.com/sggutier/mexican-holidays"))]) (meyvn . [(20221206 2219) ((emacs (25 1)) (cider (0 23)) (projectile (2 1)) (s (1 12)) (dash (2 17)) (parseedn (1 1 0)) (parseclj (1 1 0)) (geiser (0 12))) "Meyvn client" single ((:commit . "493e652b8fffcbed226f69a2ea82e6f9fc51ab08") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com") (:url . "https://github.com/danielsz/meyvn-el"))]) (mgmtconfig-mode . [(20230305 2331) ((emacs (24 3))) "mgmt configuration management language" single ((:commit . "a7624a2bf97c4dd99745935f68883df907c2e9b3") (:authors ("Peter Oliver" . "mgmtconfig@mavit.org.uk")) (:maintainer "Mgmt contributors ") (:keywords "languages") (:url . "https://github.com/purpleidea/mgmt/misc/emacs"))]) @@ -3544,7 +3544,7 @@ (org-autolist . [(20220530 1620) nil "Improved list management in org-mode" single ((:commit . "da3a45f95f2e9f7281d533d1e5cec1764ae26a9c") (:authors ("Calvin Young")) (:maintainer "Calvin Young") (:keywords "lists" "checklists" "org-mode") (:url . "https://github.com/calvinwyoung/org-autolist"))]) (org-babel-eval-in-repl . [(20201206 1540) ((eval-in-repl (0 9 2)) (matlab-mode (3 3 6)) (ess (16 10)) (emacs (24))) "Eval org-mode babel code blocks in various REPLs." tar ((:commit . "3591f062873de2d64cc6f83b3555d030506e6ee7") (:authors ("Takeshi Teshima" . "diadochos.developer@gmail.com")) (:maintainer "Takeshi Teshima" . "diadochos.developer@gmail.com") (:keywords "literate programming" "reproducible research" "async execution") (:url . "https://github.com/diadochos/org-babel-eval-in-repl"))]) (org-beautify-theme . [(20170908 2218) nil "A sub-theme to make org-mode more beautiful." single ((:commit . "df6a1114fda313e1689363e196c8284fbe2a2738") (:authors ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainer "Jonathan Arkell" . "jonnay@jonnay.net") (:keywords "org" "theme"))]) - (org-board . [(20200619 1016) nil "bookmarking and web archival system for Org mode." single ((:commit . "1393bd46d11a81328ed4fb8471831415a3efe224") (:authors ("Charles A. Roelli " . "charles@aurox.ch")) (:maintainer "Charles A. Roelli " . "charles@aurox.ch") (:keywords "org" "bookmarks" "archives") (:url . "https://github.com/scallywag/org-board"))]) + (org-board . [(20230408 1041) nil "bookmarking and web archival system for Org mode." single ((:commit . "500fe02bc114e5b535a2eb2ab73954d79428168f") (:authors ("Charles A. Roelli " . "charles@aurox.ch")) (:maintainer "Charles A. Roelli " . "charles@aurox.ch") (:keywords "org" "bookmarks" "archives") (:url . "https://github.com/scallywag/org-board"))]) (org-bookmark-heading . [(20230308 31) ((emacs (24 4))) "Emacs bookmark support for Org mode" single ((:commit . "f7b444ab5445e4860ab14fcc2bede3384578b194") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines") (:url . "http://github.com/alphapapa/org-bookmark-heading"))]) (org-bookmarks-extractor . [(20220829 146) ((emacs (25 1))) "Extract bookmarks from Org mode" single ((:commit . "26d810d4d58de1f64f0bbd649e13816f96663d73") (:authors ("Xuqing Jia" . "jxq@jxq.me")) (:maintainer "Xuqing Jia" . "jxq@jxq.me") (:keywords "convenience" "org") (:url . "https://github.com/jxq0/org-bookmarks-extractor"))]) (org-books . [(20210408 1913) ((enlive (0 0 1)) (s (1 11 0)) (helm (2 9 2)) (helm-org (1 0)) (dash (2 14 1)) (org (9 3)) (emacs (25))) "Reading list management with Org mode and helm" single ((:commit . "9f4ec4a981bfc5eebff993c3ad49a4bed26aebd1") (:authors ("Abhinav Tushar" . "abhinav@lepisma.xyz")) (:maintainer "Abhinav Tushar" . "abhinav@lepisma.xyz") (:keywords "outlines") (:url . "https://github.com/lepisma/org-books"))]) @@ -3786,7 +3786,7 @@ (ox-json . [(20210928 347) ((emacs (24)) (org (9 2)) (s (1 12))) "JSON export backend for Org mode" single ((:commit . "4d2e0aa7f92d07e16cea2dd5e1d250a3f243c3cf") (:authors ("Jared Lumpe" . "mjlumpe@gmail.com")) (:maintainer "Jared Lumpe" . "mjlumpe@gmail.com") (:keywords "outlines") (:url . "https://github.com/jlumpe/ox-json"))]) (ox-latex-subfigure . [(20200326 919) ((emacs (24 4)) (org (9 0))) "Subfigure for latex export" single ((:commit . "be0a0dde62fde8cdf8d72b6968344906aa8c6f54") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:keywords "convenience" "ox" "latex" "subfigure" "org" "org-mode") (:url . "http://github.com/linktohack/ox-latex-subfigure"))]) (ox-leanpub . [(20201129 2027) ((org (9 1)) (ox-gfm (1 0)) (emacs (26 1)) (s (1 12 0))) "Export Org documents to Leanpub book format" tar ((:commit . "8a00843a2a58e0c43cb53080d1005c619e4a9c88") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "files" "org" "leanpub") (:url . "https://gitlab.com/zzamboni/ox-leanpub"))]) - (ox-linuxmag-fr . [(20230215 2020) ((emacs (28 1))) "Org-mode exporter for the French GNU/Linux Magazine" tar ((:commit . "2c06d5441e9e67c3ce419bc84b1d4612f64ff40b") (:url . "https://github.com/DamienCassou/ox-linuxmag-fr"))]) + (ox-linuxmag-fr . [(20230407 1521) ((emacs (28 1))) "Org-mode exporter for the French GNU/Linux Magazine" tar ((:commit . "3cec81690345b3e53a0a21ecae70bbf3dccde086") (:url . "https://github.com/DamienCassou/ox-linuxmag-fr"))]) (ox-mdx-deck . [(20181115 1847) ((emacs (24)) (ox-hugo (0 7))) "org-mode to mdx-deck exporter" single ((:commit . "f3dbc35870b69a5d8971b1647da8c5468f520c5d") (:authors ("Joshua Wolfe")) (:maintainer "Joshua Wolfe") (:keywords "lisp" "org" "ox" "mdx" "deck") (:url . "https://github.com/WolfeCub/ox-mdx-deck/"))]) (ox-mediawiki . [(20180105 2154) ((cl-lib (0 5)) (s (1 9 0))) "Mediawiki Back-End for Org Export Engine" single ((:commit . "a9327150293e370e500ba55bddfe5fc435c6bf9b") (:authors ("Tom Alexander" . "tomalexander@paphus.com")) (:maintainer "Tom Alexander" . "tomalexander@paphus.com") (:keywords "org" "wp" "mediawiki") (:url . "https://github.com/tomalexander/orgmode-mediawiki"))]) (ox-minutes . [(20180202 1734) ((emacs (24 4))) "Plain text backend for Org for Meeting Minutes" single ((:commit . "27c29f3fdb9181322ae56f8bace8d95e621230e5") (:authors ("Kaushal Modi" . "kaushal.modi@gmail.com")) (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com") (:keywords "org" "exporter" "notes") (:url . "https://github.com/kaushalmodi/ox-minutes"))]) @@ -3798,7 +3798,7 @@ (ox-reveal . [(20221127 814) ((org (8 3))) "reveal.js Presentation Back-End for Org Export Engine" single ((:commit . "f55c851bf6aeb1bb2a7f6cf0f2b7bd0e79c4a5a0") (:authors ("Yujie Wen ")) (:maintainer "Yujie Wen ") (:keywords "outlines" "hypermedia" "slideshow" "presentation"))]) (ox-review . [(20220619 724) ((emacs (26 1)) (org (9))) "Re:VIEW Back-End for Org Export Engine" single ((:commit . "f7dc418f9812088afc0ee0d08f778a5654686ef3") (:authors ("Masashi Fujimoto")) (:maintainer "Masashi Fujimoto") (:keywords "outlines" "hypermedia") (:url . "https://github.com/masfj/ox-review"))]) (ox-rfc . [(20220604 1114) ((emacs (24 3)) (org (8 3))) "RFC Back-End for Org Export Engine" single ((:commit . "f0fe3503f8732ea5e95a4016c6b7ce5b47cf6295") (:authors ("Christian Hopps" . "chopps@devhopps.com")) (:maintainer "Christian Hopps" . "chopps@devhopps.com") (:keywords "org" "rfc" "wp" "xml") (:url . "https://github.com/choppsv1/org-rfc-export"))]) - (ox-rss . [(20230324 157) ((emacs (26 1)) (org (9 3))) "RSS 2.0 Back-End for Org Export Engine" single ((:commit . "aceff7c50e9d8ace97cefc09ca265a11e75e4d68") (:authors ("Bastien Guerry" . "bzg@gnu.org")) (:maintainer "Benedict Wang" . "foss@bhw.name") (:keywords "org" "wp" "blog" "feed" "rss") (:url . "https://github.com/benedicthw/ox-rss.git"))]) + (ox-rss . [(20230408 231) ((emacs (26 1)) (org (9 3))) "RSS 2.0 Back-End for Org Export Engine" single ((:commit . "ee7347fca8f10a4b53075a8d1e3cac3aff6e6dac") (:authors ("Bastien Guerry" . "bzg@gnu.org")) (:maintainer "Benedict Wang" . "foss@bhw.name") (:keywords "org" "wp" "blog" "feed" "rss") (:url . "https://github.com/benedicthw/ox-rss.git"))]) (ox-rst . [(20200815 1511) ((emacs (25 1)) (org (8 3))) "Export reStructuredText using org-mode." single ((:commit . "99fa790da55b57a3f2e9aa187493ba434a64250e") (:authors ("Masanao Igarashi" . "syoux2@gmail.com")) (:maintainer "Masanao Igarashi" . "syoux2@gmail.com") (:keywords "org" "rst" "rest" "restructuredtext") (:url . "https://github.com/msnoigrs/ox-rst"))]) (ox-slack . [(20200108 1546) ((emacs (24)) (org (9 1 4)) (ox-gfm (1 0))) "Slack Exporter for org-mode" single ((:commit . "c55b003f4ac343d6c6d8ef7cbe01d0d100abac34") (:authors ("Matt Price")) (:maintainer "Matt Price") (:keywords "org" "slack" "outlines") (:url . "https://github.com/titaniumbones/ox-slack"))]) (ox-spectacle . [(20230307 316) ((emacs (28 1)) (org (8 3))) "Spectacle.js Presentation Back-End for Org Export Engine" single ((:commit . "85c617200587eb3f7954c278b6cde44f8d43fd87") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com") (:keywords "convenience") (:url . "https://github.com/lorniu/ox-spectacle"))]) @@ -3818,7 +3818,7 @@ (pacfiles-mode . [(20200915 1815) ((emacs (26)) (cl-lib (0 5))) "pacnew and pacsave merging tool" tar ((:commit . "8d06f64abc98c3f3338560c8d6eb47719e034069") (:authors ("Carlos G. Cordero ")) (:maintainer "Carlos G. Cordero" . "pacfiles@binarycharly.com") (:keywords "files" "pacman" "arch" "pacnew" "pacsave" "update" "linux") (:url . "https://github.com/UndeadKernel/pacfiles-mode"))]) (pack . [(20191017 456) ((emacs (24)) (cl-lib (0 5))) "Pack and unpack archive files" single ((:commit . "85cd856fdc00a2365e88b50373b99f1b3d2227be") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:keywords "files" "dired") (:url . "https://github.com/10sr/pack-el"))]) (package+ . [(20210124 640) ((emacs (24 3))) "Extensions for the package library." tar ((:commit . "06fbc904e09d3349b669c2624a587fee5accf5ef") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com") (:keywords "extensions" "tools") (:url . "https://github.com/zenspider/package"))]) - (package-build . [(20230329 1735) ((emacs (26 1))) "Tools for assembling a package archive" tar ((:commit . "70ad610a996f6289cc24586af6ca885f784688fc") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net") ("Steve Purcell" . "steve@sanityinc.com") ("Jonas Bernoulli" . "jonas@bernoul.li") ("Phil Hagelberg" . "technomancy@gmail.com")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "maint" "tools") (:url . "https://github.com/melpa/package-build"))]) + (package-build . [(20230407 2350) ((emacs (26 1))) "Tools for assembling a package archive" tar ((:commit . "95b5cc2ae66f946577df8b639213d345c97b67db") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net") ("Steve Purcell" . "steve@sanityinc.com") ("Jonas Bernoulli" . "jonas@bernoul.li") ("Phil Hagelberg" . "technomancy@gmail.com")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "maint" "tools") (:url . "https://github.com/melpa/package-build"))]) (package-filter . [(20161122 719) nil "package archive whitelist and blacklist" single ((:commit . "c8e2531227c02c4c5e9d593f2cdb6a4ab4a6849b") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:url . "https://github.com/milkypostman/package-filter"))]) (package-lint . [(20230315 1052) ((cl-lib (0 5)) (emacs (24 1)) (let-alist (1 0 6))) "A linting library for elisp package authors" tar ((:commit . "78ae823bd89d83299a0d7a52797d2593d03e9795") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "lisp") (:url . "https://github.com/purcell/package-lint"))]) (package-lint-flymake . [(20230315 1052) ((emacs (26 1)) (package-lint (0 5))) "A package-lint Flymake backend" single ((:commit . "78ae823bd89d83299a0d7a52797d2593d03e9795") (:url . "https://github.com/purcell/package-lint"))]) @@ -4175,7 +4175,7 @@ (python-info . [(20151228 1852) nil "Python info manual for Emacs" tar ((:commit . "306f15441b54b25757cdfd3b327b84024ea21ed7"))]) (python-insert-docstring . [(20211127 1232) ((emacs (25 1))) "Python Google docstring inserter" single ((:commit . "cd6419b74c99c06d5c48c1b289572acce1fd193b") (:authors ("Marco Vocialta" . "macurovc@tutanota.com")) (:maintainer "Marco Vocialta" . "macurovc@tutanota.com") (:url . "https://github.com/macurovc/insert-docstring"))]) (python-isort . [(20210603 2153) ((emacs (26)) (reformatter (0 6))) "Reformat python-mode buffer with isort" single ((:commit . "339814df22b87eebca02137e581f65d6283fce97") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "languages") (:url . "https://github.com/wyuenho/emacs-python-isort"))]) - (python-mls . [(20230218 2131) ((emacs (27 1))) "Multi-line shell for (i)Python" single ((:commit . "7d0167ecd71b8a2b9cedc08a490107c36b9ada43") (:authors ("J.D. Smith")) (:maintainer "J.D. Smith") (:keywords "languages" "processes") (:url . "https://github.com/jdtsmith/python-mls"))]) + (python-mls . [(20230407 2139) ((emacs (27 1)) (compat (29 1))) "Multi-line shell for (i)Python" single ((:commit . "0dd0bb1eb8e580093bc35ee5610f894d4464d386") (:authors ("J.D. Smith")) (:maintainer "J.D. Smith") (:keywords "languages" "processes") (:url . "https://github.com/jdtsmith/python-mls"))]) (python-mode . [(20230209 731) nil "Python major mode" tar ((:commit . "d00e9ffe3a7c450362d453e00b4adcb826bce464") (:authors ("2015-2023 https://gitlab.com/groups/python-mode-devs") ("2003-2014 https://launchpad.net/python-mode") ("1995-2002 Barry A. Warsaw") ("1992-1994 Tim Peters")) (:maintainer nil . "python-mode@python.org") (:keywords "python" "languages" "oop") (:url . "https://gitlab.com/groups/python-mode-devs"))]) (python-pytest . [(20221021 1937) ((emacs (24 4)) (dash (2 18 0)) (transient (0 3 7)) (projectile (0 14 0)) (s (1 12 0))) "helpers to run pytest" single ((:commit . "33c921adaa6c9c8f7cceba2342114c6b406e0d7c") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "pytest" "test" "python" "languages" "processes" "tools") (:url . "https://github.com/wbolster/emacs-python-pytest"))]) (python-switch-quotes . [(20161228 809) ((emacs (24 3))) "cycle between ' and \" quotes in python strings" single ((:commit . "93f1e9b40e061a6cea480139e8b1362b6404abd0") (:authors ("Vladimir Lagunov" . "lagunov.vladimir@gmail.com")) (:maintainer "Vladimir Lagunov" . "lagunov.vladimir@gmail.com") (:keywords "python" "tools" "convenience") (:url . "https://github.com/werehuman/python-switch-quotes"))]) @@ -4861,8 +4861,8 @@ (term+ . [(20170509 17) ((emacs (24)) (cl-lib (0 5))) "term-mode enhancement" tar ((:commit . "c3c9239b339c127231860de43abfa08c44c0201a") (:authors ("INA Lintaro ")) (:maintainer "INA Lintaro ") (:keywords "terminal" "emulation") (:url . "https://github.com/tarao/term-plus-el"))]) (term+key-intercept . [(20140211 750) ((term+ (0 1)) (key-intercept (0 1))) "term+ intercept key mapping" single ((:commit . "fd0771fd66b8c7a909aaac972194485c79ba48c4") (:authors ("INA Lintaro ")) (:maintainer "INA Lintaro ") (:keywords "terminal" "emulation") (:url . "http://github.com/tarao/term+-el"))]) (term+mux . [(20140211 749) ((term+ (0 1)) (tab-group (0 1))) "term+ terminal multiplexer and session management" single ((:commit . "81b60e80cf008472bfd7fad9233af2ef722c208a") (:authors ("INA Lintaro ")) (:maintainer "INA Lintaro ") (:keywords "terminal" "emulation") (:url . "http://github.com/tarao/term+-el"))]) - (term-alert . [(20210414 1638) ((emacs (24 0)) (term-cmd (1 1)) (alert (1 1)) (f (0 18 2))) "Notifications when commands complete in term.el." tar ((:commit . "ca1b48ad911bc972b049f48fe0531e702dbc553c") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com") (:keywords "notifications" "processes") (:url . "https://github.com/calliecameron/term-alert"))]) - (term-cmd . [(20210417 1447) ((emacs (27 2)) (dash (2 12 0)) (f (0 18 2))) "Send commands from programs running in term.el." tar ((:commit . "281b9a6d864ca85dc1451dc46baca98f48dc3f60") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com") (:keywords "processes") (:url . "https://github.com/calliecameron/term-cmd"))]) + (term-alert . [(20230407 1715) ((emacs (24 0)) (term-cmd (1 1)) (alert (1 1)) (f (0 18 2))) "Notifications when commands complete in term.el." tar ((:commit . "8e7e744773e41355bcd9f5c911001be08bc79bec") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com") (:keywords "notifications" "processes") (:url . "https://github.com/calliecameron/term-alert"))]) + (term-cmd . [(20230407 1704) ((emacs (27 2)) (dash (2 12 0)) (f (0 18 2))) "Send commands from programs running in term.el." tar ((:commit . "26c5a8cb6b55ac0d6c6bc08f6ea1b1e53f6e2654") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com") (:keywords "processes") (:url . "https://github.com/calliecameron/term-cmd"))]) (term-manager . [(20190610 2032) ((dash (2 12 0)) (emacs (24 4))) "Contextual terminal management" tar ((:commit . "eea7894350a4f31e1df0c666d3fb0bac822d34d2") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "terminals" "tools") (:url . "https://www.github.com/IvanMalison/term-manager"))]) (term-projectile . [(20190307 400) ((emacs (24)) (term-manager (0 1 0)) (projectile (0 13 0))) "projectile terminal management" single ((:commit . "fad6760e66f64661e77e952f06b2fbef1e88e4fe") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "projectile" "tools" "terminals" "vc") (:url . "https://www.github.com/IvanMalison/term-manager"))]) (term-run . [(20200128 702) nil "Run arbitrary command in terminal buffer" single ((:commit . "0fd135d55fcf864598b1fb8dd880833a1a322910") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "utility" "shell" "command" "term-mode") (:url . "https://github.com/10sr/term-run-el"))]) @@ -4892,7 +4892,7 @@ (tfsmacs . [(20180911 2114) ((emacs (25)) (tablist (0 70))) "MS TFS source control interaction." single ((:commit . "13ee3f528ff616880611f563a68d921250692ef8") (:authors ("Dino Chiesa , Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Dino Chiesa , Sebastian Monia" . "smonia@outlook.com") (:keywords "tfs" "vc") (:url . "http://github.com/sebasmonia/tfsmacs/"))]) (the-matrix-theme . [(20230402 1218) ((emacs (26 1))) "Green-on-black dark theme inspired by \"The Matrix\" movie" single ((:commit . "b339285651e088bc51fa2fb51aa319fb70cab9a4") (:authors ("Dan Dee" . "monkeyjunglejuice@pm.me")) (:maintainer "Dan Dee" . "monkeyjunglejuice@pm.me") (:keywords "faces" "theme") (:url . "https://github.com/monkeyjunglejuice/matrix-emacs-theme"))]) (theme-anchor . [(20220204 321) ((emacs (26))) "Apply theme in current buffer only" single ((:commit . "c6f715d4ccd30e83922e39cab856578ce19224bb") (:authors ("Liāu, Kiong-Gē" . "gliao.tw@pm.me")) (:maintainer "Liāu, Kiong-Gē" . "gliao.tw@pm.me") (:keywords "extensions" "lisp" "theme") (:url . "https://github.com/GongYiLiao/theme-anchor"))]) - (theme-changer . [(20230405 156) ((cl-lib (0))) "Sunrise/Sunset Theme Changer for Emacs" single ((:commit . "e7a97772b22a82c70f2bd34e205d11b0b8a1e972") (:authors ("Joshua B. Griffith" . "josh.griffith@gmail.com")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset") (:url . "https://github.com/hadronzoo/theme-changer"))]) + (theme-changer . [(20230407 1357) ((cl-lib (0))) "Sunrise/Sunset Theme Changer for Emacs" single ((:commit . "1d61ae0c2b44964718ec3832915735c8556083a6") (:authors ("Joshua B. Griffith" . "josh.griffith@gmail.com")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset") (:url . "https://github.com/hadronzoo/theme-changer"))]) (theme-looper . [(20210827 424) ((emacs (24)) (cl-lib (0 5))) "A package for switching themes in Emacs interactively" single ((:commit . "e6e8efd740df0b68db89805ba72492818dba61ab") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:keywords "convenience" "color-themes") (:url . "http://ismail.teamfluxion.com"))]) (theme-magic . [(20190711 2034) ((emacs (25)) (seq (1 8))) "Apply your Emacs theme to the rest of Linux" tar ((:commit . "844c4311bd26ebafd4b6a1d72ddcc65d87f074e3") (:authors ("GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com")) (:maintainer "GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com") (:keywords "unix" "faces" "terminals" "extensions") (:url . "https://github.com/jcaw/theme-magic.el"))]) (therapy . [(20151113 1953) ((emacs (24))) "Hooks for managing multiple Python major versions" single ((:commit . "775a92bb7b6b0fcc5b38c0b5198a9d0a1bef788a") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/therapy"))]) @@ -4978,7 +4978,7 @@ (trashed . [(20220106 1358) ((emacs (25 1))) "Viewing/editing system trash can" single ((:commit . "ddf5830730544435a068f2dc9ac75a81ea69df1d") (:authors ("Shingo Tanaka" . "shingo.fg8@gmail.com")) (:maintainer "Shingo Tanaka" . "shingo.fg8@gmail.com") (:keywords "files" "convenience" "unix") (:url . "https://github.com/shingo256/trashed"))]) (travis . [(20150825 1138) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client for Travis" tar ((:commit . "c8769d3db10ed4604969049e3bd276afa0a0138e") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "travis") (:url . "https://github.com/nlamirault/emacs-travis"))]) (tray . [(20230212 2011) ((emacs (27 1)) (compat (29 1 3 4)) (transient (0 3 0))) "Various transient menus" single ((:commit . "15b0faa8fede31887598b8dd64b69362c10e8a8e") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://git.sr.ht/~tarsius/tray"))]) - (tree-edit . [(20220407 1629) ((emacs (27 1)) (tree-sitter (0 15 0)) (tsc (0 15 0)) (tree-sitter-langs (0 10 0)) (dash (2 19)) (reazon (0 4 0)) (s (0 0 0))) "A library for structural refactoring and editing" tar ((:commit . "774a1e9598617f334fcd31aa606c5e738012fb60") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) + (tree-edit . [(20230407 2105) ((emacs (29 0)) (dash (2 19)) (reazon (0 4 0)) (s (0 0 0))) "A library for structural refactoring and editing" tar ((:commit . "86aef84896d67bcc61923663f799ab8dba05d108") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) (tree-mode . [(20151104 1331) nil "A mode to manage tree widgets" single ((:commit . "b06078826d5875d74b0e7b7ac47b0d0917610534") (:authors (nil . "wenbinye@163.com")) (:maintainer nil . "wenbinye@163.com") (:keywords "help" "convenience" "widget"))]) (tree-sitter . [(20220212 1632) ((emacs (25 1)) (tsc (0 18 0))) "Incremental parsing system" tar ((:commit . "909717c685ff5a2327fa2ca8fb8a25216129361c") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:keywords "languages" "tools" "parsers" "tree-sitter") (:url . "https://github.com/emacs-tree-sitter/elisp-tree-sitter"))]) (tree-sitter-ess-r . [(20221012 855) ((emacs (26 1)) (ess (18 10 1)) (tree-sitter (0 12 1)) (tree-sitter-langs (0 12 0))) "R with tree-sitter" single ((:commit . "9669c00f3d3463e6769725af74c392891e269eed") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/tree-sitter-ess-r"))]) @@ -4986,15 +4986,15 @@ (tree-sitter-ispell . [(20230205 533) ((emacs (26 1)) (tree-sitter (0 15 0))) "Run ispell on tree-sitter text nodes" single ((:commit . "d8c33c05f689c2cab36b8a9856811f18a4ab7c59") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/tree-sitter-ispell.el"))]) (tree-sitter-langs . [(20230311 1456) ((emacs (25 1)) (tree-sitter (0 15 0))) "Grammar bundle for tree-sitter" tar ((:commit . "ffe9ab0c8ec9e37e70e31d296df3b85bcfc73c5e") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:keywords "languages" "tools" "parsers" "tree-sitter") (:url . "https://github.com/emacs-tree-sitter/tree-sitter-langs"))]) (treefactor . [(20200516 1631) ((emacs (26 1)) (dash (2 16 0)) (f (0 20 0)) (org (9 2 6)) (avy (0 5 0))) "Restructure your messy Org documents" single ((:commit . "75357757022a4399ab772ff0d92065bd114dabe9") (:authors ("Leo Littlebook" . "Leo.Littlebook@gmail.com")) (:maintainer "Leo Littlebook" . "Leo.Littlebook@gmail.com") (:keywords "outlines" "files" "convenience") (:url . "https://github.com/cyberthal/treefactor"))]) - (treemacs . [(20230323 629) ((emacs (26 1)) (cl-lib (0 5)) (dash (2 11 0)) (s (1 12 0)) (ace-window (0 9 0)) (pfuture (1 7)) (hydra (0 13 2)) (ht (2 2)) (cfrs (1 3 2))) "A tree style file explorer package" tar ((:commit . "a20d49ed62fa64a4164a9a3f25c102ec0a338367") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-all-the-icons . [(20220911 1427) ((emacs (26 1)) (all-the-icons (4 0 1)) (treemacs (0 0))) "all-the-icons integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-evil . [(20220911 1427) ((emacs (26 1)) (evil (1 2 12)) (treemacs (0 0))) "Evil mode integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-icons-dired . [(20220915 1626) ((treemacs (0 0)) (emacs (26 1))) "Treemacs icons for dired" single ((:commit . "1961981c81122b22ea70962f45c01feeb54c3800") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-magit . [(20220917 1026) ((emacs (26 1)) (treemacs (0 0)) (pfuture (1 3)) (magit (2 90 0))) "Magit integration for treemacs" single ((:commit . "13a8a060b784021f3d6bd7c27f2a0bcf6ea0d087") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-persp . [(20220911 1427) ((emacs (26 1)) (treemacs (0 0)) (persp-mode (2 9 7)) (dash (2 11 0))) "Persp-mode integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-perspective . [(20220911 1427) ((emacs (26 1)) (treemacs (0 0)) (perspective (2 8)) (dash (2 11 0))) "Perspective integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-projectile . [(20220911 1427) ((emacs (26 1)) (projectile (0 14 0)) (treemacs (0 0))) "Projectile integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-tab-bar . [(20220911 1427) ((emacs (27 1)) (treemacs (0 0)) (dash (2 11 0))) "Tab bar integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org") ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs . [(20230408 1109) ((emacs (26 1)) (cl-lib (0 5)) (dash (2 11 0)) (s (1 12 0)) (ace-window (0 9 0)) (pfuture (1 7)) (hydra (0 13 2)) (ht (2 2)) (cfrs (1 3 2))) "A tree style file explorer package" tar ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-all-the-icons . [(20230408 1109) ((emacs (26 1)) (all-the-icons (4 0 1)) (treemacs (0 0))) "all-the-icons integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-evil . [(20230408 1109) ((emacs (26 1)) (evil (1 2 12)) (treemacs (0 0))) "Evil mode integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-icons-dired . [(20230408 1109) ((treemacs (0 0)) (emacs (26 1))) "Treemacs icons for dired" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-magit . [(20230408 1109) ((emacs (26 1)) (treemacs (0 0)) (pfuture (1 3)) (magit (2 90 0))) "Magit integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-persp . [(20230408 1109) ((emacs (26 1)) (treemacs (0 0)) (persp-mode (2 9 7)) (dash (2 11 0))) "Persp-mode integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-perspective . [(20230408 1109) ((emacs (26 1)) (treemacs (0 0)) (perspective (2 8)) (dash (2 11 0))) "Perspective integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-projectile . [(20230408 1109) ((emacs (26 1)) (projectile (0 14 0)) (treemacs (0 0))) "Projectile integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-tab-bar . [(20230408 1109) ((emacs (27 1)) (treemacs (0 0)) (dash (2 11 0))) "Tab bar integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org") ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) (treepy . [(20221205 2224) ((emacs (25 1))) "Generic tree traversal tools" single ((:commit . "7c4a0d21322506a4d4b2301b4274ec955b429b47") (:authors ("Daniel Barreto" . "daniel.barreto.n@gmail.com")) (:maintainer "Daniel Barreto" . "daniel.barreto.n@gmail.com") (:keywords "lisp" "maint" "tools") (:url . "https://github.com/volrath/treepy.el"))]) (treesit-auto . [(20230320 1555) ((emacs (29 0))) "Automatically use tree-sitter enhanced major modes" single ((:commit . "bac3b9d1d61a4d759f87c80de7be3b808d19cbf6") (:authors ("Robb Enzmann" . "robbenzmann@gmail.com")) (:maintainer "Robb Enzmann" . "robbenzmann@gmail.com") (:keywords "treesitter" "auto" "automatic" "major" "mode" "fallback" "convenience") (:url . "https://github.com/renzmann/treesit-auto.git"))]) (treeview . [(20220928 43) ((emacs (24 4))) "A generic tree navigation library" single ((:commit . "d9c10feddf3b959e7b33ce83103e1f0a61162723") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com") (:keywords "lisp" "tools" "internal" "convenience") (:url . "https://github.com/tilmanrassy/emacs-treeview"))]) @@ -5110,7 +5110,7 @@ (vc-hgcmd . [(20211021 1704) ((emacs (25 1))) "VC mercurial backend that uses hg command server" single ((:commit . "d044448965d31ca8214f8bca48487e4d9b9d9a0f") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "vc") (:url . "https://github.com/muffinmad/emacs-vc-hgcmd"))]) (vc-msg . [(20221005 1228) ((emacs (24 4)) (popup (0 5 0))) "Show commit information of current line" tar ((:commit . "027fefad63868cd7695372510c27922656cf996a") (:authors ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "git" "vc" "svn" "hg" "messenger") (:url . "http://github.com/redguardtoo/vc-msg"))]) (vc-osc . [(20190402 2349) nil "non-resident support for osc version-control" single ((:commit . "bf5a515ed85f7d7cdfe66ed5bf4ef7554f8561e5") (:authors ("Adam Spiers (see vc.el for full credits)")) (:maintainer "Adam Spiers" . "aspiers@suse.com"))]) - (vcomp . [(20230406 1934) ((emacs (24 1))) "Compare version strings" single ((:commit . "5e5af87d20f7a7727198c9cb064b39e9fd2c8c08") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "versions") (:url . "https://github.com/tarsius/vcomp"))]) + (vcomp . [(20230407 1426) ((emacs (24 1))) "Compare version strings" single ((:commit . "fdd010e9081d62aa6aaa1b25a2df925efd662d0c") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "versions") (:url . "https://github.com/tarsius/vcomp"))]) (vcsh . [(20230402 1229) ((emacs (25 1))) "vcsh integration" single ((:commit . "b9c0109a8c77446980de668785e6af1e46bdcdcd") (:authors ("Štěpán Němec" . "stepnem@smrk.net")) (:maintainer "Štěpán Němec" . "stepnem@smrk.net") (:keywords "vc" "files") (:url . "http://git.smrk.net/vcsh.el"))]) (vdf-mode . [(20210303 714) ((emacs (24 3))) "Major mode for editing Valve VDF files." single ((:commit . "0910d4f847e9c817eb8da5434b3879048ec4ac92") (:authors ("Philipp Middendorf")) (:maintainer "Philipp Middendorf") (:url . "https://github.com/plapadoo/vdf-mode"))]) (vdiff . [(20220830 1450) ((emacs (24 4)) (hydra (0 13 0))) "A diff tool similar to vimdiff" single ((:commit . "d5df45f84395f507aba555a54407b60e284b23cd") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:keywords "diff") (:url . "https://github.com/justbur/emacs-vdiff"))]) @@ -5422,4 +5422,4 @@ (ztree . [(20210415 1947) ((cl-lib (0))) "Text mode directory tree" tar ((:commit . "f05677f9696e573c8c607e8876fb4a0cccbc491f") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:keywords "files" "tools") (:url . "https://github.com/fourier/ztree"))]) (zweilight-theme . [(20170113 605) nil "A dark color theme for Emacs." single ((:commit . "890f27c939d8a358c9ef0f402fc3314f475ec874") (:authors ("Philip Arvidsson" . "contact@philiparvidsson.com")) (:maintainer "Philip Arvidsson" . "contact@philiparvidsson.com") (:url . "http://github.com/philiparvidsson/zweilight-emacs"))]) (zygospore . [(20140703 852) nil "reversible C-x 1 (delete-other-windows)" single ((:commit . "1af5ee663f5a7aa08d96a77cacff834dcdf55ea8") (:authors ("Louis Kottmann" . "louis.kottmann@gmail.com")) (:maintainer "Louis Kottmann" . "louis.kottmann@gmail.com") (:url . "https://github.com/louiskottmann/zygospore.el"))]) - (zzz-to-char . [(20210321 1707) ((emacs (24 4)) (cl-lib (0 5)) (avy (0 3 0))) "Fancy version of `zap-to-char' command" single ((:commit . "18d26571b91a9c56b6a7e0d2a58188e833ab5d0f") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience") (:url . "https://github.com/mrkkrp/zzz-to-char"))])) \ No newline at end of file + (zzz-to-char . [(20210321 1707) ((emacs (24 4)) (cl-lib (0 5)) (avy (0 3 0))) "Fancy version of `zap-to-char' command" single ((:commit . "18d26571b91a9c56b6a7e0d2a58188e833ab5d0f") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience") (:url . "https://github.com/mrkkrp/zzz-to-char"))])) diff --git a/org/elpa/archives/melpa/archive-contents b/org/elpa/archives/melpa/archive-contents index b42afe9..af7c952 100644 --- a/org/elpa/archives/melpa/archive-contents +++ b/org/elpa/archives/melpa/archive-contents @@ -113,7 +113,7 @@ (ample-regexps . [(20200508 1021) nil "ample regular expressions for Emacs" tar ((:commit . "153969ce547afe410b8986f01c9ed4087c9cd20b") (:authors ("immerrr" . "immerrr@gmail.com")) (:maintainer "immerrr" . "immerrr@gmail.com") (:keywords "regexps" "extensions" "tools"))]) (ample-theme . [(20180207 1745) nil "Calm Dark Theme for Emacs" tar ((:commit . "366698400c555211c2082962a5d74f3dd79a78c8") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com") (:keywords "theme" "dark") (:url . "https://github.com/jordonbiondo/ample-theme"))]) (ample-zen-theme . [(20150119 2154) nil "AmpleZen Theme for Emacs 24" single ((:commit . "b277bb7abd4b6624e8d59f02474b79af50a007bd") (:authors ("Michael Wall")) (:maintainer "Michael Wall") (:keywords "theme" "dark" "emacs 24") (:url . "https://github.com/mjwall/ample-zen"))]) - (amread-mode . [(20230406 1202) ((emacs (24 3)) (cl-lib (0 6 1)) (pyim (5 2 8))) "A minor mode helper user speed-reading" single ((:commit . "f5b46f83ce205b1f6c1cf54e99da3e46ad17dfad") (:keywords "wp") (:url . "https://repo.or.cz/amread-mode.git"))]) + (amread-mode . [(20230408 334) ((emacs (24 3)) (cl-lib (0 6 1)) (pyim (5 2 8))) "A minor mode helper user speed-reading" single ((:commit . "65da842cae9878b0ed7ca518302df0dd4beaae49") (:keywords "wp") (:url . "https://repo.or.cz/amread-mode.git"))]) (amsreftex . [(20220115 1838) ((emacs (25 1))) "Add amsrefs bibliography support for reftex" single ((:commit . "facf47b82572e3f62bd8d9b8d4f4d5258f6c8a38") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com") (:keywords "tex") (:url . "https://github.com/franburstall/amsreftex"))]) (amx . [(20210305 118) ((emacs (24 4)) (s (0))) "Alternative M-x with extra features." single ((:commit . "37f9c7ae55eb0331b27200fb745206fc58ceffc0") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org") ("Cornelius Mika" . "cornelius.mika@gmail.com")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "convenience" "usability" "completion") (:url . "http://github.com/DarwinAwardWinner/amx/"))]) (anaconda-mode . [(20230306 2112) ((emacs (25 1)) (pythonic (0 1 0)) (dash (2 6 0)) (s (1 9)) (f (0 16 2))) "Code navigation, documentation lookup and completion for Python" tar ((:commit . "e250596f5587129f55f446ef127d0dac5e9730a3") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/anaconda-mode"))]) @@ -576,7 +576,7 @@ (clojure-quick-repls . [(20150814 736) ((cider (0 8 1)) (dash (2 9 0))) "Quickly create Clojure and ClojureScript repls for a project." single ((:commit . "8fe4e44939e8a01a4cdf60c0001d9a6abf8a73c3") (:keywords "languages" "clojure" "cider" "clojurescript") (:url . "https://github.com/symfrog/clojure-quick-repls"))]) (clojure-snippets . [(20220914 950) ((yasnippet (0 10 0))) "Yasnippets for clojure" tar ((:commit . "66d23f0ffedf2cc2be0387c3504b5f89d7300cfa") (:authors ("Max Penet" . "m@qbits.cc")) (:maintainer "Max Penet" . "m@qbits.cc") (:keywords "snippets"))]) (clomacs . [(20220415 1035) ((emacs (24 3)) (cider (0 22 1)) (s (1 12 0)) (simple-httpd (1 4 6)) (dash (2 19 1))) "Simplifies Emacs Lisp interaction with Clojure." single ((:commit . "9cd7c9fd86bc7bc627a31275d1ef131378b90a49") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "clojure" "interaction") (:url . "https://github.com/clojure-emacs/clomacs"))]) - (closql . [(20230224 1619) ((emacs (25 1)) (compat (29 1 3 4)) (emacsql (20230220))) "Store EIEIO objects using EmacSQL" single ((:commit . "0a7226331ff1f96142199915c0ac7940bac4afdd") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "extensions") (:url . "https://github.com/emacscollective/closql"))]) + (closql . [(20230407 2158) ((emacs (25 1)) (compat (29 1 3 4)) (emacsql (20230220))) "Store EIEIO objects using EmacSQL" single ((:commit . "c3b34a6ec438d2e73309eed7bda26768b9a50335") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "extensions") (:url . "https://github.com/emacscollective/closql"))]) (closure-lint-mode . [(20101118 2124) nil "minor mode for the Closure Linter" single ((:commit . "bc3d2fd5c35580bf1b8af43b12484c95a343b4b5") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com") (:keywords "tools" "closure" "javascript" "lint" "flymake") (:url . "https://github.com/r0man/closure-lint-mode"))]) (cloud-theme . [(20220205 1336) ((emacs (24))) "A light colored theme" single ((:commit . "16ef7fbf0a423b29e3c3a0a2d9525afaf265aaed") (:authors ("Valerii Lysenko" . "vallyscode@gmail.com")) (:maintainer "Valerii Lysenko" . "vallyscode@gmail.com") (:keywords "color" "theme") (:url . "https://github.com/vallyscode/cloud-theme"))]) (cloud-to-butt-erc . [(20130627 2308) nil "Replace 'the cloud' with 'my butt'" single ((:commit . "6710c03d1bc91736435cbfe845924940cae34e5c") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/cloud-to-butt-erc"))]) @@ -931,7 +931,7 @@ (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 . [(20230201 134) ((emacs (27 1))) "Display diff's using alternative diffing tools" single ((:commit . "84446e315a163cecb7259858c9b01d2e6726775e") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-diff-ansi"))]) (diff-at-point . [(20230320 2355) ((emacs (26 2))) "Diff navigation" single ((:commit . "0a4815a364b636eadf2f9ca6f468fb5996ff8d6f") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-diff-at-point"))]) - (diff-hl . [(20230218 2323) ((cl-lib (0 2)) (emacs (25 1))) "Highlight uncommitted changes using VC" tar ((:commit . "d20f16bf5eadd66e775f215e800f25caddae8cb5") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "vc" "diff") (:url . "https://github.com/dgutov/diff-hl"))]) + (diff-hl . [(20230408 35) ((cl-lib (0 2)) (emacs (25 1))) "Highlight uncommitted changes using VC" tar ((:commit . "170320efda0db99dc234b7759cf41539f6b6d9a8") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "vc" "diff") (:url . "https://github.com/dgutov/diff-hl"))]) (diffed . [(20230208 1546) ((emacs (27 1))) "Diffed is for recursive diff like Dired is for ls" single ((:commit . "f7dc37f13a4f1660212c41a6e9faba61eb8cc078") (:authors ("Bernhard Rotter" . "bernhard@b-rotter.de")) (:maintainer "Bernhard Rotter" . "bernhard@b-rotter.de") (:keywords "tools") (:url . "https://github.com/ber-ro/diffed"))]) (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"))]) (diffpdf . [(20210626 1447) ((emacs (25 1)) (transient (0 3 0))) "Transient diffpdf" single ((:commit . "a5b203b549e373cb9b0ef3f00c0010bd34dd644a") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/diffpdf.el"))]) @@ -1087,7 +1087,7 @@ (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"))]) (dw . [(20210331 2311) ((emacs (25 1))) "Diceware passphrase generation commands" single ((:commit . "61c5718ba64ace4c9e29de18aa2690ecc3f0f258") (:authors ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net") (:keywords "convenience" "games") (:url . "https://github.com/integral-dw/dw-passphrase-generator"))]) - (dwim-shell-command . [(20230407 1000) ((emacs (28 1))) "Shell commands with DWIM behaviour" tar ((:commit . "a4386911668eaccf726a3024d989863be49b62c4") (:authors ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/dwim-shell-command"))]) + (dwim-shell-command . [(20230407 2002) ((emacs (28 1))) "Shell commands with DWIM behaviour" tar ((:commit . "2222c483660ac04c77b51a0bd5e7871259aa526c") (:authors ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/dwim-shell-command"))]) (dyalog-mode . [(20230214 1027) ((cl-lib (0 2)) (emacs (24 3))) "Major mode for editing Dyalog APL source code" tar ((:commit . "13c0d391aa878a1609259a89fe3e6db8d21935e8") (:authors ("Joakim Hårsman" . "joakim.harsman@gmail.com")) (:maintainer "Joakim Hårsman" . "joakim.harsman@gmail.com") (:keywords "languages") (:url . "https://github.com/harsman/dyalog-mode.git"))]) (dylan . [(20220115 1804) ((emacs (25 1))) "Dylan editing modes" tar ((:commit . "9d2891e3e06405b75072d296f385fa795aeb9835") (:url . "https://opendylan.org/"))]) (dynamic-fonts . [(20140731 1226) ((font-utils (0 7 0)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Set faces based on available fonts" single ((:commit . "004ee6014dc7dbff8f14d26015c91d9229f6eac0") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "faces" "frames") (:url . "http://github.com/rolandwalker/dynamic-fonts"))]) @@ -1319,7 +1319,7 @@ (epc . [(20140610 534) ((concurrent (0 3 1)) (ctable (0 1 2))) "A RPC stack for the Emacs Lisp" tar ((:commit . "94cd36a3bec752263ac9b1b3a9dd2def329d2af7") (:authors ("SAKURAI Masashi ")) (:maintainer "SAKURAI Masashi ") (:keywords "lisp" "rpc") (:url . "https://github.com/kiwanami/emacs-epc"))]) (epic . [(20170210 23) ((htmlize (1 47))) "Evernote Picker for Cocoa Emacs" single ((:commit . "a41826c330eb0ea061d58a08cc861b0c4ac8ec4e") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "evernote" "applescript") (:url . "https://github.com/yoshinari-nomura/epic"))]) (eping . [(20201027 2149) ((emacs (25 1))) "Ping websites to check internet connectivity" tar ((:commit . "004496ee06c0b8ead4a4f49e17109e8eb32eb49d") (:authors ("Sean Hutchings" . "seanhut@yandex.com")) (:maintainer "Sean Hutchings" . "seanhut@yandex.com") (:keywords "comm" "processes" "terminals" "unix") (:url . "https://github.com/sean-hut/eping"))]) - (epkg . [(20230312 1644) ((emacs (25 1)) (compat (29 1 3 4)) (closql (20230220)) (emacsql (20230220)) (llama (0 2 0))) "Browse the Emacsmirror package database" tar ((:commit . "e2021f6cff73902bec79b19c492ea2c5930cdc50") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg"))]) + (epkg . [(20230407 2200) ((emacs (25 1)) (compat (29 1 3 4)) (closql (20230220)) (emacsql (20230220)) (llama (0 2 0))) "Browse the Emacsmirror package database" tar ((:commit . "c1117eb93f65c15c81cb4822c5eec9a12fe268ed") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg"))]) (epkg-marginalia . [(20230212 2018) ((emacs (27 1)) (compat (29 1 3 4)) (epkg (3 3 1)) (llama (0 2 0)) (marginalia (0 12))) "Show Epkg information in completion annotations" single ((:commit . "4f3a66946b1be11c40d1635b60ea21941c882e8f") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg-marginalia"))]) (epl . [(20180205 2049) ((cl-lib (0 3))) "Emacs Package Library" single ((:commit . "78ab7a85c08222cd15582a298a364774e3282ce6") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "convenience") (:url . "http://github.com/cask/epl"))]) (epm . [(20190509 443) ((emacs (24 3)) (epl (0 8))) "Emacs Package Manager" tar ((:commit . "6375ddbf93c5f25647f6ebb25b54045b3c93a5be") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:url . "https://github.com/xuchunyang/epm"))]) @@ -1375,7 +1375,7 @@ (eshell-info-banner . [(20220728 1006) ((emacs (25 1)) (s (1))) "System information as your Eshell banner" single ((:commit . "987e69a66276ca057798896c606e5c5d5fb9ee5c") (:authors ("Lucien Cartier-Tilet" . "lucien@phundrak.com")) (:maintainer "Lucien Cartier-Tilet" . "lucien@phundrak.com") (:url . "https://github.com/Phundrak/eshell-info-banner.el"))]) (eshell-outline . [(20201121 620) ((emacs (25 1))) "Enhanced outline-mode for Eshell" single ((:commit . "6f917afa5b3d36764d76d7864589094647d8c3b4") (:authors ("Jamie Beardslee" . "jdb@jamzattack.xyz")) (:maintainer "Jamie Beardslee" . "jdb@jamzattack.xyz") (:keywords "unix" "eshell" "outline" "convenience") (:url . "https://git.jamzattack.xyz/eshell-outline"))]) (eshell-prompt-extras . [(20210925 110) ((emacs (25))) "Display extra information for your eshell prompt." single ((:commit . "c2078093323206b91a1b1f5786d79faa00b76be7") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "eshell" "prompt") (:url . "https://github.com/zwild/eshell-prompt-extras"))]) - (eshell-syntax-highlighting . [(20230402 2034) ((emacs (25 1))) "Highlight eshell commands" single ((:commit . "0ac5259d497a9794e147d2b9dc23edf5bc844e3c") (:authors ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainer "Alex Kreisher" . "akreisher18@gmail.com") (:keywords "convenience") (:url . "https://github.com/akreisher/eshell-syntax-highlighting"))]) + (eshell-syntax-highlighting . [(20230408 805) ((emacs (25 1))) "Highlight eshell commands" single ((:commit . "4b09435b8226da5d8221b0bd760e6bbdae00426f") (:authors ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainer "Alex Kreisher" . "akreisher18@gmail.com") (:keywords "convenience") (:url . "https://github.com/akreisher/eshell-syntax-highlighting"))]) (eshell-toggle . [(20220718 729) ((emacs (25 1)) (dash (2 11 0))) "Show/hide eshell under active window." single ((:commit . "d4e884624f02e68b267b0044322ad17baa6780f8") (:authors ("Dmitry Cherkassov" . "dcherkassov@gmail.com")) (:maintainer "Dmitry Cherkassov" . "dcherkassov@gmail.com") (:keywords "processes") (:url . "https://github.com/4da/eshell-toggle"))]) (eshell-up . [(20170425 1737) ((emacs (24))) "Quickly go to a specific parent directory in eshell" single ((:commit . "b00e447ad7941ab31bcbb6bc0205fd492e887e7d") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "eshell") (:url . "https://github.com/peterwvj/eshell-up"))]) (eshell-vterm . [(20221229 1328) ((emacs (27 1)) (vterm (0 0 1))) "Vterm for visual commands in eshell" single ((:commit . "e96c30ad5e7d63b778fc3232e81b090b63b13277") (:authors ("Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com")) (:maintainer "Illia Ostapyshyn" . "ilya.ostapyshyn@gmail.com") (:keywords "eshell" "vterm" "terminals" "shell" "visual" "tools" "processes") (:url . "https://github.com/iostapyshyn/eshell-vterm"))]) @@ -1487,7 +1487,7 @@ (evil-textobj-syntax . [(20181210 1213) ((names (0 5)) (emacs (24)) (evil (0))) "Provides syntax text objects." single ((:commit . "2d9ba8c75c754b409aea7469f46a5cfa52a872f3") (:keywords "evil" "syntax" "highlight" "text-object") (:url . "https://github.com/laishulu/evil-textobj-syntax"))]) (evil-textobj-tree-sitter . [(20230311 1441) ((emacs (25 1)) (tree-sitter (0 15 0))) "Provides evil textobjects using tree-sitter" tar ((:commit . "11bbbab2412aec2bca16381ff639385644ca4b98") (:keywords "evil" "tree-sitter" "text-object" "convenience") (:url . "https://github.com/meain/evil-textobj-tree-sitter"))]) (evil-traces . [(20191214 558) ((emacs (25 1)) (evil (1 2 13))) "Visual hints for `evil-ex'" single ((:commit . "05e201cd63b549e3c88b5c3fc9b264bd6fe5a42c") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:keywords "emulations" "evil" "visual") (:url . "https://github.com/mamapanda/evil-traces"))]) - (evil-tree-edit . [(20220425 2355) ((emacs (27 1)) (tree-edit (0 1 0)) (tree-sitter (0 15 0)) (evil (1 0 0)) (avy (0 5 0)) (s (0 0 0))) "Evil structural editing for any language!" tar ((:commit . "eafee31ca4f532a9dbee326d3ec3bdd1e997223b") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) + (evil-tree-edit . [(20230407 2105) ((emacs (27 1)) (tree-edit (0 1 0)) (tree-sitter (0 15 0)) (evil (1 0 0)) (avy (0 5 0)) (s (0 0 0))) "Evil structural editing for any language!" single ((:commit . "86aef84896d67bcc61923663f799ab8dba05d108") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) (evil-tutor . [(20150103 653) ((evil (1 0 9))) "Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:commit . "909273bac88b98a565f1b89bbb13d523b7edce2b") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil") (:url . "https://github.com/syl20bnr/evil-tutor"))]) (evil-tutor-ja . [(20160917 132) ((evil (1 0 9)) (evil-tutor (0 1))) "Japanese Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:commit . "06b9ad853a15ce6f2c53c2cf379b9ff358369f2d") (:authors ("Kenji Miyazaki" . "kenjizmyzk@gmail.com")) (:maintainer "Kenji Miyazaki" . "kenjizmyzk@gmail.com") (:keywords "convenience" "editing" "evil" "japanese") (:url . "https://github.com/kenjimyzk/evil-tutor-ja"))]) (evil-vimish-fold . [(20200122 117) ((emacs (24 4)) (evil (1 0 0)) (vimish-fold (0 2 0))) "Integrate vimish-fold with evil" single ((:commit . "b6e0e6b91b8cd047e80debef1a536d9d49eef31a") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/evil-vimish-fold"))]) @@ -1562,7 +1562,7 @@ (feebleline . [(20190822 1401) nil "Replace modeline with a slimmer proxy" single ((:commit . "b2f2db25cac77817bf0c49ea2cea6383556faea0") (:authors ("Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com")) (:maintainer "Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com") (:url . "https://github.com/tautologyclub/feebleline"))]) (feed-discovery . [(20200714 1118) ((emacs (25 1)) (dash (2 16 0))) "Discover feed url by RSS/Atom autodiscovery" single ((:commit . "3812439c845c184eaf164d3ac8935de135259855") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/feed-discovery"))]) (feline . [(20230315 1821) ((emacs (28 1))) "A modeline with very little" single ((:commit . "3f9247f48058285d3e03957680e011ecf58d6feb") (:authors ("chee" . "emacs@chee.party")) (:maintainer "chee" . "emacs@chee.party") (:url . "https://opensource.chee.party/chee/feline-mode"))]) - (fennel-mode . [(20230215 1641) ((emacs (26 1))) "A major-mode for editing Fennel code" tar ((:commit . "52da9715b0d046597cb322d3a98cb27ae6e5719e") (:authors ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "languages" "tools") (:url . "https://git.sr.ht/~technomancy/fennel-mode"))]) + (fennel-mode . [(20230408 619) ((emacs (26 1))) "A major-mode for editing Fennel code" tar ((:commit . "dd2d0845cd8f21f6487c4e8ca5ea104d1fcba11a") (:authors ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "languages" "tools") (:url . "https://git.sr.ht/~technomancy/fennel-mode"))]) (fetch . [(20131201 730) nil "Fetch and unpack resources" single ((:commit . "3f2793afcbbc32f320e572453166f9354ecc6d06") (:authors ("Christian 'crshd' Brassat" . "christian.brassat@gmail.com")) (:maintainer "Christian 'crshd' Brassat" . "christian.brassat@gmail.com") (:url . "https://github.com/crshd/fetch.el"))]) (ffmpeg-player . [(20220704 641) ((emacs (24 4)) (s (1 12 0)) (f (0 20 0))) "Play video using ffmpeg" single ((:commit . "2c41d715b012f399e661a816376824a8dea0b941") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "multimedia" "video" "ffmpeg" "buffering" "images") (:url . "https://github.com/jcs-elpa/ffmpeg-player"))]) (ffmpeg-utils . [(20230305 709) ((emacs (25 1)) (alert (1 2)) (transient (0 1 0))) "FFmpeg command utilities wrappers" single ((:commit . "064d61527bc6b6a1d0fb0065f8a7bae3bbd4cefc") (:keywords "multimedia") (:url . "https://repo.or.cz/ffmpeg-utils.git"))]) @@ -1822,7 +1822,7 @@ (foreign-regexp . [(20200325 50) nil "search and replace by foreign regexp." tar ((:commit . "e2dd47f2160cadc194eb156e7c76c3c869e6706e") (:authors ("K-talo Miyazaki ")) (:maintainer "K-talo Miyazaki ") (:keywords "convenience" "emulations" "matching" "tools" "unix" "wp"))]) (foreman-mode . [(20170725 1422) ((s (1 9 0)) (dash (2 10 0)) (dash-functional (1 2 0)) (f (0 17 2)) (emacs (24))) "View and manage Procfile-based applications" single ((:commit . "22b3bb13134b617870ed1e888af739f4818be929") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "foreman") (:url . "http://github.com/zweifisch/foreman-mode"))]) (forest-blue-theme . [(20160627 842) ((emacs (24))) "Emacs theme with a dark background." single ((:commit . "58096ce1a25615d2bae806c3775bae3e2775019d") (:authors ("olkinn")) (:maintainer "olkinn"))]) - (forge . [(20230326 2058) ((emacs (25 1)) (compat (29 1 3 4)) (closql (20230220)) (dash (2 19 1)) (emacsql (20230220)) (ghub (20220621)) (let-alist (1 0 6)) (magit (20230319)) (markdown-mode (2 4)) (transient (0 3 6)) (yaml (0 3 5))) "Access Git forges from Magit." tar ((:commit . "422881e552afd9df15e591dbf52aa36e2d481758") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/forge"))]) + (forge . [(20230407 2159) ((emacs (25 1)) (compat (29 1 3 4)) (closql (20230220)) (dash (2 19 1)) (emacsql (20230220)) (ghub (20220621)) (let-alist (1 0 6)) (magit (20230319)) (markdown-mode (2 4)) (transient (0 3 6)) (yaml (0 3 5))) "Access Git forges from Magit." tar ((:commit . "398ca3a17a3f1c63f7c49f36bf031f71d15f6ede") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/forge"))]) (form-feed . [(20210508 1627) ((emacs (24 1))) "Display ^L glyphs as horizontal lines" single ((:commit . "ac1f0ef30a11979f5dfe12d8c05a666739e486ff") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "faces") (:url . "https://depp.brause.cc/form-feed"))]) (format-all . [(20230306 534) ((emacs (24 4)) (inheritenv (0 1)) (language-id (0 19))) "Auto-format C, C++, JS, Python, Ruby and 50 other languages" single ((:commit . "91ea3c16f594294b8064e61c4b14c5264d88e24d") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-format-all-the-code"))]) (format-sql . [(20150422 1333) nil "Use format-sql to make your SQL readable in directly Emacs." single ((:commit . "97f475c245cd6c81a72a265678e2087cee66ac7b") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm") (:url . "https://github.com/paetzke/format-sql.el"))]) @@ -2437,7 +2437,7 @@ (hydandata-light-theme . [(20190809 1925) nil "A light color theme that is easy on your eyes" single ((:commit . "812ffa4bee3163098ef66ee4506feed45018be4e") (:authors ("David Chkhikvadze" . "david@chkhd.net")) (:maintainer "David Chkhikvadze" . "david@chkhd.net") (:keywords "color-theme" "theme") (:url . "https://github.com/chkhd/hydandata-light-theme"))]) (hyde . [(20160508 308) nil "Major mode to help create and manage Jekyll blogs" tar ((:commit . "a8cd6ed00ecd8d7de0ded2f4867015b412b15b76"))]) (hydra . [(20220910 1206) ((cl-lib (0 5)) (lv (0))) "Make bindings that stick around." tar ((:commit . "317e1de33086637579a7aeb60f77ed0405bf359b") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "bindings") (:url . "https://github.com/abo-abo/hydra"))]) - (hyperdrive . [(20230404 2049) ((emacs (27 1)) (map (3 0)) (compat (29 1 3 2)) (plz (0 4)) (persist (0 5))) "P2P filesystem in Emacs" tar ((:commit . "349be636e7dc4ba61262c9cf8d669b9b0637cd54") (:authors ("Joseph Turner")) (:maintainer "Joseph Turner" . "joseph@ushin.org") (:url . "https://git.sr.ht/~ushin/hyperdrive.el"))]) + (hyperdrive . [(20230407 2151) ((emacs (27 1)) (map (3 0)) (compat (29 1 3 2)) (plz (0 4)) (persist (0 5))) "P2P filesystem in Emacs" tar ((:commit . "959f6b576979c1e6aa74e5ef81c1ac7a67c425e3") (:authors ("Joseph Turner")) (:maintainer "Joseph Turner" . "joseph@ushin.org") (:url . "https://git.sr.ht/~ushin/hyperdrive.el"))]) (hyperkitty . [(20220226 1951) ((request (0 3 2)) (emacs (25 1))) "Emacs interface for Hyperkitty archives" single ((:commit . "2c1d22ff017d096c359aa151e6a29f7214a58118") (:authors ("Abhilash Raj" . "maxking@asynchronous.in")) (:maintainer "Abhilash Raj" . "maxking@asynchronous.in") (:keywords "mail" "hyperkitty" "mailman") (:url . "https://github.com/maxking/hyperkitty.el"))]) (hyperlist-mode . [(20230119 28) ((emacs (24))) "A major-mode for viewing Hyperlists" single ((:commit . "480dbf33ca72e7b5fade952aaf0d5a5eb43acb1d") (:authors ("Wojciech Siewierski")) (:maintainer "Wojciech Siewierski") (:keywords "outlines") (:url . "https://github.com/vifon/hyperlist-mode"))]) (hyperspace . [(20210603 1825) ((emacs (25)) (s (1 12 0))) "Get there from here" single ((:commit . "c4c363c140250ba6b775516082063878975a6154") (:authors ("Ian Eure" . "ian@retrospec.tv")) (:maintainer "Ian Eure" . "ian@retrospec.tv") (:keywords "tools" "convenience") (:url . "https://github.com/ieure/hyperspace-el"))]) @@ -2522,7 +2522,7 @@ (indicators . [(20161211 1126) ((dash (2 13 0)) (cl-lib (0 5 0))) "Display the buffer relative location of line in the fringe." single ((:commit . "f62a1201f21453e3aca93f48483e65ae8251432e") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "fringe" "frames") (:url . "https://github.com/Fuco1/indicators.el"))]) (indium . [(20210309 1210) ((emacs (25)) (seq (2 16)) (js2-mode (20140114)) (js2-refactor (0 9 0)) (company (0 9 0)) (json-process-client (0 2 0))) "JavaScript Awesome Development Environment" tar ((:commit . "8499e156bf7286846c3a2bf8c9e0c4d4f24b224c") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "tools" "javascript") (:url . "https://github.com/NicolasPetton/indium"))]) (indy . [(20190807 625) nil "A minor mode and EDSL to manage your mode's indentation rules." single ((:commit . "abc5bee424780ad2de5520f8fefbf8e120c0d9ed") (:authors ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainer "Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com") (:keywords "convenience" "matching" "tools"))]) - (inf-clojure . [(20230326 1946) ((emacs (26 2)) (clojure-mode (5 11))) "Run an external Clojure process in an Emacs buffer" single ((:commit . "8ad2242b75ea1a06fad391deb8f858a392408a94") (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "processes" "comint" "clojure") (:url . "http://github.com/clojure-emacs/inf-clojure"))]) + (inf-clojure . [(20230408 952) ((emacs (26 2)) (clojure-mode (5 11))) "Run an external Clojure process in an Emacs buffer" single ((:commit . "b153e5126419910c38691088aab569b7c281068c") (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "processes" "comint" "clojure") (:url . "http://github.com/clojure-emacs/inf-clojure"))]) (inf-crystal . [(20180119 211) ((emacs (24 3)) (crystal-mode (0 1 0))) "Run a Inferior-Crystal process in a buffer" single ((:commit . "dd5c85e621976ea09b602182a15396e3b510ec63") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "languages" "crystal") (:url . "https://github.com/brantou/inf-crystal.el"))]) (inf-elixir . [(20221120 2028) ((emacs (25 1))) "Run an interactive Elixir shell" single ((:commit . "6fbb0867b586ad1bf8adc09cc55f33dfa72db833") (:authors ("Jonathan Arnett" . "jonathan.arnett@protonmail.com")) (:maintainer "Jonathan Arnett" . "jonathan.arnett@protonmail.com") (:keywords "languages" "processes" "tools") (:url . "https://github.com/J3RN/inf-elixir"))]) (inf-mongo . [(20180408 1338) nil "Run a MongoDB shell process in a buffer" single ((:commit . "2e498d1c88bd1904eeec18ed06b1a0cf8bdc2a92") (:authors ("Tobias Svensson")) (:maintainer "Tobias Svensson") (:keywords "databases" "mongodb") (:url . "http://github.com/endofunky/inf-mongo"))]) @@ -2686,7 +2686,7 @@ (js-react-redux-yasnippets . [(20200316 1144) ((emacs (24 3)) (yasnippet (0 8 0))) "JavaScript,React,Redux yasnippets" tar ((:commit . "9f509043f01fa59bff4daf31b2e95d63f8deab4a") (:authors ("sooqua")) (:maintainer "sooqua") (:keywords "convenience" "snippets") (:url . "https://github.com/sooqua/js-react-redux-yasnippets"))]) (js2-closure . [(20170816 1918) ((js2-mode (20150909))) "Google Closure dependency manager" single ((:commit . "74a75f001a8bc2b9c02b9e8b4557f7ee3c5f84fb") (:authors ("Justine Tunney" . "jart@google.com")) (:maintainer "Justine Tunney" . "jart@google.com") (:keywords "javascript" "closure") (:url . "http://github.com/jart/js2-closure"))]) (js2-highlight-vars . [(20170418 1829) ((emacs (24 4)) (js2-mode (20150908))) "highlight occurrences of the variable under cursor" single ((:commit . "e3bb177e50f76b272e8073a94d4f46be6512a163") (:authors ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainer "Mihai Bazon" . "mihai.bazon@gmail.com") (:url . "http://mihai.bazon.net/projects/editing-javascript-with-emacs-js2-mode/js2-highlight-vars-mode"))]) - (js2-mode . [(20221028 1819) ((emacs (24 1)) (cl-lib (0 5))) "Improved JavaScript editing mode" tar ((:commit . "a297ec2c2d9aa50ddc6c06959bb5a054e17b692a") (:authors ("Steve Yegge" . "steve.yegge@gmail.com") ("mooz" . "stillpedant@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Steve Yegge" . "steve.yegge@gmail.com") (:keywords "languages" "javascript") (:url . "https://github.com/mooz/js2-mode/"))]) + (js2-mode . [(20230408 115) ((emacs (24 1)) (cl-lib (0 5))) "Improved JavaScript editing mode" tar ((:commit . "7d928272bc311b1dd6f38d3f6365c18153e28636") (:authors ("Steve Yegge" . "steve.yegge@gmail.com") ("mooz" . "stillpedant@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Steve Yegge" . "steve.yegge@gmail.com") (:keywords "languages" "javascript") (:url . "https://github.com/mooz/js2-mode/"))]) (js2-refactor . [(20210306 2003) ((js2-mode (20101228)) (s (1 9 0)) (multiple-cursors (1 0 0)) (dash (1 0 0)) (s (1 0 0)) (yasnippet (0 9 0 1))) "A JavaScript refactoring library for emacs." tar ((:commit . "1372f8449c620d6209173ac12bcb7ac4ce6a3651") (:authors ("Magnar Sveen" . "magnars@gmail.com") ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "conveniences"))]) (js2hl . [(20201119 816) ((emacs (25 1)) (js2-mode (20190219))) "Highlight/rename things using js2-mode parser" single ((:commit . "8a9a53a861d20ce51a382d6caef48ccd978d8212") (:authors ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "convenience") (:url . "https://github.com/redguardtoo/js2hl"))]) (js3-mode . [(20160515 1550) nil "An improved JavaScript editing mode" tar ((:commit . "7fceb21ec56aac7af4b189bb0c0d0cf620327f5a") (:authors ("Thom Blake" . "webmaster@thomblake.com")) (:maintainer "Thom Blake" . "webmaster@thomblake.com") (:keywords "javascript" "languages"))]) @@ -2870,7 +2870,7 @@ (lexic . [(20220501 1432) ((emacs (26 3))) "A major mode to find out more about words" single ((:commit . "f9b3de4d9c2dd1ce5022383e1a504b87bf7d1b09") (:authors ("pluskid" . "pluskid@gmail.com") ("gucong" . "gucong43216@gmail.com") ("TEC" . "tec@tecosaur.com")) (:maintainer "TEC" . "tec@tecosaur.com") (:url . "https://github.com/tecosaur/lexic"))]) (lf . [(20210808 1921) ((s (1 12 0)) (dash (2 16 0)) (emacs (27 1))) "A Language Features library for Emacs Lisp" single ((:commit . "35db92ca765a0544721fdeea036d77b7d192d083") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:keywords "convenience" "programming") (:url . "https://alhassy.github.io/lf.el/"))]) (lfe-mode . [(20220822 911) nil "Lisp Flavoured Erlang mode" tar ((:commit . "42fc3dc57d4229800f44a0d6907185ebdf7175e2"))]) - (lgr . [(20230313 2155) ((emacs (26 1))) "A fully featured logging framework" single ((:commit . "a46f7e6c58e0c343c81e464f4233acfaa0434b4f") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "tools") (:url . "https://github.com/Fuco1/emacs-lgr"))]) + (lgr . [(20230407 1317) ((emacs (26 1))) "A fully featured logging framework" single ((:commit . "4ab6c22bcbc533acace3c854876f40fa9d2f7819") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "tools") (:url . "https://github.com/Fuco1/emacs-lgr"))]) (libbcel . [(20221003 1827) ((emacs (26 1)) (request (0 3 1))) "Library to connect to basecamp 3 API" tar ((:commit . "3d506a3fb5b377bf460e7b8096f7211949567f75") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/bcel/libbcel"))]) (libelcouch . [(20230129 1000) ((emacs (26 1)) (request (0 3 0))) "Communication with CouchDB" single ((:commit . "595697f4199519dd018fe489e885f237c54b0675") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "tools") (:url . "https://gitlab.petton.fr/elcouch/libelcouch/"))]) (liberime . [(20230113 556) ((emacs (25 1))) "Rime elisp binding" tar ((:commit . "cc9eb9812fd6f68e78ed6a0c0a85da7a18765753") (:authors ("A.I.")) (:maintainer "A.I.") (:keywords "convenience" "chinese" "input-method" "rime") (:url . "https://github.com/merrickluo/liberime"))]) @@ -2922,7 +2922,7 @@ (litex-mode . [(20221107 147) ((emacs (24 4)) (units-mode (0 1 1))) "Minor mode for converting lisp to LaTeX" tar ((:commit . "45004b3a865771799b739d17ebb7849190fffa63") (:authors ("Gaurav Atreya" . "allmanpride@gmail.com")) (:maintainer "Gaurav Atreya" . "allmanpride@gmail.com") (:keywords "calculator" "lisp" "latex") (:url . "https://github.com/Atreyagaurav/litex-mode"))]) (live-code-talks . [(20180907 1647) ((emacs (24)) (cl-lib (0 5)) (narrowed-page-navigation (0 1))) "Support for slides with live code in them" single ((:commit . "97f16a9ee4e6ff3e0f9291eaead772c66e3e12ae") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk") (:keywords "docs" "multimedia"))]) (live-preview . [(20201010 1948) ((emacs (24 4))) "Live preview by any shell command while editing" single ((:commit . "603a4a1759fbec92e7a1cabc249517c78e59ce7e") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-live-preview"))]) - (live-py-mode . [(20230330 58) ((emacs (24 3))) "Live Coding in Python" tar ((:commit . "4ea88695df456108adf37a547884cb37ea55438c") (:authors ("Don Kirkby http://donkirkby.github.io")) (:maintainer "Don Kirkby http://donkirkby.github.io") (:keywords "live" "coding") (:url . "http://donkirkby.github.io/live-py-plugin/"))]) + (live-py-mode . [(20230408 607) ((emacs (24 3))) "Live Coding in Python" tar ((:commit . "4e312c322e1520f71c192ad40eb210469cef3d70") (:authors ("Don Kirkby http://donkirkby.github.io")) (:maintainer "Don Kirkby http://donkirkby.github.io") (:keywords "live" "coding") (:url . "http://donkirkby.github.io/live-py-plugin/"))]) (lively . [(20171005 754) nil "interactively updating text" single ((:commit . "348675828c6a81bfa1ac311ca465aad813542c1b") (:authors ("Luke Gorrie" . "luke@bup.co.nz")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) (livereload . [(20170629 650) ((emacs (25)) (websocket (1 8))) "Livereload server" tar ((:commit . "1e501d7e46dbd476c2c7cc9d20b5ac9d41fb1955") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "convenience"))]) (livescript-mode . [(20221015 1316) ((emacs (24 3))) "Major mode for editing LiveScript files" single ((:commit . "e71a82a400e9d451c966c397bb8fa7887d35637b") (:authors ("Hisamatsu Yasuyuki" . "yas@null.net")) (:maintainer "Hisamatsu Yasuyuki" . "yas@null.net") (:keywords "languages" "livescript") (:url . "https://github.com/yhisamatsu/livescript-mode"))]) @@ -2974,7 +2974,7 @@ (lsp-latex . [(20230316 1906) ((emacs (26 3)) (lsp-mode (6 0))) "LSP-mode client for LaTeX, on texlab" single ((:commit . "4f3d7166aeda16099d226066928d89bb44849624") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "languages" "tex") (:url . "https://github.com/ROCKTAKEY/lsp-latex"))]) (lsp-ltex . [(20221231 1658) ((emacs (27 1)) (lsp-mode (6 1))) "LSP Clients for LTEX" single ((:commit . "d1a599c8ec3748c2b81899d5831b6e7158255479") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "lsp" "languagetool" "checker") (:url . "https://github.com/emacs-languagetool/lsp-ltex"))]) (lsp-metals . [(20230406 755) ((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)) (posframe (1 4 1))) "Scala Client settings" tar ((:commit . "a11099b79f032aa2fc92a727d2c1e40987727d65") (: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 . [(20230401 434) ((emacs (26 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0)) (eldoc (1 11))) "LSP mode" tar ((:commit . "955b2805b4e3488189da9230382de27f74d20290") (: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 . [(20230407 1752) ((emacs (26 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0)) (eldoc (1 11))) "LSP mode" tar ((:commit . "3143400be9dfc1335483838e24ae5e0f5705d420") (: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 . [(20230316 1612) ((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 . "9d9a14a2b40c5fd13b8e33fccd397283a2437526") (: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 . "084e33a5782f9153502d9b03e63d9cbbe81cdaeb") (:authors ("Dmitri Makarov")) (:maintainer "Dmitri Makarov") (:keywords "lsp" "p4") (:url . "https://github.com/dmakarov/p4ls"))]) @@ -3013,7 +3013,7 @@ (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 . [(20230103 1503) nil "mode for editing Magik + some utils." tar ((:commit . "a2ddc7cad487e6165c2e2ac26acec62b1f7bbeca") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))]) - (magit . [(20230402 1342) ((emacs (25 1)) (compat (29 1 3 4)) (dash (20221013)) (git-commit (20230101)) (magit-section (20230101)) (transient (20230201)) (with-editor (20230118))) "A Git porcelain inside Emacs." tar ((:commit . "1abfb52886536f90f3561b18a49182ad21b6d8e8") (: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 . [(20230408 517) ((emacs (25 1)) (compat (29 1 3 4)) (dash (20221013)) (git-commit (20230101)) (magit-section (20230101)) (transient (20230201)) (with-editor (20230118))) "A Git porcelain inside Emacs." tar ((:commit . "beb3d6cae23e10a92797ac3c6d9f581d75e59cc3") (: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 . [(20230407 1200) ((cl-lib (0 3)) (magit (3 0 0))) "Control git-annex from Magit" single ((:commit . "255e443e19a32e716ff414e09ad5e00f6f8bc8fb") (: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-commit-mark . [(20230214 1821) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" single ((:commit . "6ed61986ae28c01d0f8c4f2bcff8ab70707488df") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/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"))]) @@ -3131,7 +3131,7 @@ (metaweblog . [(20221118 536) ((emacs (27 1))) "An XML-RPC MetaWeblog and WordPress API client" single ((:commit . "0d435af91c237351f0880536cb3cf21a91041ba4") (:authors ("Puneeth Chaganti" . "punchagan+org2blog@gmail.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com") (:keywords "comm") (:url . "https://github.com/org2blog/org2blog"))]) (metrics-tracker . [(20221030 42) ((emacs (24 4)) (seq (2 3))) "Generate reports of personal metrics from diary entries" single ((:commit . "ace35dfb6d00749a24993f3fb8f838938826b45e") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:keywords "calendar") (:url . "https://github.com/ianxm/emacs-tracker"))]) (metronome . [(20220210 147) ((emacs (25 1))) "A simple metronome" tar ((:commit . "1e1bd5234f3ecfb608041d423be7412c461ad3c2") (:authors ("Jonathan Gregory ")) (:maintainer "Jonathan Gregory ") (:url . "https://gitlab.com/jagrg/metronome"))]) - (mew . [(20230209 1231) nil "Messaging in the Emacs World" tar ((:commit . "2f9143f5865cdbd31701be58093961b41def0edc") (:authors ("Kazu Yamamoto" . "Kazu@Mew.org")) (:maintainer "Kazu Yamamoto" . "Kazu@Mew.org"))]) + (mew . [(20230329 39) nil "Messaging in the Emacs World" tar ((:commit . "8c554e08f4ad5a023057af52b01c740727c454f4") (:authors ("Mew developing team")) (:maintainer "Mew developing team"))]) (mexican-holidays . [(20210604 1421) nil "Mexico holidays for Emacs calendar." single ((:commit . "8e28907ea69f2c0ed9aad9f3b99664ca147379d0") (:authors ("Saúl Gutiérrez" . "me@sggc.me")) (:maintainer "Saúl Gutiérrez" . "me@sggc.me") (:keywords "calendar") (:url . "https://github.com/sggutier/mexican-holidays"))]) (meyvn . [(20221206 2219) ((emacs (25 1)) (cider (0 23)) (projectile (2 1)) (s (1 12)) (dash (2 17)) (parseedn (1 1 0)) (parseclj (1 1 0)) (geiser (0 12))) "Meyvn client" single ((:commit . "493e652b8fffcbed226f69a2ea82e6f9fc51ab08") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com") (:url . "https://github.com/danielsz/meyvn-el"))]) (mgmtconfig-mode . [(20230305 2331) ((emacs (24 3))) "mgmt configuration management language" single ((:commit . "a7624a2bf97c4dd99745935f68883df907c2e9b3") (:authors ("Peter Oliver" . "mgmtconfig@mavit.org.uk")) (:maintainer "Mgmt contributors ") (:keywords "languages") (:url . "https://github.com/purpleidea/mgmt/misc/emacs"))]) @@ -3544,7 +3544,7 @@ (org-autolist . [(20220530 1620) nil "Improved list management in org-mode" single ((:commit . "da3a45f95f2e9f7281d533d1e5cec1764ae26a9c") (:authors ("Calvin Young")) (:maintainer "Calvin Young") (:keywords "lists" "checklists" "org-mode") (:url . "https://github.com/calvinwyoung/org-autolist"))]) (org-babel-eval-in-repl . [(20201206 1540) ((eval-in-repl (0 9 2)) (matlab-mode (3 3 6)) (ess (16 10)) (emacs (24))) "Eval org-mode babel code blocks in various REPLs." tar ((:commit . "3591f062873de2d64cc6f83b3555d030506e6ee7") (:authors ("Takeshi Teshima" . "diadochos.developer@gmail.com")) (:maintainer "Takeshi Teshima" . "diadochos.developer@gmail.com") (:keywords "literate programming" "reproducible research" "async execution") (:url . "https://github.com/diadochos/org-babel-eval-in-repl"))]) (org-beautify-theme . [(20170908 2218) nil "A sub-theme to make org-mode more beautiful." single ((:commit . "df6a1114fda313e1689363e196c8284fbe2a2738") (:authors ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainer "Jonathan Arkell" . "jonnay@jonnay.net") (:keywords "org" "theme"))]) - (org-board . [(20200619 1016) nil "bookmarking and web archival system for Org mode." single ((:commit . "1393bd46d11a81328ed4fb8471831415a3efe224") (:authors ("Charles A. Roelli " . "charles@aurox.ch")) (:maintainer "Charles A. Roelli " . "charles@aurox.ch") (:keywords "org" "bookmarks" "archives") (:url . "https://github.com/scallywag/org-board"))]) + (org-board . [(20230408 1041) nil "bookmarking and web archival system for Org mode." single ((:commit . "500fe02bc114e5b535a2eb2ab73954d79428168f") (:authors ("Charles A. Roelli " . "charles@aurox.ch")) (:maintainer "Charles A. Roelli " . "charles@aurox.ch") (:keywords "org" "bookmarks" "archives") (:url . "https://github.com/scallywag/org-board"))]) (org-bookmark-heading . [(20230308 31) ((emacs (24 4))) "Emacs bookmark support for Org mode" single ((:commit . "f7b444ab5445e4860ab14fcc2bede3384578b194") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines") (:url . "http://github.com/alphapapa/org-bookmark-heading"))]) (org-bookmarks-extractor . [(20220829 146) ((emacs (25 1))) "Extract bookmarks from Org mode" single ((:commit . "26d810d4d58de1f64f0bbd649e13816f96663d73") (:authors ("Xuqing Jia" . "jxq@jxq.me")) (:maintainer "Xuqing Jia" . "jxq@jxq.me") (:keywords "convenience" "org") (:url . "https://github.com/jxq0/org-bookmarks-extractor"))]) (org-books . [(20210408 1913) ((enlive (0 0 1)) (s (1 11 0)) (helm (2 9 2)) (helm-org (1 0)) (dash (2 14 1)) (org (9 3)) (emacs (25))) "Reading list management with Org mode and helm" single ((:commit . "9f4ec4a981bfc5eebff993c3ad49a4bed26aebd1") (:authors ("Abhinav Tushar" . "abhinav@lepisma.xyz")) (:maintainer "Abhinav Tushar" . "abhinav@lepisma.xyz") (:keywords "outlines") (:url . "https://github.com/lepisma/org-books"))]) @@ -3786,7 +3786,7 @@ (ox-json . [(20210928 347) ((emacs (24)) (org (9 2)) (s (1 12))) "JSON export backend for Org mode" single ((:commit . "4d2e0aa7f92d07e16cea2dd5e1d250a3f243c3cf") (:authors ("Jared Lumpe" . "mjlumpe@gmail.com")) (:maintainer "Jared Lumpe" . "mjlumpe@gmail.com") (:keywords "outlines") (:url . "https://github.com/jlumpe/ox-json"))]) (ox-latex-subfigure . [(20200326 919) ((emacs (24 4)) (org (9 0))) "Subfigure for latex export" single ((:commit . "be0a0dde62fde8cdf8d72b6968344906aa8c6f54") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:keywords "convenience" "ox" "latex" "subfigure" "org" "org-mode") (:url . "http://github.com/linktohack/ox-latex-subfigure"))]) (ox-leanpub . [(20201129 2027) ((org (9 1)) (ox-gfm (1 0)) (emacs (26 1)) (s (1 12 0))) "Export Org documents to Leanpub book format" tar ((:commit . "8a00843a2a58e0c43cb53080d1005c619e4a9c88") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "files" "org" "leanpub") (:url . "https://gitlab.com/zzamboni/ox-leanpub"))]) - (ox-linuxmag-fr . [(20230215 2020) ((emacs (28 1))) "Org-mode exporter for the French GNU/Linux Magazine" tar ((:commit . "2c06d5441e9e67c3ce419bc84b1d4612f64ff40b") (:url . "https://github.com/DamienCassou/ox-linuxmag-fr"))]) + (ox-linuxmag-fr . [(20230407 1521) ((emacs (28 1))) "Org-mode exporter for the French GNU/Linux Magazine" tar ((:commit . "3cec81690345b3e53a0a21ecae70bbf3dccde086") (:url . "https://github.com/DamienCassou/ox-linuxmag-fr"))]) (ox-mdx-deck . [(20181115 1847) ((emacs (24)) (ox-hugo (0 7))) "org-mode to mdx-deck exporter" single ((:commit . "f3dbc35870b69a5d8971b1647da8c5468f520c5d") (:authors ("Joshua Wolfe")) (:maintainer "Joshua Wolfe") (:keywords "lisp" "org" "ox" "mdx" "deck") (:url . "https://github.com/WolfeCub/ox-mdx-deck/"))]) (ox-mediawiki . [(20180105 2154) ((cl-lib (0 5)) (s (1 9 0))) "Mediawiki Back-End for Org Export Engine" single ((:commit . "a9327150293e370e500ba55bddfe5fc435c6bf9b") (:authors ("Tom Alexander" . "tomalexander@paphus.com")) (:maintainer "Tom Alexander" . "tomalexander@paphus.com") (:keywords "org" "wp" "mediawiki") (:url . "https://github.com/tomalexander/orgmode-mediawiki"))]) (ox-minutes . [(20180202 1734) ((emacs (24 4))) "Plain text backend for Org for Meeting Minutes" single ((:commit . "27c29f3fdb9181322ae56f8bace8d95e621230e5") (:authors ("Kaushal Modi" . "kaushal.modi@gmail.com")) (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com") (:keywords "org" "exporter" "notes") (:url . "https://github.com/kaushalmodi/ox-minutes"))]) @@ -3798,7 +3798,7 @@ (ox-reveal . [(20221127 814) ((org (8 3))) "reveal.js Presentation Back-End for Org Export Engine" single ((:commit . "f55c851bf6aeb1bb2a7f6cf0f2b7bd0e79c4a5a0") (:authors ("Yujie Wen ")) (:maintainer "Yujie Wen ") (:keywords "outlines" "hypermedia" "slideshow" "presentation"))]) (ox-review . [(20220619 724) ((emacs (26 1)) (org (9))) "Re:VIEW Back-End for Org Export Engine" single ((:commit . "f7dc418f9812088afc0ee0d08f778a5654686ef3") (:authors ("Masashi Fujimoto")) (:maintainer "Masashi Fujimoto") (:keywords "outlines" "hypermedia") (:url . "https://github.com/masfj/ox-review"))]) (ox-rfc . [(20220604 1114) ((emacs (24 3)) (org (8 3))) "RFC Back-End for Org Export Engine" single ((:commit . "f0fe3503f8732ea5e95a4016c6b7ce5b47cf6295") (:authors ("Christian Hopps" . "chopps@devhopps.com")) (:maintainer "Christian Hopps" . "chopps@devhopps.com") (:keywords "org" "rfc" "wp" "xml") (:url . "https://github.com/choppsv1/org-rfc-export"))]) - (ox-rss . [(20230324 157) ((emacs (26 1)) (org (9 3))) "RSS 2.0 Back-End for Org Export Engine" single ((:commit . "aceff7c50e9d8ace97cefc09ca265a11e75e4d68") (:authors ("Bastien Guerry" . "bzg@gnu.org")) (:maintainer "Benedict Wang" . "foss@bhw.name") (:keywords "org" "wp" "blog" "feed" "rss") (:url . "https://github.com/benedicthw/ox-rss.git"))]) + (ox-rss . [(20230408 231) ((emacs (26 1)) (org (9 3))) "RSS 2.0 Back-End for Org Export Engine" single ((:commit . "ee7347fca8f10a4b53075a8d1e3cac3aff6e6dac") (:authors ("Bastien Guerry" . "bzg@gnu.org")) (:maintainer "Benedict Wang" . "foss@bhw.name") (:keywords "org" "wp" "blog" "feed" "rss") (:url . "https://github.com/benedicthw/ox-rss.git"))]) (ox-rst . [(20200815 1511) ((emacs (25 1)) (org (8 3))) "Export reStructuredText using org-mode." single ((:commit . "99fa790da55b57a3f2e9aa187493ba434a64250e") (:authors ("Masanao Igarashi" . "syoux2@gmail.com")) (:maintainer "Masanao Igarashi" . "syoux2@gmail.com") (:keywords "org" "rst" "rest" "restructuredtext") (:url . "https://github.com/msnoigrs/ox-rst"))]) (ox-slack . [(20200108 1546) ((emacs (24)) (org (9 1 4)) (ox-gfm (1 0))) "Slack Exporter for org-mode" single ((:commit . "c55b003f4ac343d6c6d8ef7cbe01d0d100abac34") (:authors ("Matt Price")) (:maintainer "Matt Price") (:keywords "org" "slack" "outlines") (:url . "https://github.com/titaniumbones/ox-slack"))]) (ox-spectacle . [(20230307 316) ((emacs (28 1)) (org (8 3))) "Spectacle.js Presentation Back-End for Org Export Engine" single ((:commit . "85c617200587eb3f7954c278b6cde44f8d43fd87") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com") (:keywords "convenience") (:url . "https://github.com/lorniu/ox-spectacle"))]) @@ -3818,7 +3818,7 @@ (pacfiles-mode . [(20200915 1815) ((emacs (26)) (cl-lib (0 5))) "pacnew and pacsave merging tool" tar ((:commit . "8d06f64abc98c3f3338560c8d6eb47719e034069") (:authors ("Carlos G. Cordero ")) (:maintainer "Carlos G. Cordero" . "pacfiles@binarycharly.com") (:keywords "files" "pacman" "arch" "pacnew" "pacsave" "update" "linux") (:url . "https://github.com/UndeadKernel/pacfiles-mode"))]) (pack . [(20191017 456) ((emacs (24)) (cl-lib (0 5))) "Pack and unpack archive files" single ((:commit . "85cd856fdc00a2365e88b50373b99f1b3d2227be") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:keywords "files" "dired") (:url . "https://github.com/10sr/pack-el"))]) (package+ . [(20210124 640) ((emacs (24 3))) "Extensions for the package library." tar ((:commit . "06fbc904e09d3349b669c2624a587fee5accf5ef") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com") (:keywords "extensions" "tools") (:url . "https://github.com/zenspider/package"))]) - (package-build . [(20230329 1735) ((emacs (26 1))) "Tools for assembling a package archive" tar ((:commit . "70ad610a996f6289cc24586af6ca885f784688fc") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net") ("Steve Purcell" . "steve@sanityinc.com") ("Jonas Bernoulli" . "jonas@bernoul.li") ("Phil Hagelberg" . "technomancy@gmail.com")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "maint" "tools") (:url . "https://github.com/melpa/package-build"))]) + (package-build . [(20230407 2350) ((emacs (26 1))) "Tools for assembling a package archive" tar ((:commit . "95b5cc2ae66f946577df8b639213d345c97b67db") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net") ("Steve Purcell" . "steve@sanityinc.com") ("Jonas Bernoulli" . "jonas@bernoul.li") ("Phil Hagelberg" . "technomancy@gmail.com")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "maint" "tools") (:url . "https://github.com/melpa/package-build"))]) (package-filter . [(20161122 719) nil "package archive whitelist and blacklist" single ((:commit . "c8e2531227c02c4c5e9d593f2cdb6a4ab4a6849b") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:url . "https://github.com/milkypostman/package-filter"))]) (package-lint . [(20230315 1052) ((cl-lib (0 5)) (emacs (24 1)) (let-alist (1 0 6))) "A linting library for elisp package authors" tar ((:commit . "78ae823bd89d83299a0d7a52797d2593d03e9795") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "lisp") (:url . "https://github.com/purcell/package-lint"))]) (package-lint-flymake . [(20230315 1052) ((emacs (26 1)) (package-lint (0 5))) "A package-lint Flymake backend" single ((:commit . "78ae823bd89d83299a0d7a52797d2593d03e9795") (:url . "https://github.com/purcell/package-lint"))]) @@ -4175,7 +4175,7 @@ (python-info . [(20151228 1852) nil "Python info manual for Emacs" tar ((:commit . "306f15441b54b25757cdfd3b327b84024ea21ed7"))]) (python-insert-docstring . [(20211127 1232) ((emacs (25 1))) "Python Google docstring inserter" single ((:commit . "cd6419b74c99c06d5c48c1b289572acce1fd193b") (:authors ("Marco Vocialta" . "macurovc@tutanota.com")) (:maintainer "Marco Vocialta" . "macurovc@tutanota.com") (:url . "https://github.com/macurovc/insert-docstring"))]) (python-isort . [(20210603 2153) ((emacs (26)) (reformatter (0 6))) "Reformat python-mode buffer with isort" single ((:commit . "339814df22b87eebca02137e581f65d6283fce97") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "languages") (:url . "https://github.com/wyuenho/emacs-python-isort"))]) - (python-mls . [(20230218 2131) ((emacs (27 1))) "Multi-line shell for (i)Python" single ((:commit . "7d0167ecd71b8a2b9cedc08a490107c36b9ada43") (:authors ("J.D. Smith")) (:maintainer "J.D. Smith") (:keywords "languages" "processes") (:url . "https://github.com/jdtsmith/python-mls"))]) + (python-mls . [(20230407 2139) ((emacs (27 1)) (compat (29 1))) "Multi-line shell for (i)Python" single ((:commit . "0dd0bb1eb8e580093bc35ee5610f894d4464d386") (:authors ("J.D. Smith")) (:maintainer "J.D. Smith") (:keywords "languages" "processes") (:url . "https://github.com/jdtsmith/python-mls"))]) (python-mode . [(20230209 731) nil "Python major mode" tar ((:commit . "d00e9ffe3a7c450362d453e00b4adcb826bce464") (:authors ("2015-2023 https://gitlab.com/groups/python-mode-devs") ("2003-2014 https://launchpad.net/python-mode") ("1995-2002 Barry A. Warsaw") ("1992-1994 Tim Peters")) (:maintainer nil . "python-mode@python.org") (:keywords "python" "languages" "oop") (:url . "https://gitlab.com/groups/python-mode-devs"))]) (python-pytest . [(20221021 1937) ((emacs (24 4)) (dash (2 18 0)) (transient (0 3 7)) (projectile (0 14 0)) (s (1 12 0))) "helpers to run pytest" single ((:commit . "33c921adaa6c9c8f7cceba2342114c6b406e0d7c") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "pytest" "test" "python" "languages" "processes" "tools") (:url . "https://github.com/wbolster/emacs-python-pytest"))]) (python-switch-quotes . [(20161228 809) ((emacs (24 3))) "cycle between ' and \" quotes in python strings" single ((:commit . "93f1e9b40e061a6cea480139e8b1362b6404abd0") (:authors ("Vladimir Lagunov" . "lagunov.vladimir@gmail.com")) (:maintainer "Vladimir Lagunov" . "lagunov.vladimir@gmail.com") (:keywords "python" "tools" "convenience") (:url . "https://github.com/werehuman/python-switch-quotes"))]) @@ -4861,8 +4861,8 @@ (term+ . [(20170509 17) ((emacs (24)) (cl-lib (0 5))) "term-mode enhancement" tar ((:commit . "c3c9239b339c127231860de43abfa08c44c0201a") (:authors ("INA Lintaro ")) (:maintainer "INA Lintaro ") (:keywords "terminal" "emulation") (:url . "https://github.com/tarao/term-plus-el"))]) (term+key-intercept . [(20140211 750) ((term+ (0 1)) (key-intercept (0 1))) "term+ intercept key mapping" single ((:commit . "fd0771fd66b8c7a909aaac972194485c79ba48c4") (:authors ("INA Lintaro ")) (:maintainer "INA Lintaro ") (:keywords "terminal" "emulation") (:url . "http://github.com/tarao/term+-el"))]) (term+mux . [(20140211 749) ((term+ (0 1)) (tab-group (0 1))) "term+ terminal multiplexer and session management" single ((:commit . "81b60e80cf008472bfd7fad9233af2ef722c208a") (:authors ("INA Lintaro ")) (:maintainer "INA Lintaro ") (:keywords "terminal" "emulation") (:url . "http://github.com/tarao/term+-el"))]) - (term-alert . [(20210414 1638) ((emacs (24 0)) (term-cmd (1 1)) (alert (1 1)) (f (0 18 2))) "Notifications when commands complete in term.el." tar ((:commit . "ca1b48ad911bc972b049f48fe0531e702dbc553c") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com") (:keywords "notifications" "processes") (:url . "https://github.com/calliecameron/term-alert"))]) - (term-cmd . [(20210417 1447) ((emacs (27 2)) (dash (2 12 0)) (f (0 18 2))) "Send commands from programs running in term.el." tar ((:commit . "281b9a6d864ca85dc1451dc46baca98f48dc3f60") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com") (:keywords "processes") (:url . "https://github.com/calliecameron/term-cmd"))]) + (term-alert . [(20230407 1715) ((emacs (24 0)) (term-cmd (1 1)) (alert (1 1)) (f (0 18 2))) "Notifications when commands complete in term.el." tar ((:commit . "8e7e744773e41355bcd9f5c911001be08bc79bec") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com") (:keywords "notifications" "processes") (:url . "https://github.com/calliecameron/term-alert"))]) + (term-cmd . [(20230407 1704) ((emacs (27 2)) (dash (2 12 0)) (f (0 18 2))) "Send commands from programs running in term.el." tar ((:commit . "26c5a8cb6b55ac0d6c6bc08f6ea1b1e53f6e2654") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com") (:keywords "processes") (:url . "https://github.com/calliecameron/term-cmd"))]) (term-manager . [(20190610 2032) ((dash (2 12 0)) (emacs (24 4))) "Contextual terminal management" tar ((:commit . "eea7894350a4f31e1df0c666d3fb0bac822d34d2") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "terminals" "tools") (:url . "https://www.github.com/IvanMalison/term-manager"))]) (term-projectile . [(20190307 400) ((emacs (24)) (term-manager (0 1 0)) (projectile (0 13 0))) "projectile terminal management" single ((:commit . "fad6760e66f64661e77e952f06b2fbef1e88e4fe") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "projectile" "tools" "terminals" "vc") (:url . "https://www.github.com/IvanMalison/term-manager"))]) (term-run . [(20200128 702) nil "Run arbitrary command in terminal buffer" single ((:commit . "0fd135d55fcf864598b1fb8dd880833a1a322910") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "utility" "shell" "command" "term-mode") (:url . "https://github.com/10sr/term-run-el"))]) @@ -4892,7 +4892,7 @@ (tfsmacs . [(20180911 2114) ((emacs (25)) (tablist (0 70))) "MS TFS source control interaction." single ((:commit . "13ee3f528ff616880611f563a68d921250692ef8") (:authors ("Dino Chiesa , Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Dino Chiesa , Sebastian Monia" . "smonia@outlook.com") (:keywords "tfs" "vc") (:url . "http://github.com/sebasmonia/tfsmacs/"))]) (the-matrix-theme . [(20230402 1218) ((emacs (26 1))) "Green-on-black dark theme inspired by \"The Matrix\" movie" single ((:commit . "b339285651e088bc51fa2fb51aa319fb70cab9a4") (:authors ("Dan Dee" . "monkeyjunglejuice@pm.me")) (:maintainer "Dan Dee" . "monkeyjunglejuice@pm.me") (:keywords "faces" "theme") (:url . "https://github.com/monkeyjunglejuice/matrix-emacs-theme"))]) (theme-anchor . [(20220204 321) ((emacs (26))) "Apply theme in current buffer only" single ((:commit . "c6f715d4ccd30e83922e39cab856578ce19224bb") (:authors ("Liāu, Kiong-Gē" . "gliao.tw@pm.me")) (:maintainer "Liāu, Kiong-Gē" . "gliao.tw@pm.me") (:keywords "extensions" "lisp" "theme") (:url . "https://github.com/GongYiLiao/theme-anchor"))]) - (theme-changer . [(20230405 156) ((cl-lib (0))) "Sunrise/Sunset Theme Changer for Emacs" single ((:commit . "e7a97772b22a82c70f2bd34e205d11b0b8a1e972") (:authors ("Joshua B. Griffith" . "josh.griffith@gmail.com")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset") (:url . "https://github.com/hadronzoo/theme-changer"))]) + (theme-changer . [(20230407 1357) ((cl-lib (0))) "Sunrise/Sunset Theme Changer for Emacs" single ((:commit . "1d61ae0c2b44964718ec3832915735c8556083a6") (:authors ("Joshua B. Griffith" . "josh.griffith@gmail.com")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset") (:url . "https://github.com/hadronzoo/theme-changer"))]) (theme-looper . [(20210827 424) ((emacs (24)) (cl-lib (0 5))) "A package for switching themes in Emacs interactively" single ((:commit . "e6e8efd740df0b68db89805ba72492818dba61ab") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:keywords "convenience" "color-themes") (:url . "http://ismail.teamfluxion.com"))]) (theme-magic . [(20190711 2034) ((emacs (25)) (seq (1 8))) "Apply your Emacs theme to the rest of Linux" tar ((:commit . "844c4311bd26ebafd4b6a1d72ddcc65d87f074e3") (:authors ("GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com")) (:maintainer "GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com") (:keywords "unix" "faces" "terminals" "extensions") (:url . "https://github.com/jcaw/theme-magic.el"))]) (therapy . [(20151113 1953) ((emacs (24))) "Hooks for managing multiple Python major versions" single ((:commit . "775a92bb7b6b0fcc5b38c0b5198a9d0a1bef788a") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/therapy"))]) @@ -4978,7 +4978,7 @@ (trashed . [(20220106 1358) ((emacs (25 1))) "Viewing/editing system trash can" single ((:commit . "ddf5830730544435a068f2dc9ac75a81ea69df1d") (:authors ("Shingo Tanaka" . "shingo.fg8@gmail.com")) (:maintainer "Shingo Tanaka" . "shingo.fg8@gmail.com") (:keywords "files" "convenience" "unix") (:url . "https://github.com/shingo256/trashed"))]) (travis . [(20150825 1138) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client for Travis" tar ((:commit . "c8769d3db10ed4604969049e3bd276afa0a0138e") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "travis") (:url . "https://github.com/nlamirault/emacs-travis"))]) (tray . [(20230212 2011) ((emacs (27 1)) (compat (29 1 3 4)) (transient (0 3 0))) "Various transient menus" single ((:commit . "15b0faa8fede31887598b8dd64b69362c10e8a8e") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://git.sr.ht/~tarsius/tray"))]) - (tree-edit . [(20220407 1629) ((emacs (27 1)) (tree-sitter (0 15 0)) (tsc (0 15 0)) (tree-sitter-langs (0 10 0)) (dash (2 19)) (reazon (0 4 0)) (s (0 0 0))) "A library for structural refactoring and editing" tar ((:commit . "774a1e9598617f334fcd31aa606c5e738012fb60") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) + (tree-edit . [(20230407 2105) ((emacs (29 0)) (dash (2 19)) (reazon (0 4 0)) (s (0 0 0))) "A library for structural refactoring and editing" tar ((:commit . "86aef84896d67bcc61923663f799ab8dba05d108") (:authors ("Ethan Leba" . "ethanleba5@gmail.com")) (:maintainer "Ethan Leba" . "ethanleba5@gmail.com") (:url . "https://github.com/ethan-leba/tree-edit"))]) (tree-mode . [(20151104 1331) nil "A mode to manage tree widgets" single ((:commit . "b06078826d5875d74b0e7b7ac47b0d0917610534") (:authors (nil . "wenbinye@163.com")) (:maintainer nil . "wenbinye@163.com") (:keywords "help" "convenience" "widget"))]) (tree-sitter . [(20220212 1632) ((emacs (25 1)) (tsc (0 18 0))) "Incremental parsing system" tar ((:commit . "909717c685ff5a2327fa2ca8fb8a25216129361c") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:keywords "languages" "tools" "parsers" "tree-sitter") (:url . "https://github.com/emacs-tree-sitter/elisp-tree-sitter"))]) (tree-sitter-ess-r . [(20221012 855) ((emacs (26 1)) (ess (18 10 1)) (tree-sitter (0 12 1)) (tree-sitter-langs (0 12 0))) "R with tree-sitter" single ((:commit . "9669c00f3d3463e6769725af74c392891e269eed") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/tree-sitter-ess-r"))]) @@ -4986,15 +4986,15 @@ (tree-sitter-ispell . [(20230205 533) ((emacs (26 1)) (tree-sitter (0 15 0))) "Run ispell on tree-sitter text nodes" single ((:commit . "d8c33c05f689c2cab36b8a9856811f18a4ab7c59") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/tree-sitter-ispell.el"))]) (tree-sitter-langs . [(20230311 1456) ((emacs (25 1)) (tree-sitter (0 15 0))) "Grammar bundle for tree-sitter" tar ((:commit . "ffe9ab0c8ec9e37e70e31d296df3b85bcfc73c5e") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:keywords "languages" "tools" "parsers" "tree-sitter") (:url . "https://github.com/emacs-tree-sitter/tree-sitter-langs"))]) (treefactor . [(20200516 1631) ((emacs (26 1)) (dash (2 16 0)) (f (0 20 0)) (org (9 2 6)) (avy (0 5 0))) "Restructure your messy Org documents" single ((:commit . "75357757022a4399ab772ff0d92065bd114dabe9") (:authors ("Leo Littlebook" . "Leo.Littlebook@gmail.com")) (:maintainer "Leo Littlebook" . "Leo.Littlebook@gmail.com") (:keywords "outlines" "files" "convenience") (:url . "https://github.com/cyberthal/treefactor"))]) - (treemacs . [(20230323 629) ((emacs (26 1)) (cl-lib (0 5)) (dash (2 11 0)) (s (1 12 0)) (ace-window (0 9 0)) (pfuture (1 7)) (hydra (0 13 2)) (ht (2 2)) (cfrs (1 3 2))) "A tree style file explorer package" tar ((:commit . "a20d49ed62fa64a4164a9a3f25c102ec0a338367") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-all-the-icons . [(20220911 1427) ((emacs (26 1)) (all-the-icons (4 0 1)) (treemacs (0 0))) "all-the-icons integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-evil . [(20220911 1427) ((emacs (26 1)) (evil (1 2 12)) (treemacs (0 0))) "Evil mode integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-icons-dired . [(20220915 1626) ((treemacs (0 0)) (emacs (26 1))) "Treemacs icons for dired" single ((:commit . "1961981c81122b22ea70962f45c01feeb54c3800") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-magit . [(20220917 1026) ((emacs (26 1)) (treemacs (0 0)) (pfuture (1 3)) (magit (2 90 0))) "Magit integration for treemacs" single ((:commit . "13a8a060b784021f3d6bd7c27f2a0bcf6ea0d087") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-persp . [(20220911 1427) ((emacs (26 1)) (treemacs (0 0)) (persp-mode (2 9 7)) (dash (2 11 0))) "Persp-mode integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-perspective . [(20220911 1427) ((emacs (26 1)) (treemacs (0 0)) (perspective (2 8)) (dash (2 11 0))) "Perspective integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-projectile . [(20220911 1427) ((emacs (26 1)) (projectile (0 14 0)) (treemacs (0 0))) "Projectile integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-tab-bar . [(20220911 1427) ((emacs (27 1)) (treemacs (0 0)) (dash (2 11 0))) "Tab bar integration for treemacs" single ((:commit . "861418d9d11b205930bd4555a40b430b9dde9dd4") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org") ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs . [(20230408 1109) ((emacs (26 1)) (cl-lib (0 5)) (dash (2 11 0)) (s (1 12 0)) (ace-window (0 9 0)) (pfuture (1 7)) (hydra (0 13 2)) (ht (2 2)) (cfrs (1 3 2))) "A tree style file explorer package" tar ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-all-the-icons . [(20230408 1109) ((emacs (26 1)) (all-the-icons (4 0 1)) (treemacs (0 0))) "all-the-icons integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-evil . [(20230408 1109) ((emacs (26 1)) (evil (1 2 12)) (treemacs (0 0))) "Evil mode integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-icons-dired . [(20230408 1109) ((treemacs (0 0)) (emacs (26 1))) "Treemacs icons for dired" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-magit . [(20230408 1109) ((emacs (26 1)) (treemacs (0 0)) (pfuture (1 3)) (magit (2 90 0))) "Magit integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-persp . [(20230408 1109) ((emacs (26 1)) (treemacs (0 0)) (persp-mode (2 9 7)) (dash (2 11 0))) "Persp-mode integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-perspective . [(20230408 1109) ((emacs (26 1)) (treemacs (0 0)) (perspective (2 8)) (dash (2 11 0))) "Perspective integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-projectile . [(20230408 1109) ((emacs (26 1)) (projectile (0 14 0)) (treemacs (0 0))) "Projectile integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-tab-bar . [(20230408 1109) ((emacs (27 1)) (treemacs (0 0)) (dash (2 11 0))) "Tab bar integration for treemacs" single ((:commit . "127485317a19254ca20ba1910d10edf7dbaa2d97") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org") ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) (treepy . [(20221205 2224) ((emacs (25 1))) "Generic tree traversal tools" single ((:commit . "7c4a0d21322506a4d4b2301b4274ec955b429b47") (:authors ("Daniel Barreto" . "daniel.barreto.n@gmail.com")) (:maintainer "Daniel Barreto" . "daniel.barreto.n@gmail.com") (:keywords "lisp" "maint" "tools") (:url . "https://github.com/volrath/treepy.el"))]) (treesit-auto . [(20230320 1555) ((emacs (29 0))) "Automatically use tree-sitter enhanced major modes" single ((:commit . "bac3b9d1d61a4d759f87c80de7be3b808d19cbf6") (:authors ("Robb Enzmann" . "robbenzmann@gmail.com")) (:maintainer "Robb Enzmann" . "robbenzmann@gmail.com") (:keywords "treesitter" "auto" "automatic" "major" "mode" "fallback" "convenience") (:url . "https://github.com/renzmann/treesit-auto.git"))]) (treeview . [(20220928 43) ((emacs (24 4))) "A generic tree navigation library" single ((:commit . "d9c10feddf3b959e7b33ce83103e1f0a61162723") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com") (:keywords "lisp" "tools" "internal" "convenience") (:url . "https://github.com/tilmanrassy/emacs-treeview"))]) @@ -5110,7 +5110,7 @@ (vc-hgcmd . [(20211021 1704) ((emacs (25 1))) "VC mercurial backend that uses hg command server" single ((:commit . "d044448965d31ca8214f8bca48487e4d9b9d9a0f") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "vc") (:url . "https://github.com/muffinmad/emacs-vc-hgcmd"))]) (vc-msg . [(20221005 1228) ((emacs (24 4)) (popup (0 5 0))) "Show commit information of current line" tar ((:commit . "027fefad63868cd7695372510c27922656cf996a") (:authors ("Chen Bin ")) (:maintainer "Chen Bin ") (:keywords "git" "vc" "svn" "hg" "messenger") (:url . "http://github.com/redguardtoo/vc-msg"))]) (vc-osc . [(20190402 2349) nil "non-resident support for osc version-control" single ((:commit . "bf5a515ed85f7d7cdfe66ed5bf4ef7554f8561e5") (:authors ("Adam Spiers (see vc.el for full credits)")) (:maintainer "Adam Spiers" . "aspiers@suse.com"))]) - (vcomp . [(20230406 1934) ((emacs (24 1))) "Compare version strings" single ((:commit . "5e5af87d20f7a7727198c9cb064b39e9fd2c8c08") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "versions") (:url . "https://github.com/tarsius/vcomp"))]) + (vcomp . [(20230407 1426) ((emacs (24 1))) "Compare version strings" single ((:commit . "fdd010e9081d62aa6aaa1b25a2df925efd662d0c") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "versions") (:url . "https://github.com/tarsius/vcomp"))]) (vcsh . [(20230402 1229) ((emacs (25 1))) "vcsh integration" single ((:commit . "b9c0109a8c77446980de668785e6af1e46bdcdcd") (:authors ("Štěpán Němec" . "stepnem@smrk.net")) (:maintainer "Štěpán Němec" . "stepnem@smrk.net") (:keywords "vc" "files") (:url . "http://git.smrk.net/vcsh.el"))]) (vdf-mode . [(20210303 714) ((emacs (24 3))) "Major mode for editing Valve VDF files." single ((:commit . "0910d4f847e9c817eb8da5434b3879048ec4ac92") (:authors ("Philipp Middendorf")) (:maintainer "Philipp Middendorf") (:url . "https://github.com/plapadoo/vdf-mode"))]) (vdiff . [(20220830 1450) ((emacs (24 4)) (hydra (0 13 0))) "A diff tool similar to vimdiff" single ((:commit . "d5df45f84395f507aba555a54407b60e284b23cd") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:keywords "diff") (:url . "https://github.com/justbur/emacs-vdiff"))]) @@ -5422,4 +5422,4 @@ (ztree . [(20210415 1947) ((cl-lib (0))) "Text mode directory tree" tar ((:commit . "f05677f9696e573c8c607e8876fb4a0cccbc491f") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:keywords "files" "tools") (:url . "https://github.com/fourier/ztree"))]) (zweilight-theme . [(20170113 605) nil "A dark color theme for Emacs." single ((:commit . "890f27c939d8a358c9ef0f402fc3314f475ec874") (:authors ("Philip Arvidsson" . "contact@philiparvidsson.com")) (:maintainer "Philip Arvidsson" . "contact@philiparvidsson.com") (:url . "http://github.com/philiparvidsson/zweilight-emacs"))]) (zygospore . [(20140703 852) nil "reversible C-x 1 (delete-other-windows)" single ((:commit . "1af5ee663f5a7aa08d96a77cacff834dcdf55ea8") (:authors ("Louis Kottmann" . "louis.kottmann@gmail.com")) (:maintainer "Louis Kottmann" . "louis.kottmann@gmail.com") (:url . "https://github.com/louiskottmann/zygospore.el"))]) - (zzz-to-char . [(20210321 1707) ((emacs (24 4)) (cl-lib (0 5)) (avy (0 3 0))) "Fancy version of `zap-to-char' command" single ((:commit . "18d26571b91a9c56b6a7e0d2a58188e833ab5d0f") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience") (:url . "https://github.com/mrkkrp/zzz-to-char"))])) \ No newline at end of file + (zzz-to-char . [(20210321 1707) ((emacs (24 4)) (cl-lib (0 5)) (avy (0 3 0))) "Fancy version of `zap-to-char' command" single ((:commit . "18d26571b91a9c56b6a7e0d2a58188e833ab5d0f") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience") (:url . "https://github.com/mrkkrp/zzz-to-char"))])) diff --git a/org/elpa/persp-mode-20230110.1045/persp-mode-autoloads.el b/org/elpa/persp-mode-20230110.1045/persp-mode-autoloads.el new file mode 100644 index 0000000..b375c0c --- /dev/null +++ b/org/elpa/persp-mode-20230110.1045/persp-mode-autoloads.el @@ -0,0 +1,69 @@ +;;; persp-mode-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 "persp-mode" "persp-mode.el" (0 0 0 0)) +;;; Generated autoloads from persp-mode.el + +(autoload 'persp-def-auto-persp "persp-mode" "\ + + +\(fn NAME &rest KEYARGS &key BUFFER-NAME FILE-NAME MODE MODE-NAME MINOR-MODE MINOR-MODE-NAME PREDICATE HOOKS DYN-ENV GET-NAME GET-BUFFER GET-PERSP SWITCH PARAMETERS NOAUTO WEAK USER-DATA ON-MATCH AFTER-MATCH DONT-PICK-UP-BUFFERS DELETE)" nil nil) + +(define-obsolete-function-alias 'def-auto-persp 'persp-def-auto-persp "persp-mode 2.9.6") + +(autoload 'persp-def-buffer-save/load "persp-mode" "\ + + +\(fn &rest KEYARGS &key BUFFER-NAME FILE-NAME MODE MODE-NAME MINOR-MODE MINOR-MODE-NAME PREDICATE TAG-SYMBOL SAVE-VARS SAVE-FUNCTION LOAD-FUNCTION AFTER-LOAD-FUNCTION MODE-RESTORE-FUNCTION APPEND)" nil nil) + +(define-obsolete-function-alias 'def-persp-buffer-save/load 'persp-def-buffer-save/load "persp-mode 2.9.6") + +(defvar persp-mode nil "\ +Non-nil if Persp mode is enabled. +See the `persp-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 `persp-mode'.") + +(custom-autoload 'persp-mode "persp-mode" nil) + +(autoload 'persp-mode "persp-mode" "\ +Toggle the persp-mode. +When active, keeps track of multiple 'perspectives', +named collections of buffers and window configurations. +Here is a keymap of this minor mode: +\\{persp-mode-map} + +This is a minor mode. If called interactively, toggle the `Persp +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 `(default-value \\='persp-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 "persp-mode" '("*persp-" "clear-window-persp" "def-" "get-" "ido-toggle-persp-filter" "persp" "safe-persp-" "set-" "window-persp-set-p" "with-persp-ido-hooks")) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; persp-mode-autoloads.el ends here diff --git a/org/elpa/persp-mode-20230110.1045/persp-mode-pkg.el b/org/elpa/persp-mode-20230110.1045/persp-mode-pkg.el new file mode 100644 index 0000000..7e7a19d --- /dev/null +++ b/org/elpa/persp-mode-20230110.1045/persp-mode-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from persp-mode.el -*- no-byte-compile: t -*- +(define-package "persp-mode" "20230110.1045" "windows/buffers sets shared among frames + save/load." '((emacs "24.3")) :commit "df95ea710e2a72f7a88293b72137acb0ca024d90" :authors '(("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) :maintainer '("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com") :keywords '("perspectives" "session" "workspace" "persistence" "windows" "buffers" "convenience") :url "https://github.com/Bad-ptr/persp-mode.el") diff --git a/org/elpa/persp-mode-20230110.1045/persp-mode.el b/org/elpa/persp-mode-20230110.1045/persp-mode.el new file mode 100644 index 0000000..73f0900 --- /dev/null +++ b/org/elpa/persp-mode-20230110.1045/persp-mode.el @@ -0,0 +1,4175 @@ +;;; persp-mode.el --- windows/buffers sets shared among frames + save/load. -*- lexical-binding: t; -*- + +;; Copyright (C) 2012 Constantin Kulikov + +;; Author: Constantin Kulikov (Bad_ptr) +;; Version: 3.0.7 +;; Package-Version: 20230110.1045 +;; Package-Commit: df95ea710e2a72f7a88293b72137acb0ca024d90 +;; Package-Requires: ((emacs "24.3")) +;; Keywords: perspectives, session, workspace, persistence, windows, buffers, convenience +;; URL: https://github.com/Bad-ptr/persp-mode.el + +;;; License: + +;; This file is not part of GNU Emacs. + +;; 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 2, 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, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;; Based on the perspective.el by Natalie Weizenbaum +;; (http://github.com/nex3/perspective-el) but the perspectives are shared +;; among the frames and could be saved/restored from/to a file. +;; +;; Homepage: https://github.com/Bad-ptr/persp-mode.el + +;; Installation: + +;; From the MELPA: M-x package-install RET persp-mode RET +;; From a file: M-x package-install-file RET 'path to this file' RET +;; Or put this file into your load-path. + +;; Configuration: + +;; When installed through the package-install: +;; (with-eval-after-load "persp-mode-autoloads" +;; (setq wg-morph-on nil) +;; ;; switch off the animation of restoring window configuration +;; (setq persp-autokill-buffer-on-remove 'kill-weak) +;; (add-hook 'after-init-hook #'(lambda () (persp-mode 1)))) + +;; When installed without generating an autoloads file: +;; (with-eval-after-load "persp-mode" +;; ;; .. all settings you want here +;; (add-hook 'after-init-hook #'(lambda () (persp-mode 1)))) +;; (require 'persp-mode) + +;; Dependencies: + +;; The ability to save/restore window configurations from/to a file +;; depends on the workgroups.el(https://github.com/tlh/workgroups.el) +;; for the emacs versions < 24.4 + +;; Customization: + +;; M-x: customize-group RET persp-mode RET + +;; You can read more in README.md + + +;;; Code: + + +;; Prerequirements: + +(require 'cl-lib) +(require 'easymenu) + +(declare-function golden-ratio-mode "ext:golden-ratio") +(declare-function tabbar-buffer-list "ext:tabbar-mode") + +(declare-function tramp-dissect-file-name "tramp") +(declare-function tramp-file-name-hop "tramp") +(declare-function tramp-file-name-host "tramp") +(declare-function tramp-file-name-localname "tramp") +(declare-function tramp-file-name-method "tramp") +(declare-function tramp-file-name-user "tramp") +(declare-function tramp-tramp-file-p "tramp") + +(defvar ido-cur-item) +(defvar ido-exit) +(defvar ido-temp-list) +(defvar ido-text) +(defvar ido-text-init) +(defvar tabbar-buffer-list-function) + +(defvar persp-mode nil) + +(defconst persp-not-persp :nil + "Something that is not a perspective.") + +(unless (fboundp 'condition-case-unless-debug) + (defalias 'condition-case-unless-debug 'condition-case-no-debug)) +(unless (fboundp 'read-multiple-choice) + (defun read-multiple-choice (prompt choices) + (let ((choice-chars (mapcar #'car choices))) + (when choice-chars + (assq (read-char-choice + (format "%s(%s): " + (substring prompt 0 (string-match ": $" prompt)) + (mapconcat #'(lambda (ch) + (format "[%c] - %s" (car ch) (cadr ch))) + choices "; ")) + choice-chars) + choices))))) +(unless (fboundp 'alist-get) + (defun alist-get (key alist &optional default remove) + (ignore remove) ;;Silence byte-compiler. + (let ((x (assq key alist))) + (if x (cdr x) default)))) + + +;; Customization variables: + +(unless + (memq 'custom-group (symbol-plist 'session)) + (defgroup session nil + "Emacs' state(opened files, buffers, windows, etc.)" + :group 'environment)) + +(defgroup persp-mode nil + "Customization of the `persp-mode'." + :prefix "persp-" + :group 'session + :link '(url-link + :tag "Github page" "https://github.com/Bad-ptr/persp-mode.el")) + +(defcustom persp-nil-name "none" + "Name for the nil perspective." + :group 'persp-mode + :type 'string + :set #'(lambda (sym val) + (when val + (when persp-mode + (cl-destructuring-bind (frames . windows) + (persp-frames-and-windows-with-persp + (persp-get-by-name persp-nil-name *persp-hash* nil)) + (dolist (win windows) + (when (equal persp-nil-name (get-window-persp* win)) + (set-window-persp* win val)))) + (run-hook-with-args + 'persp-renamed-functions nil persp-nil-name val)) + (custom-set-default sym val)))) + +(defface persp-face-lighter-buffer-not-in-persp + '((default . (:background "#F00" :foreground "#00F" :weight bold))) + "Face for the lighter when the current buffer is not in a perspective." + :group 'persp-mode) +(defface persp-face-lighter-nil-persp + '((t :inherit bold-italic)) + "Face for the lighter when the current perspective is nil." + :group 'persp-mode) +(defface persp-face-lighter-default + '((t :inherit italic)) + "Default face for the lighter.") + +(defcustom persp-lighter + '(:eval + (format + (propertize + " #%.5s" + 'face (let ((persp (get-current-persp))) + (if persp + (if (persp-contain-buffer-p (current-buffer) persp) + 'persp-face-lighter-default + 'persp-face-lighter-buffer-not-in-persp) + 'persp-face-lighter-nil-persp))) + (safe-persp-name (get-current-persp)))) + "Defines how the persp-mode show itself in the modeline." + :group 'persp-mode + :type 'sexp) + +(defcustom persp-save-dir (expand-file-name "persp-confs/" user-emacs-directory) + "The directory to/from where perspectives saved/loaded by default. +Autosave files are saved and loaded to/from this directory." + :group 'persp-mode + :type 'directory) + +(defcustom persp-auto-save-fname "persp-auto-save" + "Name of the file for auto save/load perspectives on the persp-mode +deactivation or the emacs shutdown." + :group 'persp-mode + :type 'string) + +(defcustom persp-auto-save-persps-to-their-file t + "If t -- then a perspective will be autosaved to a file specified +in the `persp-file' perspective parameter." + :group 'persp-mode + :type 'boolean) + +(defcustom persp-auto-save-persps-to-their-file-before-kill nil + "Whether or not perspectives will be saved before killed." + :group 'persp-mode + :type '(choice + (const :tag "Save perspectives which have `persp-file' parameter" + :value persp-file) + (const :tag "Save all perspectives" :value t) + (const :tag "Don't save just kill" :value nil))) + +(defcustom persp-auto-save-opt 2 + "This variable controls the autosave functionality of the persp-mode: +0 -- do not auto save; +1 -- save on the emacs shutdown and only if the persp-mode active; +2 -- save on the persp-mode deactivation or the emacs shutdown." + :group 'persp-mode + :type '(choice + (const :tag "Do not save" :value 0) + (const :tag "Save on exit" :value 1) + (const :tag "Save on exit and persp-mode deactivation" :value 2))) + +(defcustom persp-auto-save-num-of-backups 3 + "How many autosave file backups to keep." + :group 'persp-mode + :type 'integer) + +(defcustom persp-auto-resume-time 3.0 + "Delay time in seconds before loading from the autosave file. +If <= 0 -- do not autoresume." + :group 'persp-mode + :type 'float) + +(defcustom persp-set-last-persp-for-new-frames t + "If nil new frames will be created with the 'nil' perspective, +otherwise with a last activated perspective." + :group 'persp-mode + :type 'boolean) + +(defcustom persp-reset-windows-on-nil-window-conf t + "t -- When a perspective without a window configuration is activated +then delete all windows and show the *scratch* buffer; +function -- run that function; +nil -- do nothing." + :group 'persp-mode + :type '(choice + (const :tag "Delete all windows" :value t) + (const :tag "Do nothing" :value nil) + (function :tag "Run function" :value (lambda () nil)))) + + +(define-widget 'persp-buffer-list-restriction-choices 'lazy + "Variants of how the buffer-list can be restricted." + :offset 4 + :tag "\nControl the persp-buffer-list-restricted behaviour" + :type '(choice + (const :tag "List all buffers" :value -1) + (const :tag "List current perspective buffers" :value 0) + (const :tag "List buffers that aren't in the perspective" :value 1) + (const :tag "List buffers which unique to the perspective" :value 2) + (const :tag "List unique buffers, but show all for the nil perspective" + :value 2.5) + (const :tag "List free buffers" :value 3) + (const :tag "List free buffers, but show all for the nil perspective" + :value 3.5))) + +(defcustom *persp-restrict-buffers-to* 0 + "Controls the behaviour of the `persp-buffer-list-restricted' function." + :group 'persp-mode + :type '(choice + persp-buffer-list-restriction-choices + (function :tag "\nRun function with frame as an argument" + :value (lambda (f) (buffer-list f))))) + +(defcustom persp-restrict-buffers-to-if-foreign-buffer nil + "Override the *persp-restrict-buffers-to* if the current buffer is not in the +current perspective. If nil -- do not override." + :group 'persp-mode + :type '(choice + (const :tag "Do not override" :value nil) + persp-buffer-list-restriction-choices + (function :tag "\nRun function with frame as an argument" + :value (lambda (f) (buffer-list f))))) + +(defcustom persp-set-frame-buffer-predicate 'restricted-buffer-list + "t -- set the frame's buffer-predicate parameter to a function returning `t' + for buffers in current persp; +nil -- do not set the buffer-predicate; +restricted-buffer-list -- return t for buffers contained in the list returned + from the persp-buffer-list-restricted called without arguments; +number -- the same meaning as for the `*persp-restrict-buffers-to*'; +function -- use that function as buffer-predicate." + :group 'persp-mode + :type '(choice + (const :tag "\nConstrain to current perspective's buffers." + :value t) + (const :tag "\nDo not set frames' buffer-predicate parameter." + :value nil) + (const :tag "\nConstrain with persp-buffer-list-restricted." + :value restricted-buffer-list) + persp-buffer-list-restriction-choices + (function + :tag "\nConstrain with a function which take buffer as an argument." + :value (lambda (b) b))) + :set + #'(lambda (sym val) + (custom-set-default sym val) + (if val + (if persp-mode + (persp-update-frames-buffer-predicate) + (if (and (not (daemonp)) (null (cdr (frame-list)))) + (let (th) + (setq + th #'(lambda () + (run-at-time + 10 nil #'(lambda () + (remove-hook 'window-setup-hook th) + (persp-update-frames-buffer-predicate))))) + (add-hook 'window-setup-hook th)) + (add-hook 'persp-mode-hook + #'persp-update-frames-buffer-predicate))) + (persp-update-frames-buffer-predicate t)))) + +;; TODO: remove this var +(defcustom persp-hook-up-emacs-buffer-completion nil + "If t -- try to restrict read-buffer function of the current completion system." + :group 'persp-mode + :type 'boolean) +(make-obsolete-variable + 'persp-hook-up-emacs-buffer-completion + "`persp-set-read-buffer-function', `persp-set-ido-hooks', `persp-interactive-completion-function'" + "persp-mode 2.6") + +(defsubst persp-set-read-buffer-function (&optional opt) + (if opt + (when (not (eq read-buffer-function #'persp-read-buffer)) + (setq persp-saved-read-buffer-function read-buffer-function) + (setq read-buffer-function #'persp-read-buffer)) + (when (eq read-buffer-function #'persp-read-buffer) + (setq read-buffer-function persp-saved-read-buffer-function)))) +(defcustom persp-set-read-buffer-function nil + "If t -- set the read-buffer-function to persp-read-buffer." + :group 'persp-mode + :type 'boolean + :set #'(lambda (sym val) + (custom-set-default sym val) + (when persp-mode + (persp-set-read-buffer-function val)))) + +(defsubst persp-set-ido-hooks (&optional opt) + (if opt + (progn + (add-hook 'ido-make-buffer-list-hook #'persp-restrict-ido-buffers) + (add-hook 'ido-setup-hook #'persp-ido-setup)) + (remove-hook 'ido-make-buffer-list-hook #'persp-restrict-ido-buffers) + (remove-hook 'ido-setup-hook #'persp-ido-setup))) +(defcustom persp-set-ido-hooks nil + "If t -- set the ido hooks for buffer list restriction." + :group 'persp-mode + :type 'boolean + :set #'(lambda (sym val) + (custom-set-default sym val) + (when persp-mode + (persp-set-ido-hooks val)))) + +;; TODO: remove this var, just call the completing-read +(defvar persp-interactive-completion-function #'completing-read + "The function which is used by the persp-mode +to interactivly read user input with completion.") +(make-obsolete-variable + 'persp-interactive-completion-function + "`completing-read-function'" "persp-mode 2.7") + +(defun persp-update-completion-system (&optional system remove) + (interactive "i") + (when (and (not system) (not remove)) + (setq + system + (intern + (funcall persp-interactive-completion-function + "Set the completion system for persp-mode: " + '("ido" "completing-read") + nil t)))) + (if remove + (progn + (when (boundp 'persp-interactive-completion-system) + (when persp-hook-up-emacs-buffer-completion + (cl-case persp-interactive-completion-system + (ido (persp-set-ido-hooks)) + (t nil)))) + (setq persp-interactive-completion-function #'completing-read) + (custom-set-default 'persp-interactive-completion-system + 'completing-read)) + (persp-update-completion-system nil t) + (when system + (custom-set-default 'persp-interactive-completion-system system) + (when persp-hook-up-emacs-buffer-completion + (cl-case persp-interactive-completion-system + (ido + (persp-set-ido-hooks t) + (setq persp-interactive-completion-function #'ido-completing-read)) + (t nil)) + (persp-set-toggle-read-buffer-filter-keys + persp-toggle-read-buffer-filter-keys))))) + +;; TODO: remove this var +(defcustom persp-interactive-completion-system 'completing-read + "What completion system to use." + :group 'persp-mode + :type '(choice + (const :tag "ido" :value ido) + (const :tag "completing-read" :value completing-read)) + :set #'(lambda (sym val) + (if persp-mode + (persp-update-completion-system val) + (custom-set-default sym val)))) +(make-obsolete-variable + 'persp-interactive-completion-system + "`persp-set-read-buffer-function', `persp-set-ido-hooks', `persp-interactive-completion-function'" + "persp-mode 2.6") + +(define-widget 'persp-init-frame-behaviour-choices 'lazy + "Choices of the init-frame behavoiurs for the persp-mode." + :offset 4 + :tag "\nControl how frames initialized by persp-mode" + :type + '(choice + (const :tag "Restore window-configuration" :value t) + (const :tag "Do not restore window-configuration" :value nil) + (const :tag "Set persp-ignore-wconf flag for frame" + :value persp-ignore-wconf) + (const :tag "Set persp-ignore-wconf-once flag for frame" + :value persp-ignore-wconf-once) + (const :tag "Create a new random auto-perspective for the new frame" + :value auto-temp) + (const + :tag "Create a new perspective for the new frame and prompt for it's name" + :value prompt) + (string :tag "Use/create the perspective with a name" :value "pfnf") + (function :tag "Run this function" + :value (lambda (frame &optional new-frame-p) nil)))) + +(defcustom persp-init-frame-behaviour t + "Control the behaviour of how frames initialized." + :group 'persp-mode + :type 'persp-init-frame-behaviour-choices) + +(defcustom persp-init-new-frame-behaviour-override -1 + "Override the `persp-init-frame-behaviour` for new frames." + :group 'persp-mode + :type '(choice + (const :tag "Do not override" : value -1) + persp-init-frame-behaviour-choices)) + +(defcustom persp-interactive-init-frame-behaviour-override -1 + "Override the `persp-init-frame-behaviour' +when the `make-frame' was called interactively." + :group 'persp-mode + :type '(choice + (const :tag "Do not override" :value -1) + persp-init-frame-behaviour-choices)) + +(defcustom persp-emacsclient-init-frame-behaviour-override -1 + "Override the `persp-init-frame-behaviour' variable for frames created using +the emacsclient -[c|t]." + :group 'persp-mode + :type '(choice + (const :tag "Do not override" :value -1) + persp-init-frame-behaviour-choices)) + +(defcustom persp-server-switch-behaviour 'only-file-windows-for-client-frame + "Controls the behaviour of the server-switch-hook." + :group 'persp-mode + :type + '(choice + (const :tag "Do nothing" :value nil) + (const :tag "Leave only windows displaing files for edit +(files that was supplied as parameters to emacsclient)" + :value only-file-windows) + (const :tag "For the new frame(created by emacsclient -c ...) +leave only windows displaing files for edit" + :value only-file-windows-for-client-frame) + (function :tag "Run this function" :value (lambda (frame buflist) nil))) + :set + #'(lambda (sym val) + (custom-set-default sym val) + (if persp-mode + (persp-update-frame-server-switch-hook) + (add-hook 'persp-mode-hook #'persp-update-frame-server-switch-hook)))) + +;; TODO: remove this var +(defcustom persp-ignore-wconf-of-frames-created-to-edit-file t + "If t -- set the persp-ignore-wconf frame parameter +to t for frames that were created by emacsclient with file arguments. +Also delete windows not showing that files +(this is because server-switch-hook runs after after-make-frames); +If function -- run that function." + :group 'persp-mode + :type '(choice + (const :tag "Ignore window configuration" :value t) + (const :tag "Do as usual" :value nil) + (function :tag "Run function" :value (lambda () nil)))) +(make-obsolete-variable + 'persp-ignore-wconf-of-frames-created-to-edit-file + "`persp-emacsclient-frame-to-edit-file-behavoiur'" "persp-mode 2.0") + +(defcustom persp-add-buffer-on-find-file t + "If t -- add a buffer with opened file to current perspective." + :group 'persp-mode + :type + '(choice + (const :tag "Always add" :value t) + (const :tag "Newer add" :value nil) + (const + :tag "\nAdd if not matching any predicate from `persp-auto-persp-alist'" + :value if-not-autopersp) + (const :tag "\nAlways add but do not switch if the buffer matches any \ +predicate from `persp-auto-persp-alist'" + :value add-but-not-switch-if-autopersp))) + + +(defcustom persp-add-buffer-on-after-change-major-mode nil + "t -- add the current buffer to the current perspective when +the `after-change-major-mode-hook' fires; +nil -- do not add; +'free -- add only _free_ buffers; +function -- run that function." + :group 'persp-mode + :type '(choice + (const :tag "Always add" :value t) + (const :tag "Don't add" :value nil) + (const :tag "\nAdd if the buffer is not already in any other persp" + :value free) + (function :tag "Run this function" :value (lambda () nil))) + :set + #'(lambda (sym val) + (custom-set-default sym val) + (when persp-mode + (if val + (add-hook 'after-change-major-mode-hook + #'persp-after-change-major-mode-h t) + (remove-hook 'after-change-major-mode-hook + #'persp-after-change-major-mode-h))))) + +(defcustom persp-switch-to-added-buffer t + "If t then after you add a buffer to the current perspective +the currently selected window will be switched to that buffer." + :group 'persp-mode + :type 'boolean) + +(define-obsolete-variable-alias + 'persp-when-kill-switch-to-buffer-in-perspective + 'persp-when-remove-buffer-switch-to-other-buffer + "persp-mode 2.9.7") +(defcustom persp-when-remove-buffer-switch-to-other-buffer t + "If t -- then after a buffer is removed all windows of the current +perspective which showing that buffer will be switched to some previous buffer +in the current perspective." + :group 'persp-mode + :type 'boolean) + +(defcustom persp-remove-buffers-from-nil-persp-behaviour 'ask-to-rem-from-all + "What to do when removing a buffer from the nil perspective." + :group 'persp-mode + :type '(choice + (const :tag "Ask to remove from all perspectives" ask-to-rem-from-all) + (const :tag "Ask only if buffer belongs to a non-weak perspective" + ask-if-in-non-weak-persp) + (const :tag "Don't ask" nil) + (function :tag "Run this function" (lambda (b-o-ns) b-o-ns)))) + +(define-widget 'persp-kill-foreign-buffer-behaviour-choices 'lazy + "What to do when manually killing a buffer that is not in +the current perspective." + :offset 4 + :tag "\nControl the persp-kill-buffer-query-function behaviour." + :type + '(choice + (const :tag "Ask what to do" :value ask) + (const :tag "\nDon't ask if a buffer belongs only to weak perspectives" + :value dont-ask-weak) + (const :tag "Just kill" :value kill) + (const :tag "\nDo not suggest foreign buffer to the user(kill buffer)" + :value nil) + (function :tag "Run function" :value (lambda () t)))) + +(define-obsolete-variable-alias 'persp-kill-foreign-buffer-action + 'persp-kill-foreign-buffer-behaviour "persp-mode 2.9.6") +(defcustom persp-kill-foreign-buffer-behaviour 'dont-ask-weak + "What to do when manually killing a buffer that is not in +the current perspective." + :group 'persp-mode + :type 'persp-kill-foreign-buffer-behaviour-choices) + +(make-obsolete-variable + 'persp-kill-foreign-indirect-buffer-behaviour-override + "Don't use this" "persp-mode 2.9.7") + +(defcustom persp-autokill-buffer-on-remove nil + "Kill the buffer if it removed from every(or non weak) perspective." + :group 'persp-mode + :type + '(choice + (const :tag "Just kill" :value kill) ;; or t + (const + :tag "Kill if buffer belongs only to weak perspectives" :value kill-weak) + (const :tag "Do not kill" :value nil))) + +(defcustom persp-autokill-persp-when-removed-last-buffer 'hide-auto + "Kill the perspective if no buffers left in it." + :group 'persp-mode + :type '(choice + (const :tag "Just kill" :value kill) ;; or t + (const :tag "Kill auto perspectives" :value kill-auto) + (const :tag "Hide" :value hide) + (const :tag "Hide auto perspectives" :value hide-auto) + (const :tag "Do not kill" :value nil) + (function :tag "\nRun this function with persp as an argument" + :value (lambda (p) p)))) + +(defcustom persp-common-buffer-filter-functions + (list #'(lambda (b) (or (string-prefix-p " " (buffer-name b)) + (eq (buffer-local-value 'major-mode b) 'helm-major-mode)))) + "The list of functions wich takes a buffer as an argument. If one of these +functions returns a non nil value the buffer considered as 'filtered out'." + :group 'persp-mode + :type 'hook) + +(defcustom persp-buffer-list-restricted-filter-functions nil + "Additional filters for use inside the `persp-buffer-list-restricted'." + :group 'persp-mode + :type 'hook) + +(defcustom persp-add-buffer-on-after-change-major-mode-filter-functions nil + "Additional filters to know which buffers we dont want to add to +the current perspective after the `after-change-major-mode-hook' is fired." + :group 'persp-mode + :type 'hook) + +(defcustom persp-filter-save-buffers-functions + (list #'(lambda (b) (string-prefix-p "*" (buffer-name b)))) + "Additional filters to not save unneeded buffers." + :group 'persp-mode + :type 'hook) + +(defcustom persp-save-buffer-functions + (list #'(lambda (b) + (when (persp-buffer-filtered-out-p + b persp-filter-save-buffers-functions) + 'skip)) + #'persp-tramp-save-buffer + #'(lambda (b) + (when (eq 'dired-mode (buffer-local-value 'major-mode b)) + `(def-buffer ,(buffer-name b) + ,(buffer-local-value 'default-directory b) + ,(buffer-local-value 'major-mode b)))) + #'(lambda (b) + `(def-buffer ,(buffer-name b) + ,(buffer-file-name b) + ,(buffer-local-value 'major-mode b)))) + "Convert a buffer to a structure that could be saved to a file. +If a function return nil -- follow to the next function in the list. +If a function return 'skip -- don't save a buffer." + :group 'persp-mode + :type 'hook) + +(defcustom persp-load-buffer-functions + (list #'persp-buffer-from-savelist) + "Restore a buffer from a saved structure. +If a function return nil -- follow to the next function in the list. +If a function return 'skip -- don't restore a buffer." + :group 'persp-mode + :type 'hook) + +(defcustom persp-mode-hook nil + "The hook that's run after the `persp-mode' has been activated." + :group 'persp-mode + :type 'hook) + +(defcustom persp-mode-deactivated-hook nil + "Runs when the persp-mode is deactivated." + :group 'persp-mode + :type 'hook) + +(defcustom persp-created-functions nil + "Functions to run after a perspective was created. +These functions must accept two arguments -- the created perspective +and the hash in which this perspective will be placed, you can check +if that hash is the same as `*persp-hash*' or another(when you load +a subset of perspectives(with `persp-load-from-file-by-names') they +will be added to a temporary hash)." + :group 'persp-mode + :type 'hook) + +(defcustom persp-renamed-functions nil + "Functions to run if a perspective was renamed. +Each must take three arguments: 1) perspective; 2) old name; 3) new name. +These functions only run when renaming a perspective from `*persp-hash*'." + :group 'persp-mode + :type 'hook) + +(defcustom persp-before-kill-functions nil + "Functions that runs just before a perspective will be destroyed. +It's single argument is the perspective that will be killed." + :group 'persp-mode + :type 'hook) + +(defcustom persp-before-switch-functions nil + "Functions that runs before actually switching to a perspective. +These functions must take two arguments -- a name of a perspective to switch + (it could be a name of an nonexistent perspective or it could be the same +as current) and a frame or a window for which the switching will take place." + :group 'persp-mode + :type 'hook) + +(defcustom persp-activated-functions nil + "Functions that runs after a perspective has been activated. +These functions must take one argument -- a symbol, +if it is eq 'frame -- then the perspective is activated for `selected-frame', +if it is eq 'window -- then the perspective is activated for `selected-window'. +The activated perspective is available with `get-current-persp'." + :group 'persp-mode + :type 'hook) + +(defcustom persp-before-deactivate-functions nil + "Functions that runs before the current perspective has been deactivated +for selected frame or window. +These functions must take one argument -- a symbol, +if it's 'frame -- perspective will be deactivated for the `selected-frame', +if it's 'window -- perspective will be deactivated for the `selected-window'. +The perspective is available with `get-current-persp'." + :group 'persp-mode + :type 'hook) + +(defcustom persp-before-save-state-to-file-functions nil + "Functions to run before saving perspectives to a file. +Each function in this list will be called with 3 arguments: +1) a file name to which perspectives will be saved; +2) a hash with perspectives; +3) a bool argument indicating if the persp-file parameter of perspectives + must be set." + :group 'persp-mode + :type 'hook) + +(defcustom persp-after-load-state-functions + (list #'(lambda (file phash persp-names) + (when (eq phash *persp-hash*) + (persp-update-frames-window-confs persp-names)))) + "Functions that runs after perspectives state was loaded. +These functions must take 3 arguments: +1) a file from which the state was loaded; +2) a hash in which loaded perspectives were placed; +3) list of names of perspectives that was loaded." + :group 'persp-mode + :type 'hook) + +(defcustom persp-use-workgroups (and (version< emacs-version "24.4") + (locate-library "workgroups")) + "If t -- use the workgroups.el package for saving/restoring +windows configurations." + :group 'persp-mode + :type 'boolean + :set + #'(lambda (sym val) + (custom-set-default sym val) + ;; require workgroups if we are going to use it + (when persp-use-workgroups + ;;(require 'workgroups) + (unless (fboundp 'wg-make-wconfig) + (autoload 'wg-make-wconfig "workgroups" + "Return a new Workgroups window config from `selected-frame'." )) + (unless (fboundp 'wg-restore-wconfig) + (autoload 'wg-restore-wconfig "workgroups" + "Restore WCONFIG in `selected-frame'." ))))) + +(defcustom persp-restore-window-conf-method t + "Defines how to restore window configurations for the new frames: +t -- the standard action. +function -- run that function." + :group 'persp-mode + :type + '(choice + (const :tag "Standard action" :value t) + (const :tag "Do nothing" :value nil) + (function :tag "Run function" + :value (lambda (frame persp new-frame-p) nil)))) + +(defcustom persp-restore-window-conf-filter-functions + (list #'(lambda (f p new-f-p) + (or (null f) + (frame-parameter f 'persp-ignore-wconf) + (let ((old-piw (frame-parameter f 'persp-ignore-wconf-once))) + (when old-piw + (set-frame-parameter f 'persp-ignore-wconf-once nil) + old-piw))))) + "The list of functions which takes a frame, persp and new-frame-p as arguments. +If one of these functions return a non nil value then the window configuration +of the persp will not be restored for the frame" + :group 'persp-mode + :type 'hook) + +(defcustom persp-window-state-get-function + (if persp-use-workgroups + #'(lambda (&optional frame rwin) + (when (or frame (setq frame (selected-frame))) + (with-selected-frame frame (wg-make-wconfig)))) + (if (version< emacs-version "24.4") + #'(lambda (&optional frame rwin) + (when (or rwin (setq rwin (frame-root-window + (or frame (selected-frame))))) + (when (fboundp 'window-state-get) + (window-state-get rwin)))) + #'(lambda (&optional frame rwin) + (when (or rwin (setq rwin (frame-root-window + (or frame (selected-frame))))) + (window-state-get rwin t))))) + "Function for getting a window configuration of a frame, accept +two optional arguments: +first -- a frame(default is the selected one) +second -- a root window(default is the root window of the selected frame)." + :group 'persp-mode + :type 'function) + +(defcustom persp-window-state-put-function + (if persp-use-workgroups + #'(lambda (pwc &optional frame rwin) + (when (or frame (setq frame (selected-frame))) + (with-selected-frame frame + (cl-letf (((symbol-function 'wg-switch-to-window-buffer) + #'(lambda (win) + "Switch to a buffer determined from WIN's fname and bname. +Return the buffer if it was found, nil otherwise." + (wg-abind + win (fname bname) + (cond ((wg-awhen (get-buffer bname) + (persp-switch-to-buffer it))) + (t (persp-switch-to-buffer wg-default-buffer) + nil)))))) + (wg-restore-wconfig pwc))))) + #'(lambda (pwc &optional frame rwin) + (when (or rwin (setq rwin (frame-root-window + (or frame (selected-frame))))) + (when (fboundp 'window-state-put) + (window-state-put pwc rwin t))))) + "Function for restoring a window configuration. Accept a window configuration +obtained by the `persp-window-state-get-function' and two optional arguments: +one -- a frame(default is the selected frame) +and another -- root window(default is the root window of the selected frame)." + :group 'persp-mode + :type 'function) + +(defcustom persp-buffer-list-function (symbol-function 'buffer-list) + "The function that is used mostly internally by persp-mode functions +to get a list of all buffers." + :group 'persp-mode + :type 'function) + +(defcustom persp-dont-count-weaks-in-restricted-buffer-list nil + "if t -- dont count weak perspectives in `persp-buffer-list-restricted'. +For now it makes any effect only if the value of +the `*persp-restrict-buffers-to*' and friends is 2, 2.5, 3 or 3.5." + :group 'persp-mode + :type 'boolean) + +(defcustom persp-auto-persp-alist nil + "Alist of auto-persp definitions." + :group 'persp-mode + :tag "Auto perspectives" + :type '(alist :key-type (string :tag "Name") + :value-type (alist :tag "Parameters" + :key-type (symbol :tag "Keyword")))) + + +;; Global variables: + +;; check if the initial-buffer-choice may be a function (emacs >= 24.4) +(defvar persp-is-ibc-as-f-supported + (or + (not (version< emacs-version "24.4")) + (not + (null + (assq 'function + (cdr (cl-getf (symbol-plist 'initial-buffer-choice) 'custom-type)))))) + "t if the `initial-buffer-choice' as a function is supported in your emacs, +otherwise nil.") + +(defvar persp-minor-mode-menu nil + "Menu for the persp-mode.") + +(defvar *persp-hash* nil + "The hash table that contain perspectives.") + +(defvar persp-names-cache (when *persp-hash* (persp-names)) + "List of perspective names. +Used by the `persp-read-persp' and other UI functions, so it can be used +to alter the order of perspective names present to user. To achieve that +you must add functions to `persp-created-functions', `persp-renamed-functions', +`persp-before-kill-functions', `persp-before-switch-functions' and +`persp-after-load-state-functions' or just set the +`persp-names-sort-before-read-function'.") + +(defcustom persp-names-sort-before-read-function nil + "Function(or nil) to sort `persp-names-cache' before prompting a user for a +perspective name(s). The function must take a list of perspective names and +return a sorted list." + :group 'persp-mode + :type '(choice + (const :tag "No sort." :value nil) + (function :tag "Function" :value #'identity))) + +(defvar persp-temporarily-display-buffer nil + "This variable dynamically bound to t inside +the `persp-temporarily-display-buffer'.") + +(defvar persp-saved-read-buffer-function read-buffer-function + "Save the `read-buffer-function' to restore it on deactivation.") + +(defvar persp-last-persp-name persp-nil-name + "The last activated perspective. New frames will be created with +that perspective if `persp-set-last-persp-for-new-frames' is t.") + +(defvar persp-special-last-buffer nil + "Special variable to handle the case when new frames are switching +the selected window to a wrong buffer.") + +(defvar persp-frame-buffer-predicate nil + "Current buffer-predicate.") + +(defvar persp-frame-buffer-predicate-buffer-list-cache nil + "Variable to cache the perspective buffer list for buffer-predicate.") + +(defvar persp-frame-server-switch-hook nil + "Current persp-server-switch-hook.") + +(defvar persp-disable-buffer-restriction-once nil + "The flag used for toggling buffer filtering during read-buffer.") + +(defvar persp-inhibit-switch-for nil + "List of frames/windows for which the switching of perspectives is inhibited.") + +(defvar persp-read-multiple-exit-minibuffer-function #'exit-minibuffer + "Function to call to exit minibuffer when reading multiple candidates.") + +(defvar persp-buffer-props-hash (when persp-mode + (make-hash-table :test #'eq :size 10)) + "Cache to store buffer properties.") + + +(defvar persp-backtrace-frame-function + (if (version< emacs-version "24.4") + #'(lambda (nframes &optional base) + (let ((i (if base + (let ((k 8) found bt) + (while (and (not found) + (setq bt (cadr (funcall #'backtrace-frame + (cl-incf k))))) + ;; (message "%s:%s" k (backtrace-frame k)) + (when (eq bt base) (setq found t))) + (when found (+ nframes (- k 3)))) + (+ nframes 6)))) + (when i + (funcall #'backtrace-frame i)))) + #'backtrace-frame) + "Backtrace function with base argument.") + + +(defcustom persp-switch-wrap t + "Whether `persp-next' and `persp-prev' should wrap." + :group 'persp-mode + :type 'boolean) + + +;; Key bindings: + +(define-prefix-command 'persp-key-map) + +(defvar persp-mode-map (make-sparse-keymap) + "The keymap with a prefix for the persp-mode.") + +(define-key persp-key-map (kbd "n") #'persp-next) +(define-key persp-key-map (kbd "p") #'persp-prev) +(define-key persp-key-map (kbd "s") #'persp-frame-switch) +(define-key persp-key-map (kbd "S") #'persp-window-switch) +(define-key persp-key-map (kbd "r") #'persp-rename) +(define-key persp-key-map (kbd "c") #'persp-copy) +(define-key persp-key-map (kbd "C") #'persp-kill) +(define-key persp-key-map (kbd "z") #'persp-save-and-kill) +(define-key persp-key-map (kbd "a") #'persp-add-buffer) +(define-key persp-key-map (kbd "b") #'persp-switch-to-buffer) +(define-key persp-key-map (kbd "t") #'persp-temporarily-display-buffer) +(define-key persp-key-map (kbd "i") #'persp-import-buffers) +(define-key persp-key-map (kbd "I") #'persp-import-win-conf) +(define-key persp-key-map (kbd "k") #'persp-remove-buffer) +(define-key persp-key-map (kbd "K") #'persp-kill-buffer) +(define-key persp-key-map (kbd "w") #'persp-save-state-to-file) +(define-key persp-key-map (kbd "W") #'persp-save-to-file-by-names) +(define-key persp-key-map (kbd "l") #'persp-load-state-from-file) +(define-key persp-key-map (kbd "L") #'persp-load-from-file-by-names) +(define-key persp-key-map (kbd "o") #'(lambda () + (interactive) + (persp-mode -1))) + + +(defun persp-set-keymap-prefix (prefix) + (interactive + (list + (read-key-sequence + "Now press a key sequence to be used as the persp-key-map prefix: "))) + (when prefix + (when (boundp 'persp-keymap-prefix) + (substitute-key-definition 'persp-key-map nil persp-mode-map)) + (define-key persp-mode-map prefix 'persp-key-map) + (custom-set-default 'persp-keymap-prefix prefix))) + +(defcustom persp-keymap-prefix (kbd "C-c p") + "The prefix for activating the persp-mode keymap." + :group 'persp-mode + :type 'key-sequence + :set #'(lambda (sym val) (persp-set-keymap-prefix val))) + +;; TODO: remove this function +(defun persp-set-toggle-read-buffer-filter-keys (keys) + (interactive + (list + (read-key-sequence + "Now press a key sequence to be used for toggling persp filters during the read-buffer: "))) + (setcdr (assq 'toggle-persp-buffer-filter persp-read-multiple-keys) keys) + (custom-set-default 'persp-toggle-read-buffer-filter-keys keys)) +(define-obsolete-function-alias + 'persp-set-toggle-read-persp-filter-keys + 'persp-set-toggle-read-buffer-filter-keys + "persp-mode 2.9") + +(defcustom persp-read-multiple-keys + `((toggle-persp-buffer-filter . ,(kbd "C-x C-p")) + (push-item . ,(kbd "C-")) + (pop-item . ,(kbd "M-"))) + "Keybindings to use while prompting for multiple items." + :group 'persp-mode + :tag "Keys for reading multiple items" + :type '(alist :key-type symbol :value-type key-sequence)) + +(define-obsolete-variable-alias + 'persp-toggle-read-persp-filter-keys 'persp-toggle-read-buffer-filter-keys + "persp-mode 2.9") +(defcustom persp-toggle-read-buffer-filter-keys (kbd "C-x C-p") + "Keysequence to toggle the buffer filtering during read-buffer." + :group 'persp-mode + :type 'key-sequence + :set #'(lambda (sym val) + (persp-set-toggle-read-buffer-filter-keys val))) + + +;; Perspective struct: + +(cl-defstruct (perspective + (:conc-name persp-) + (:constructor make-persp)) + (name "") + (buffers nil) + (window-conf nil) + ;; reserved parameters: dont-save-to-file, persp-file. + (parameters nil) + (weak nil) + (auto nil) + (hidden nil)) + +(defun persp-p (obj) + (or (null obj) (perspective-p obj))) + +(defvar persp-nil-wconf nil + "Window configuration for the `nil' perspective.") + +(defvar persp-nil-parameters nil + "Parameters of the `nil' perspective.") + +(defvar persp-nil-hidden nil + "Hidden filed for the `nil' perspective.") + +(defun persp-buffer-list (&optional frame window) + (safe-persp-buffers (get-current-persp frame window))) + +(cl-defun persp-buffer-list-restricted + (&optional + (frame (selected-frame)) (option *persp-restrict-buffers-to*) + (option-foreign-override persp-restrict-buffers-to-if-foreign-buffer) + sure-not-killing) + (unless frame (setq frame (selected-frame))) + (unless option (setq option 0)) + (let* ((cpersp (get-current-persp frame)) + (curbuf (current-buffer)) + (cb-foreign (not (persp-contain-buffer-p curbuf cpersp)))) + (when (and option-foreign-override cb-foreign) + (setq option option-foreign-override)) + (cl-typecase option + (function (funcall option frame)) + (t + (when (= option 2.5) + (setq option (if (null cpersp) -1 2))) + (when (= option 3.5) + (setq option (if (null cpersp) -1 3))) + (let ((bl + (cl-case option + (-1 + (funcall persp-buffer-list-function frame)) + (0 + (if cpersp + (cl-copy-list (persp-buffers cpersp)) + (funcall persp-buffer-list-function frame))) + (1 + (let ((ret (if cpersp + (let ((pbs (cl-copy-list (persp-buffers cpersp)))) + (cl-delete-if + #'(lambda (b) (let ((cns (memq b pbs))) + (when cns + (setcar cns (cadr cns)) + (setcdr cns (cddr cns)) + t))) + (funcall persp-buffer-list-function frame))) + nil))) + (unless (persp-contain-buffer-p curbuf cpersp) + (setq ret (cons curbuf (cl-delete curbuf ret :count 1)))) + ret)) + (2 + (let ((ret + (cl-delete-if + #'(lambda (b) + (persp-buffer-in-other-p* + b cpersp + persp-dont-count-weaks-in-restricted-buffer-list)) + (if cpersp + (cl-copy-list (persp-buffers cpersp)) + (funcall persp-buffer-list-function frame))))) + ret)) + (3 + (let ((ret + (cl-delete-if + #'(lambda (b) + (or + (and cpersp + (persp-contain-buffer-p b cpersp)) + (persp-buffer-in-other-p* + b cpersp + persp-dont-count-weaks-in-restricted-buffer-list))) + (funcall persp-buffer-list-function frame)))) + ret))))) + (when persp-buffer-list-restricted-filter-functions + (setq bl + (cl-delete-if #'(lambda (b) + (persp-buffer-filtered-out-p + b persp-buffer-list-restricted-filter-functions)) + bl))) + (when (and + (not sure-not-killing) cpersp + (symbolp this-command) + persp-kill-foreign-buffer-behaviour + (string-match-p "^.*?kill-buffer.*?$" (symbol-name this-command)) + (not (memq curbuf bl)) + ;; TODO: remove this + ;; (not (persp-buffer-filtered-out-p curbuf)) + ) + (push curbuf bl)) + bl))))) + +(cl-defmacro with-persp-buffer-list + ((&key + (buffer-list-function persp-buffer-list-function) + (restriction *persp-restrict-buffers-to*) + (restriction-foreign-override persp-restrict-buffers-to-if-foreign-buffer) + sortp cache) + &rest body) + (let ((pblf-body `(persp-buffer-list-restricted frame))) + (when sortp (setq pblf-body `(sort ,pblf-body (with-no-warnings ,sortp)))) + `(let ((*persp-restrict-buffers-to* ,restriction) + (persp-restrict-buffers-to-if-foreign-buffer + ,restriction-foreign-override) + ,@(if cache `(persp-buffer-list-cache) nil)) + (cl-letf (((symbol-function 'buffer-list) + #'(lambda (&optional frame) + ,(if cache + `(if persp-buffer-list-cache + persp-buffer-list-cache + (setq persp-buffer-list-cache ,pblf-body)) + pblf-body)))) + ,@body)))) + +(cl-defmacro with-persp-read-buffer ((&key multiple (default-mode t)) &rest body) + `(let ((read-buffer-function #'persp-read-buffer)) + ,@body)) + +(defmacro with-persp-ido-hooks (&rest body) + `(let ((ido-make-buffer-list-hook ido-make-buffer-list-hook) + (ido-setup-hook ido-setup-hook)) + (persp-set-ido-hooks t) + ,@body)) + +;; TODO: rename +(defun safe-persp-name (p) + (if p (persp-name p) + persp-nil-name)) + +;; TODO: rename +(defun safe-persp-buffers (p) + (if p (persp-buffers p) + (funcall persp-buffer-list-function))) + +;; TODO: rename +(defun safe-persp-window-conf (p) + (if p (persp-window-conf p) + persp-nil-wconf)) + +;; TODO: rename +(defun safe-persp-parameters (p) + (if p (persp-parameters p) + persp-nil-parameters)) + +;; TODO: rename +(defun safe-persp-weak (p) + (if p (persp-weak p) + t)) + +;; TODO: rename +(defun safe-persp-auto (p) + (if p (persp-auto p) + nil)) + +;; TODO: rename +(defun safe-persp-hidden (p) + (if p (persp-hidden p) + persp-nil-hidden)) + + +;; TODO: rename +(cl-defun modify-persp-parameters (alist &optional (persp (get-current-persp))) + (cl-loop for (name . value) in alist + do (set-persp-parameter name value persp))) + +;; TODO: rename +(cl-defun set-persp-parameter + (param-name &optional value (persp (get-current-persp))) + (let* ((params (safe-persp-parameters persp)) + (old-cons (assq param-name params))) + (if old-cons + (setcdr old-cons value) + (if persp + (setf (persp-parameters persp) + (push (cons param-name value) params)) + (setq persp-nil-parameters + (push (cons param-name value) params)))))) + +(cl-defun persp-parameter (param-name &optional (persp (get-current-persp))) + (alist-get param-name (safe-persp-parameters persp))) + +;; TODO: rename +(cl-defun delete-persp-parameter (param-name &optional (persp (get-current-persp))) + (when (and (not (null param-name)) (symbolp param-name)) + (if persp + (setf (persp-parameters persp) + (delq (assq param-name (persp-parameters persp)) + (persp-parameters persp))) + (setq persp-nil-parameters + (delq (assq param-name persp-nil-parameters) + persp-nil-parameters))))) + +(defun persp--buffer-in-persps (buf) + (cdr (assq 'persp-buffer-in-persps + (gethash buf persp-buffer-props-hash)))) + +(defun persp--buffer-in-persps-set (buf persps) + (let* ((buf-props (gethash buf persp-buffer-props-hash)) + (cons (assq 'persp-buffer-in-persps buf-props))) + (if cons + (setf (cdr cons) persps) + (setq cons (cons 'persp-buffer-in-persps persps)) + (push cons buf-props) + (puthash buf buf-props persp-buffer-props-hash)))) + +(defun persp--buffer-in-persps-add (buf persp) + (persp--buffer-in-persps-set + buf (cons persp (persp--buffer-in-persps buf)))) + +(defun persp--buffer-in-persps-remove (buf persp) + (persp--buffer-in-persps-set + buf (delq persp (persp--buffer-in-persps buf)))) + + +;; Used in mode defenition: + +(defun persp-mode-restore-and-remove-from-make-frame-hook (&optional f) + (remove-hook 'after-make-frame-functions + #'persp-mode-restore-and-remove-from-make-frame-hook) + (if (> persp-auto-resume-time 0) + (run-at-time + persp-auto-resume-time nil + #'(lambda () + (remove-hook 'find-file-hook + #'persp-special-last-buffer-make-current) + (when (> persp-auto-resume-time 0) + (condition-case-unless-debug err + (persp-load-state-from-file) + (error + (message + "[persp-mode] Error: Can not autoresume perspectives -- %S" + err))) + (when (persp-get-buffer-or-null persp-special-last-buffer) + (persp-switch-to-buffer persp-special-last-buffer))))) + (remove-hook 'find-file-hook + #'persp-special-last-buffer-make-current))) + +(defun persp-asave-on-exit (&optional interactive-query opt) + (when persp-mode + (when (null opt) + (setq opt 0)) + (if (> persp-auto-save-opt opt) + (condition-case-unless-debug err + (persp-save-state-to-file) + (error + (message "[persp-mode] Error: Can not autosave perspectives -- %S" + err) + (when (or noninteractive + (progn + (when (null (persp-frame-list-without-daemon)) + (make-frame)) + (null (persp-frame-list-without-daemon)))) + (setq interactive-query nil)) + (if interactive-query + (yes-or-no-p + "persp-mode can not save perspectives, do you want to exit anyway?") + t))) + t))) +(defun persp-kill-emacs-h () + (persp-asave-on-exit nil)) + +(defun persp-kill-emacs-query-function () + (if persp-mode + (when (persp-asave-on-exit t) + (remove-hook 'kill-emacs-hook #'persp-kill-emacs-h) + t) + t)) + +(defun persp-special-last-buffer-make-current () + (setq persp-special-last-buffer (current-buffer))) + + +;; Auto persp functions: + +(defun persp-auto-persp-parameters (name) + (cdr (assoc name persp-auto-persp-alist))) +(defun persp--auto-persp-pickup-buffer (a-p-def buffer) + (let ((action (alist-get :main-action a-p-def))) + (when (functionp action) + (funcall action buffer)))) +(defun persp-auto-persp-pickup-bufferlist-for (name bufferlist) + (let ((a-p-def (persp-auto-persp-parameters name))) + (when a-p-def + (mapc (apply-partially #'persp--auto-persp-pickup-buffer a-p-def) + bufferlist)))) +(defun persp-auto-persps-pickup-bufferlist (bufferlist) + (mapc + #'(lambda (name) (persp-auto-persp-pickup-bufferlist-for name bufferlist)) + (mapcar #'car persp-auto-persp-alist))) +(defun persp-auto-persp-pickup-buffers-for (name) + (persp-auto-persp-pickup-bufferlist-for name + (funcall persp-buffer-list-function))) +(defun persp-auto-persps-pickup-buffers () + (interactive) + (persp-auto-persps-pickup-bufferlist (funcall persp-buffer-list-function))) + +(defun persp-buffer-match-auto-persp-p (buffer-or-name) + (let ((buffer (persp-get-buffer-or-null buffer-or-name)) + pred) + (car-safe + (cl-find-if #'(lambda (a-p-def) + (and (setq pred (alist-get :generated-predicate a-p-def)) + (funcall pred buffer))) + persp-auto-persp-alist + :key #'cdr)))) +(defun persp-auto-persps-for-buffer (buffer-or-name) + (let ((buffer (persp-get-buffer-or-null buffer-or-name))) + (cl-remove-if #'(lambda (pred) (funcall pred buffer)) + persp-auto-persp-alist + :key #'(lambda (a-p-cons) + (alist-get :generated-predicate (cdr a-p-cons)))))) + +(defun persp-auto-persp-activate-hooks (name) + (let ((hooks + (alist-get :hooks + (persp-auto-persp-parameters name)))) + (mapc #'(lambda (hook-cons) + (add-hook (car hook-cons) (cdr hook-cons))) + hooks))) +(defun persp-auto-persp-deactivate-hooks (name) + (let ((hooks + (alist-get :hooks + (persp-auto-persp-parameters name)))) + (mapc #'(lambda (hook-cons) + (remove-hook (car hook-cons) (cdr hook-cons))) + hooks))) +(defun persp-auto-persps-activate-hooks () + (mapc #'persp-auto-persp-activate-hooks + (mapcar #'car persp-auto-persp-alist))) +(defun persp-auto-persps-deactivate-hooks () + (mapc #'persp-auto-persp-deactivate-hooks + (mapcar #'car persp-auto-persp-alist))) + +(defsubst persp--generate-predicate-loop-any-all + (items-list condition &rest body) + (if items-list + (let (all noquote) + (setq items-list + (cl-typecase items-list + (function (list items-list)) + (list (if (persp-regexp-p items-list) (list items-list) items-list)) + (t (list items-list)))) + (setq noquote (eq :noquote (car items-list))) + (when noquote (setq items-list (cadr items-list))) + (when (listp items-list) + (setq all (eq :all (car items-list))) + (when all (pop items-list)) + (unless noquote (setq items-list `',items-list))) + (let* ((cnd `(cl-member-if + #'(lambda (item) + (setq cond-result + ,(if all + `(not ,condition) + condition))) + ,items-list))) + `(let (cond-result) + (when ,(if all `(not ,cnd) cnd) + ,@body)))) + `(let (cond-result) + ,@body))) +(cl-defun persp--generate-buffer-predicate + (&key + buffer-name file-name mode mode-name minor-mode minor-mode-name predicate + (true-value (if predicate 'cond-result t)) + &allow-other-keys) + (let ((predicate-body true-value)) + (when predicate + (setq predicate-body + (persp--generate-predicate-loop-any-all + predicate '(apply item buffer rest-args) predicate-body))) + (when file-name + (setq predicate-body + (persp--generate-predicate-loop-any-all + file-name '(persp-string-match-p item (buffer-file-name buffer)) + predicate-body))) + (when buffer-name + (setq predicate-body + (persp--generate-predicate-loop-any-all + buffer-name '(persp-string-match-p item (buffer-name buffer)) + predicate-body))) + (when minor-mode-name + (setq predicate-body + (persp--generate-predicate-loop-any-all + minor-mode-name + `(let ((regexp item)) + ,(persp--generate-predicate-loop-any-all + '(:noquote minor-mode-alist) + '(persp-string-match-p regexp (format-mode-line item)) + t)) + predicate-body))) + (when minor-mode + (setq predicate-body + (persp--generate-predicate-loop-any-all + minor-mode + `(cond + ((symbolp item) (bound-and-true-p item)) + ((persp-regexp-p item) (let ((regexp item)) + ,(persp--generate-predicate-loop-any-all + '(:noquote minor-mode-list) + '(and + (bound-and-true-p item) + (persp-string-match-p regexp item)) + t))) + (t nil)) + predicate-body))) + + (when mode-name + (setq predicate-body + (persp--generate-predicate-loop-any-all + mode-name '(persp-string-match-p item (format-mode-line mode-name)) + predicate-body))) + (when mode + (setq predicate-body + (persp--generate-predicate-loop-any-all + mode '(cond + ((symbolp item) (eq item major-mode)) + ((persp-regexp-p item) + (persp-string-match-p item (symbol-name major-mode))) + (t nil)) + predicate-body))) + (eval `(lambda (buffer &rest rest-args) + (when (buffer-live-p buffer) + (with-current-buffer buffer ,predicate-body)))))) + +(defun persp--auto-persp-default-on-match (state) + (persp-add-buffer (alist-get 'buffer state) + (alist-get 'persp state) + nil nil) + state) +(defun persp--auto-persp-default-after-match (state) + (let ((persp (alist-get 'persp state)) + (noauto (alist-get :noauto state)) + (weak (alist-get :weak state)) + (parameters (alist-get :parameters state))) + (when persp + (when (not noauto) + (setf (persp-auto persp) t)) + (when weak + (setf (persp-weak persp) t)) + (modify-persp-parameters parameters persp))) + (let ((persp-name (alist-get 'persp-name state)) + (switch (alist-get :switch state))) + (persp-unhide persp-name) + (cl-case switch + ('nil nil) + (window (persp-window-switch persp-name)) + (frame (persp-frame-switch persp-name)) + (t (persp-switch persp-name))) + (when switch + (persp-switch-to-buffer (alist-get 'buffer state)))) + state) + +;;;###autoload +(cl-defun persp-def-auto-persp + (name &rest keyargs + &key buffer-name file-name mode mode-name minor-mode minor-mode-name + predicate hooks dyn-env get-name get-buffer get-persp + switch parameters noauto weak user-data + on-match after-match dont-pick-up-buffers delete) + + (if delete + (let ((ap-cons (assoc name persp-auto-persp-alist))) + (persp-auto-persp-deactivate-hooks name) + (setq persp-auto-persp-alist + (delq ap-cons persp-auto-persp-alist))) + + (let (auto-persp-parameters + generated-predicate generated-hook + hook-body main-action) + + (cl-loop for (key val) on keyargs by #'cddr + when (and val (not (or (eq key :dont-pick-up-buffers)))) + do (push + (cons key + (if (and (functionp val) + (not (or (eq key :mode) (eq key :minor-mode))) + (null (byte-code-function-p val))) + val ;;(byte-compile val) + val)) + auto-persp-parameters)) + + (unless get-name + (push (cons :get-name + (byte-compile + `(lambda (state) + (push (cons 'persp-name ,name) state) + state))) + auto-persp-parameters)) + + (unless get-persp + (push (cons :get-persp + #'(lambda (state) + (let ((name (alist-get 'persp-name state))) + (when name + (push (cons 'persp (persp-add-new name)) + state))) + state)) + auto-persp-parameters)) + + (unless get-buffer + (push (cons :get-buffer + #'(lambda (state) + (push (cons 'buffer (current-buffer)) + state) + state)) + auto-persp-parameters)) + + (unless on-match + (push (cons :on-match + #'persp--auto-persp-default-on-match) + auto-persp-parameters)) + + (unless after-match + (push (cons :after-match + #'persp--auto-persp-default-after-match) + auto-persp-parameters)) + + (when (or (null hooks) (not (consp hooks))) + (unless hooks + (setq hooks + (when minor-mode + (intern (concat (symbol-name minor-mode) + "-hook"))))) + (unless hooks + (setq hooks + (cond + (mode + (intern (concat (symbol-name mode) + "-hook"))) + (minor-mode + (intern (concat (symbol-name minor-mode) + "-hook"))) + ((or mode-name predicate buffer-name) + 'after-change-major-mode-hook) + (file-name 'find-file-hook) + (t 'after-change-major-mode-hook)))) + + (when (and hooks (not (consp hooks))) + (setq hooks (list hooks))) + + (push (cons :hooks hooks) auto-persp-parameters)) + + (setq generated-predicate + (apply #'persp--generate-buffer-predicate + (if predicate + keyargs + (cons :true-value (cons '(car rest-args) keyargs))))) + (push (cons :generated-predicate generated-predicate) + auto-persp-parameters) + + (setq main-action + (eval + `(lambda (&optional buffer hook hook-args) + (let (,@dyn-env) + (let* ((state (copy-alist + (persp-auto-persp-parameters ,name)))) + (push (cons 'hook hook) state) + (push (cons 'hook-args hook-args) state) + (if buffer + (push (cons 'buffer buffer) state) + (let ((get-buffer + (alist-get :get-buffer state))) + (setq state (funcall get-buffer state)))) + (when + (setq state + (funcall (alist-get :generated-predicate state) + (alist-get 'buffer state) state)) + (with-current-buffer (alist-get 'buffer state) + (let ((get-name + (alist-get :get-name state))) + (setq state (funcall get-name state))) + (let ((get-persp + (alist-get :get-persp state))) + (setq state (funcall get-persp state))) + (let ((on-match (alist-get :on-match state))) + (when on-match + (setq state (funcall on-match state)) + (let ((after-match (alist-get :after-match state))) + (when after-match + (setq state (funcall after-match state))))))))))))) + (push (cons :main-action main-action) auto-persp-parameters) + + (when hooks + (let ((aparams-hooks (assq :hooks auto-persp-parameters))) + (dolist (hook hooks) + (setq generated-hook + (with-no-warnings + (let ((warning-minimum-level :emergency) + byte-compile-warnings) + (byte-compile + `(lambda (&rest hook-args) + (when persp-mode + (funcall (with-no-warnings ',main-action) + nil ',hook hook-args))))))) + (setcdr aparams-hooks (delete hook (cdr aparams-hooks))) + (push (cons hook generated-hook) (cdr aparams-hooks))))) + + (let ((auto-persp-definition (assoc name persp-auto-persp-alist))) + (if auto-persp-definition + (progn + (persp-auto-persp-deactivate-hooks name) + (setcdr auto-persp-definition auto-persp-parameters)) + (setq auto-persp-definition (cons name auto-persp-parameters)) + (push auto-persp-definition persp-auto-persp-alist))) + + (persp-auto-persp-activate-hooks name) + + (unless dont-pick-up-buffers + (persp-auto-persp-pickup-buffers-for name))))) + +;;;###autoload +(define-obsolete-function-alias 'def-auto-persp 'persp-def-auto-persp + "persp-mode 2.9.6") + + +;; Custom save/load functions: + +;;;###autoload +(cl-defun persp-def-buffer-save/load + (&rest + keyargs + &key buffer-name file-name mode mode-name minor-mode minor-mode-name + predicate tag-symbol save-vars save-function load-function after-load-function + mode-restore-function + append) + (let ((generated-save-predicate + (apply #'persp--generate-buffer-predicate keyargs)) + save-body load-fun) + (when save-vars + (unless (listp save-vars) (setq save-vars (list save-vars))) + (when (and (or mode mode-name) (not (memq 'major-mode save-vars))) + (push 'major-mode save-vars))) + (unless tag-symbol (setq tag-symbol 'def-buffer-with-vars)) + + (setq save-body + `(let ((vars-list + (with-current-buffer buffer + (cl-delete-if-not + #'(lambda (lvar) + (and + ,(persp--generate-predicate-loop-any-all + save-vars + '(if (persp-regexp-p item) + (persp-string-match-p item + (symbol-name lvar)) + (eq item lvar)) + t) + (persp-elisp-object-readable-p + (symbol-value lvar)))) + (buffer-local-variables) + :key #'car-safe)))) + ,(if save-function + `(funcall (with-no-warnings ',save-function) + buffer ',tag-symbol vars-list) + `(list ',tag-symbol (buffer-name buffer) vars-list))) + save-body `(when (funcall (with-no-warnings ',generated-save-predicate) + buffer) + ,save-body)) + + (setq load-fun + `(lambda (savelist) + (cl-destructuring-bind + (buffer-name vars-list &rest _rest) (cdr savelist) + (let ((buf-file (alist-get 'buffer-file-name vars-list)) + (buf-mmode (alist-get 'major-mode vars-list))) + ,(when mode-restore-function + `(push (cons 'persp-load-buffer-mode-restore-function + (with-no-warnings ',mode-restore-function)) + vars-list)) + (let ((persp-loaded-buffer + (persp-buffer-from-savelist + (list 'def-buffer buffer-name buf-file buf-mmode + (list (cons 'local-vars vars-list))))) + (persp-after-load-function (with-no-warnings + ',after-load-function)) + persp-after-load-lambda) + (when (and persp-loaded-buffer persp-after-load-function) + (setq persp-after-load-lambda + #'(lambda (&rest pall-args) + (apply persp-after-load-function + persp-loaded-buffer pall-args) + (remove-hook 'persp-after-load-state-functions + persp-after-load-lambda))) + (add-hook 'persp-after-load-state-functions + persp-after-load-lambda t)) + persp-loaded-buffer))))) + + (add-hook 'persp-save-buffer-functions + (eval `(lambda (buffer) ,save-body)) append) + (add-hook 'persp-load-buffer-functions + (eval + `(lambda (savelist) + (when (eq (car savelist) ',tag-symbol) + (let ((default-load-fun (with-no-warnings ',load-fun))) + ,(if load-function + `(funcall (with-no-warnings ',load-function) + savelist default-load-fun + (with-no-warnings ',after-load-function)) + `(funcall (eval default-load-fun t) savelist)))))) + append))) + +;;;###autoload +(define-obsolete-function-alias + 'def-persp-buffer-save/load 'persp-def-buffer-save/load + "persp-mode 2.9.6") + + +;; Mode itself: + +;;;###autoload +(define-minor-mode persp-mode + "Toggle the persp-mode. +When active, keeps track of multiple 'perspectives', +named collections of buffers and window configurations. +Here is a keymap of this minor mode: +\\{persp-mode-map}" + :require 'persp-mode + :group 'persp-mode + :keymap persp-mode-map + :init-value nil + :global t + :lighter (:eval persp-lighter) + (if persp-mode + (when (or (eq 'persp-force-restart persp-mode) (null *persp-hash*)) + (setq persp-special-last-buffer nil) + (add-hook 'find-file-hook #'persp-special-last-buffer-make-current) + + (setq *persp-hash* (make-hash-table :test #'equal :size 10)) + (setq persp-buffer-props-hash (make-hash-table :test #'eq :size 10)) + (setq persp-names-cache nil) + + (push '(persp . writable) window-persistent-parameters) + + (persp-add-minor-mode-menu) + (persp-add-new persp-nil-name) + + (add-hook 'find-file-hook #'persp-add-or-not-on-find-file) + (add-hook 'kill-buffer-query-functions #'persp-kill-buffer-query-function) + (add-hook 'kill-buffer-hook #'persp-kill-buffer-h) + (add-hook 'before-make-frame-hook #'persp-before-make-frame) + (add-hook 'after-make-frame-functions #'persp-init-new-frame) + (add-hook 'delete-frame-functions #'persp-delete-frame) + (add-hook 'kill-emacs-query-functions #'persp-kill-emacs-query-function) + (add-hook 'kill-emacs-hook #'persp-kill-emacs-h) + (add-hook 'server-switch-hook #'persp-server-switch) + (add-hook 'after-change-major-mode-hook #'persp-after-change-major-mode-h) + + (persp-set-ido-hooks persp-set-ido-hooks) + (persp-set-read-buffer-function persp-set-read-buffer-function) + + (persp-update-completion-system persp-interactive-completion-system) + + (condition-case-unless-debug err + (mapc #'persp-init-frame (persp-frame-list-without-daemon)) + (error + (message "[persp-mode] Error: Can not initialize frame -- %S" + err))) + + (when (fboundp 'tabbar-mode) + (setq tabbar-buffer-list-function #'persp-buffer-list)) + + (persp-auto-persps-activate-hooks) + + (if (or noninteractive + (and (daemonp) + (null (cdr (frame-list))) + (eq (selected-frame) terminal-frame))) + (add-hook 'after-make-frame-functions + #'persp-mode-restore-and-remove-from-make-frame-hook) + (persp-mode-restore-and-remove-from-make-frame-hook))) + + (run-hooks 'persp-mode-deactivated-hook) + (unless (memq #'persp-mode-restore-and-remove-from-make-frame-hook + after-make-frame-functions) + (persp-asave-on-exit t 1)) + + (remove-hook 'find-file-hook #'persp-add-or-not-on-find-file) + (remove-hook 'kill-buffer-query-functions #'persp-kill-buffer-query-function) + (remove-hook 'kill-buffer-hook #'persp-kill-buffer-h) + (remove-hook 'before-make-frame-hook #'persp-before-make-frame) + (remove-hook 'after-make-frame-functions #'persp-init-new-frame) + (remove-hook 'delete-frame-functions #'persp-delete-frame) + (remove-hook 'kill-emacs-query-functions #'persp-kill-emacs-query-function) + (remove-hook 'kill-emacs-hook #'persp-kill-emacs-h) + (remove-hook 'server-switch-hook #'persp-server-switch) + (remove-hook 'after-change-major-mode-hook #'persp-after-change-major-mode-h) + + (persp-set-ido-hooks) + (persp-set-read-buffer-function) + (persp-update-frames-buffer-predicate t) + (persp-update-completion-system nil t) + + (persp-auto-persps-deactivate-hooks) + + (when (fboundp 'tabbar-mode) + (setq tabbar-buffer-list-function #'tabbar-buffer-list)) + + (setq window-persistent-parameters + (delq (assq 'persp window-persistent-parameters) + window-persistent-parameters)) + + ;; TODO: do it properly -- remove buffers, kill perspectives + (setq *persp-hash* nil) + (setq persp-buffer-props-hash nil) + (setq persp-names-cache nil))) + + +;; Hooks: + +(defun persp--kill-buffer-query-function-foreign-check (persp buf) + (let ((opt persp-kill-foreign-buffer-behaviour)) + (cond + ((functionp opt) (funcall opt)) + (t + (if (cl-case opt + ((kill nil) t) + (dont-ask-weak (persp-buffer-free-p buf t)) + (t (persp-buffer-filtered-out-p buf))) + 'kill + (let ((curwin (selected-window)) + (prompt (format "You are going to kill a buffer(%s) \ +which is not in the current(%s) perspective. It will be removed from \ +%s perspectives and then killed.\nWhat do you really want to do? " + (buffer-name buf) + (safe-persp-name persp) + (mapcar #'persp-name + (persp--buffer-in-persps buf))))) + (cl-macrolet + ((clwin (w) + `(run-at-time 1 nil #'(lambda (ww) + (when (window-live-p ww) + (delete-window ww))) + ,w)) + (swb (b w) + `(run-at-time + 1 nil + #'(lambda (bb ww) + (with-selected-window ww + (persp-set-another-buffer-for-window + bb ww))) + ,b ,w))) + (cl-destructuring-bind (char &rest _) + (let ((variants + (list '(?q "do nothing") + '(?k "kill") + '(?K "kill and close window") + '(?c "close window") + '(?s "switch to another buffer"))) + (cwin (selected-window))) + (when (minibuffer-window-active-p cwin) + (setq cwin (minibuffer-selected-window))) + (unless (eq buf (window-buffer cwin)) + (setq variants + (delq (assq ?K variants) + (delq (assq ?c variants) + (delq (assq ?s variants) variants))))) + (read-multiple-choice prompt variants)) + (cl-case char + ((?q ?\C-g ?\C-\[) nil) + (?k 'kill) + (?K (clwin curwin) 'kill) + (?c (clwin curwin) nil) + (?s (swb buf curwin) nil) + (t t)))))))))) + +(defun persp-kill-buffer-query-function () + "This must be the last hook in the `kill-buffer-query-functions'. +Otherwise if next function in the list returns nil -- the buffer will not be +killed, but just removed from a perspective(s)." + (if persp-mode + (let ((buffer (current-buffer))) + (if (persp--buffer-in-persps buffer) + (let* ((persp (get-current-persp)) + (foreign-check + (if (and persp + (persp-contain-buffer-p buffer persp)) + 'not-foreign + (persp--kill-buffer-query-function-foreign-check + persp buffer)))) + (cl-case foreign-check + (kill + (let (persp-autokill-buffer-on-remove) + (persp--remove-buffer-2 nil buffer)) + t) + (not-foreign + (if (persp-buffer-in-other-p* buffer persp) + (progn (persp--remove-buffer-2 persp buffer) + nil) + (if (or (not (buffer-live-p buffer)) + (persp--buffer-in-persps buffer)) + nil + t) + t)) + (t + nil))) + t)) + t)) + +(defun persp-kill-buffer-h () + (let ((buffer (current-buffer))) + (when (and persp-mode (persp--buffer-in-persps buffer)) + (let (persp-autokill-buffer-on-remove + (persp-when-remove-buffer-switch-to-other-buffer + (unless persp-set-frame-buffer-predicate + persp-when-remove-buffer-switch-to-other-buffer))) + (persp--remove-buffer-2 nil buffer))))) + +(defun persp--restore-buffer-on-find-file () + (when (buffer-live-p persp-special-last-buffer) + (set-window-buffer (or (get-buffer-window) (selected-window)) + persp-special-last-buffer)) + (setq persp-special-last-buffer nil) + (remove-hook 'window-configuration-change-hook + #'persp--restore-buffer-on-find-file)) +(defun persp-add-or-not-on-find-file () + (let ((no-select + (not (funcall persp-backtrace-frame-function 0 'find-file)))) + (and + (cl-case persp-add-buffer-on-find-file + ('nil nil) + (if-not-autopersp + (let ((ret (not (persp-buffer-match-auto-persp-p (current-buffer))))) + (unless (or ret no-select) + (setq persp-special-last-buffer (window-buffer)) + (add-hook 'window-configuration-change-hook + #'persp--restore-buffer-on-find-file)) + ret)) + (add-but-not-switch-if-autopersp + (when (and (not no-select) + (persp-buffer-match-auto-persp-p (current-buffer))) + (setq no-select t) + (setq persp-special-last-buffer (window-buffer)) + (add-hook 'window-configuration-change-hook + #'persp--restore-buffer-on-find-file)) + t) + (t t)) + (persp-add-buffer + (current-buffer) (get-current-persp) (not no-select) nil)))) + +(defun persp-after-change-major-mode-h () + (let ((buf (current-buffer))) + (persp-find-and-set-persps-for-buffer buf) + (when + (and + (cl-case persp-add-buffer-on-after-change-major-mode + ('nil nil) + (free (persp-buffer-free-p buf)) + (t t)) + (not + (persp-buffer-filtered-out-p + buf persp-add-buffer-on-after-change-major-mode-filter-functions))) + (persp-add-buffer buf (get-current-persp) nil nil)))) + +(defun persp-server-switch () + (condition-case-unless-debug err + (let* ((frame (selected-frame)) + (persp-server-switch-hook (frame-parameter + frame 'persp-server-switch-hook))) + (when persp-server-switch-hook + (unless (string-match-p "^.*magit.*$" (symbol-name last-command)) + (funcall persp-server-switch-hook frame)) + (set-frame-parameter frame 'persp-server-switch-hook nil))) + (error + (message "[persp-mode] Error: error in server-switch-hook -- %S" + err)))) + + +;; Misc funcs: + +(cl-defun persp-get-by-name + (name &optional (phash *persp-hash*) (default persp-not-persp)) + (gethash name phash default)) + +(cl-defun persp-with-name-exists-p (name &optional (phash *persp-hash*)) + (persp-p (persp-get-by-name name phash))) + +(cl-defun persp-by-name-and-exists (name &optional (phash *persp-hash*)) + (let ((persp (persp-get-by-name name phash))) + (cons (persp-p persp) persp))) + +(cl-defun persp-gen-random-name (&optional name (phash *persp-hash*)) + (unless name (setq name (number-to-string (random)))) + (cl-macrolet ((namegen () `(format "%s:%s" name (random 9)))) + (cl-do ((nname name (namegen))) + ((not (persp-with-name-exists-p nname phash)) + nname)))) + +(defsubst persp-is-frame-daemons-frame (f) + (and (daemonp) (eq f terminal-frame))) + +(defun persp-frame-list-without-daemon () + "Return a list of frames without the daemon's frame." + (if (daemonp) + (filtered-frame-list + #'(lambda (f) (not (persp-is-frame-daemons-frame f)))) + (frame-list))) + +;; TODO: rename +(defun set-frame-persp (persp &optional frame) + (set-frame-parameter frame 'persp persp)) + +;; TODO: rename +(defun get-frame-persp (&optional frame) + (frame-parameter frame 'persp)) + +(cl-defun persp-names (&optional (phash *persp-hash*) (reverse t)) + (let (ret) + (maphash #'(lambda (k p) + (push k ret)) + phash) + (if reverse + (nreverse ret) + ret))) + +;; TODO: rename +(defun set-window-persp* (persp-name &optional window) + (when persp-name + (set-window-parameter window 'persp persp-name))) +;; TODO: rename +(defun get-window-persp* (&optional window) + (window-parameter window 'persp)) +;; TODO: rename +(defun set-window-persp (persp &optional window) + (let ((frame (window-frame window))) + (if (eq persp (get-frame-persp frame)) + (clear-window-persp window) + (set-window-persp* (safe-persp-name persp) window)))) +;; TODO: rename +(defun window-persp-set-p (&optional window) + (get-window-persp* window)) +;; TODO: rename +(defun get-window-persp (&optional window) + (let ((pn (get-window-persp* window))) + (when pn + (cl-destructuring-bind (e . p) + (persp-by-name-and-exists pn) + (and e p))))) +;; TODO: rename +(defun clear-window-persp (&optional window) + (set-window-parameter window 'persp nil)) + +;; TODO: rename +(defun get-current-persp (&optional frame window) + (with-selected-frame (or frame (selected-frame)) + (if (window-persp-set-p window) + (get-window-persp window) + (get-frame-persp frame)))) + +;; TODO: rename +(defun set-current-persp (persp) + (if (window-persp-set-p) + (set-window-persp persp) + (set-frame-persp persp))) + +(defun persp-names-current-frame-fast-ordered () + (cl-copy-list persp-names-cache)) + +;; TODO: remove this +(cl-defsubst persp-names-sorted (&optional (phash *persp-hash*)) + (sort (persp-names phash nil) #'string<)) +(make-obsolete 'persp-names-sorted "it will be removed." "persp-mode 2.9.6") + +(defun persp-group-by (keyf lst &optional reverse) + (let (result) + (mapc #'(lambda (pd) + (let* ((key (funcall keyf pd)) + (kv (assoc key result))) + (if kv + (setcdr kv (cons pd (cdr kv))) + (push (cons key (list pd)) result)))) + lst) + (if reverse + (nreverse + (mapcar #'(lambda (gr) + (cl-destructuring-bind (key . pd) gr + (cons key (nreverse pd)))) + result)) + result))) + +(defun persp-regexp-p (obj) + (or (stringp obj) (and (consp obj) (stringp (cdr obj))))) +(defun persp-string-match-p (regexp string &optional start) + (when (and regexp (not (consp regexp))) + (setq regexp (cons t regexp))) + (let ((ret (string-match-p (cdr regexp) string start))) + (if (eq :not (car regexp)) + (not ret) + ret))) + +(cl-defun persp-persps (&optional (phash *persp-hash*) names-regexp reverse) + (when (and names-regexp (not (consp names-regexp))) + (setq names-regexp (cons t names-regexp))) + (let (ret) + (maphash #'(lambda (k p) + (if names-regexp + (when (persp-string-match-p names-regexp k) + (push p ret)) + (push p ret))) + phash) + (if reverse + (nreverse ret) + ret))) + +(cl-defun persp-other-not-hidden-persps (&optional persp (phash *persp-hash*)) + (cl-delete-if #'safe-persp-hidden (delq persp (persp-persps phash)))) + +(cl-defun persp-other-persps-with-buffer-except-nil + (&optional (buff-or-name (current-buffer)) (persp (get-current-persp)) + (phash *persp-hash*) del-weak) + (let ((buf (persp-get-buffer-or-null buff-or-name)) + ret) + (when buf + (setq ret (cl-delete-if-not + (apply-partially #'memq buf) + (delq persp (delq nil (persp-persps phash))) + :key #'persp-buffers)) + (when del-weak + (setq ret (cl-delete-if #'persp-weak ret)))) + ret)) +(cl-defun persp-other-persps-with-buffer-except-nil* + (&optional + (buff-or-name (current-buffer)) (persp (get-current-persp)) del-weak) + (let ((persps (persp--buffer-in-persps + (persp-get-buffer-or-null buff-or-name)))) + (when persp + (setq persps (remq persp persps))) + (when del-weak + (setq persps (cl-remove-if #'persp-weak persps))) + persps)) + +(cl-defun persp-buffer-in-other-p + (&optional (buff-or-name (current-buffer)) (persp (get-current-persp)) + (phash *persp-hash*) del-weak) + (persp-other-persps-with-buffer-except-nil buff-or-name persp phash del-weak)) +(cl-defun persp-buffer-in-other-p* + (&optional (buff-or-name (current-buffer)) (persp (get-current-persp)) del-weak) + (persp-other-persps-with-buffer-except-nil* buff-or-name persp del-weak)) + + +(cl-defun persp-frames-with-persp (&optional (persp (get-frame-persp))) + (cl-delete-if-not (apply-partially #'eq persp) + (persp-frame-list-without-daemon) + :key #'get-frame-persp)) +(cl-defun persp-frames-and-windows-with-persp (&optional (persp (get-current-persp))) + (let (frames windows) + (dolist (frame (persp-frame-list-without-daemon)) + (when (eq persp (get-frame-persp frame)) + (push frame frames)) + (dolist (window (window-list frame 'no-minibuf)) + (when (and (window-persp-set-p window) + (eq persp (get-window-persp window))) + (push window windows)))) + (cons frames windows))) + + +(cl-defun persp-do-buffer-list-by-regexp (&key func regexp blist noask + (rest-args nil rest-args-p)) + (interactive) + (unless func + (let ((fs (completing-read "What function to apply: " obarray 'functionp t))) + (when (and fs (not (string= fs ""))) + (setq func (read fs))))) + (when func + (unless regexp + (setq regexp (read-regexp "Regexp: "))) + (when regexp + (unless blist + (setq blist (eval (read--expression "Buffer list expression: " "nil")))) + (when blist + (unless rest-args-p + (setq rest-args (read--expression "Rest arguments: " "nil"))) + (setq blist + (cl-remove-if-not + (apply-partially #'persp-string-match-p regexp) + (mapcar #'get-buffer blist) + :key #'buffer-name)) + (when (and blist + (or noask (y-or-n-p (format "Do %s on these buffers:\n%s?\n" + func + (mapconcat #'buffer-name blist ", "))))) + (mapcar #'(lambda (b) (apply func b rest-args)) blist)))))) + + +;; Perspective funcs: + +(defun persp-next () + "Switch to next perspective (to the right)." + (interactive) + (let* ((persp-list (persp-names-current-frame-fast-ordered)) + (persp-list-length (length persp-list)) + (only-perspective? (equal persp-list-length 1)) + (pos (cl-position (safe-persp-name (get-current-persp)) persp-list))) + (cond + ((null pos) nil) + (only-perspective? nil) + ((= pos (1- persp-list-length)) + (if persp-switch-wrap (persp-switch (nth 0 persp-list)))) + (t (persp-switch (nth (1+ pos) persp-list)))))) + +(defun persp-prev () + "Switch to previous perspective (to the left)." + (interactive) + (let* ((persp-list (persp-names-current-frame-fast-ordered)) + (persp-list-length (length persp-list)) + (only-perspective? (equal persp-list-length 1)) + (pos (cl-position (safe-persp-name (get-current-persp)) persp-list))) + (cond + ((null pos) nil) + (only-perspective? nil) + ((= pos 0) + (if persp-switch-wrap + (persp-switch (nth (1- persp-list-length) persp-list)))) + (t (persp-switch (nth (1- pos) persp-list)))))) + +(cl-defun persp-add (persp &optional (phash *persp-hash*)) + "Insert `PERSP' to `PHASH'. +If we adding to the `*persp-hash*' add entries to the mode menu. +Return `PERSP'." + (let ((name (safe-persp-name persp))) + (puthash name persp phash) + (when (eq phash *persp-hash*) + (persp-add-to-menu persp))) + persp) + +(cl-defun persp-remove-by-name (name &optional (phash *persp-hash*)) + "Remove a perspective with name `NAME' from `PHASH'. +Save it's state before removing. +If we removing from the `*persp-hash*' remove also the menu entries. +Switch all frames with that perspective to another one. +Return the removed perspective." + (interactive "i") + (unless name + (setq name (persp-read-persp + "to remove" nil + (and (eq phash *persp-hash*) + (safe-persp-name (get-current-persp))) + t t))) + (let ((persp (persp-get-by-name name phash)) + (persp-to-switch persp-nil-name)) + (when (persp-p persp) + (persp-save-state persp) + (if (and (eq phash *persp-hash*) (null persp)) + (message "[persp-mode] Error: Can't remove the 'nil' perspective") + (when (eq phash *persp-hash*) + (persp-remove-from-menu persp) + (cl-destructuring-bind (frames . windows) + (persp-frames-and-windows-with-persp persp) + (dolist (w windows) (clear-window-persp w)) + ;; (setq persp-to-switch (or (car (persp-names phash nil)) + ;; persp-nil-name)) + (dolist (f frames) + (persp-frame-switch persp-to-switch f)))) + (remhash name phash))) + persp)) + +(cl-defun persp-add-new (name &optional (phash *persp-hash*)) + "Create a new perspective with the given `NAME'. Add it to `PHASH'. +Return the created perspective." + (interactive "sA name for the new perspective: ") + (if (and name (not (equal "" name))) + (cl-destructuring-bind (e . p) + (persp-by-name-and-exists name phash) + (if e p + (setq p (if (equal persp-nil-name name) + nil (make-persp :name name))) + (persp-add p phash) + (run-hook-with-args 'persp-created-functions p phash) + p)) + (message "[persp-mode] Error: Can't create a perspective with empty name.") + nil)) + +(defun persp-find-and-set-persps-for-buffer (&optional buffer-or-name) + (setq buffer-or-name (if buffer-or-name + (persp-get-buffer-or-null buffer-or-name) + (current-buffer))) + (mapc #'(lambda (p) + (when p + (persp-add-buffer buffer-or-name p nil nil))) + (persp--buffer-in-persps buffer-or-name)) + (persp--buffer-in-persps-set + buffer-or-name + (cl-delete-if-not (apply-partially #'memq buffer-or-name) + (delq nil (persp-persps)) + :key #'persp-buffers))) + +(cl-defun persp-contain-buffer-p + (&optional (buff-or-name (current-buffer)) (persp (get-current-persp)) delweak) + (if (and delweak (safe-persp-weak persp)) + nil + (if persp + (memq (persp-get-buffer-or-null buff-or-name) + (persp-buffers persp)) + t))) +(cl-defun persp-contain-buffer-p* + (&optional (buff-or-name (current-buffer)) (persp (get-current-persp)) delweak) + (if (and delweak (safe-persp-weak persp)) + nil + (if persp + (memq persp (persp--buffer-in-persps + (persp-get-buffer-or-null buff-or-name))) + t))) + +(cl-defun persp-add-buffer + (&optional buffs-or-names (persp (get-current-persp)) + (switchorno persp-switch-to-added-buffer) + (called-interactively-p (called-interactively-p 'any))) + (interactive "i") + (when (and called-interactively-p current-prefix-arg) + (setq switchorno (not switchorno))) + (unless buffs-or-names + (setq buffs-or-names + (when called-interactively-p + (let ((*persp-restrict-buffers-to* 1) + persp-restrict-buffers-to-if-foreign-buffer) + (persp-read-buffer (concat + "Add buffers to the perspective" + (and switchorno + " and switch to first added buffer") + ": ") + (current-buffer) t nil t))))) + (unless (listp buffs-or-names) (setq buffs-or-names (list buffs-or-names))) + (mapc + #'(lambda (bon) + (let ((buffer (persp-get-buffer-or-null bon))) + (when (and persp buffer) + (unless (persp-contain-buffer-p buffer persp) + (push buffer (persp-buffers persp))) + (unless (persp-contain-buffer-p* buffer persp) + (persp--buffer-in-persps-add buffer persp))) + (when (and buffer switchorno (eq persp (get-current-persp))) + (persp-switch-to-buffer buffer)) + buffer)) + buffs-or-names) + buffs-or-names) + +(cl-defun persp-add-buffers-by-regexp (&optional regexp (persp (get-current-persp))) + (interactive) + (when persp + (persp-do-buffer-list-by-regexp + :regexp regexp :func 'persp-add-buffer :rest-args (list persp nil) + :blist (persp-buffer-list-restricted (selected-frame) 1)))) + +(cl-defun persp-temporarily-display-buffer + (&optional buff-or-name (called-interactively-p (called-interactively-p 'any))) + (interactive "i") + (let ((persp-temporarily-display-buffer t)) + (unless buff-or-name + (setq buff-or-name + (if called-interactively-p + (let ((*persp-restrict-buffers-to* + (if (and called-interactively-p current-prefix-arg) 0 1)) + (persp-restrict-buffers-to-if-foreign-buffer + (if (= 0 *persp-restrict-buffers-to*) -1 nil))) + (persp-read-buffer + (if (= 0 *persp-restrict-buffers-to*) + "Remove a buffer from the perspective, but still display it: " + "Temporarily display a buffer, not adding it to the current perspective: ") + nil t)) + (current-buffer)))) + (let ((buffer (persp-get-buffer-or-null buff-or-name))) + (when buffer + (let ((persp (get-current-persp))) + (when (and persp (persp-contain-buffer-p* buffer persp)) + (let (persp-autokill-buffer-on-remove + persp-autokill-persp-when-removed-last-buffer) + (persp-remove-buffer buffer persp nil nil nil nil)))) + (persp-switch-to-buffer buffer t))))) + + +(defun persp--buffer-do-auto-action-if-needed (buffer) + (when (and persp-autokill-buffer-on-remove + (persp-buffer-free-p + buffer + (eq 'kill-weak persp-autokill-buffer-on-remove))) + (let (persp-autokill-buffer-on-remove) + (persp-kill-buffer buffer)))) + +(defun persp--remove-buffer-1 (buffer &optional persp) + (if persp + (progn + (when persp-when-remove-buffer-switch-to-other-buffer + (persp-switch-to-prev-buffer buffer persp)) + (persp--buffer-in-persps-remove buffer persp) + (setf (persp-buffers persp) (delq buffer (persp-buffers persp))) + persp) + (mapcar (apply-partially #'persp--remove-buffer-1 buffer) + (persp-other-persps-with-buffer-except-nil buffer persp)))) + +(defun persp--remove-buffer-2 (&optional persp buffer-or-name) + (let ((buffer (if buffer-or-name + (persp-get-buffer-or-null buffer-or-name) + (current-buffer)))) + (when buffer + (persp--remove-buffer-1 buffer persp) + (persp--buffer-do-auto-action-if-needed buffer) + (persp--do-auto-action-if-needed persp)) + buffer)) + +(defun persp--remove-buffers-from-nil-p (buffs-or-names) + (cl-typecase persp-remove-buffers-from-nil-persp-behaviour + (function + (funcall persp-remove-buffers-from-nil-persp-behaviour + buffs-or-names)) + (symbol + (cl-macrolet + ((ask () `(yes-or-no-p + (format "Remove %s buffers from all perspectives?" + buffs-or-names)))) + (cl-case persp-remove-buffers-from-nil-persp-behaviour + (ask-to-rem-from-all + (if (cl-find-if-not #'persp-buffer-free-p buffs-or-names) + (ask) t)) + (ask-if-in-non-weak-persp + (if (cl-find-if-not + #'(lambda (bon) + (persp-buffer-free-p bon t)) + buffs-or-names) + (ask) t)) + (t t)))) + (t t))) + +(cl-defun persp-remove-buffer + (&optional buffs-or-names (persp (get-current-persp)) + (rem-from-nil-opt persp-remove-buffers-from-nil-persp-behaviour) + (switch persp-when-remove-buffer-switch-to-other-buffer) + called-from-kill-buffer-hook + (called-interactively-p (called-interactively-p 'any))) + "Remove BUFFS-OR-NAMES(which may be a single buffer or a list of buffers) +from the PERSP. On success return removed buffers otherwise nil." + (interactive "i") + + ;; TODO: remove these parameters + (ignore called-from-kill-buffer-hook rem-from-nil-opt switch) + + (unless (listp buffs-or-names) (setq buffs-or-names (list buffs-or-names))) + (unless buffs-or-names + (setq buffs-or-names + (if called-interactively-p + (let ((*persp-restrict-buffers-to* 0) + persp-restrict-buffers-to-if-foreign-buffer) + (persp-read-buffer "Remove buffers from the perspective: " + (current-buffer) t nil t)) + (current-buffer)))) + (when (or persp + (persp--remove-buffers-from-nil-p buffs-or-names)) + (let ((persp-autokill-buffer-on-remove + (if (and called-interactively-p current-prefix-arg) + (not persp-autokill-buffer-on-remove) + persp-autokill-buffer-on-remove))) + (mapcar (apply-partially #'persp--remove-buffer-2 persp) + buffs-or-names)))) + +(defun persp-kill-buffer (&optional buffers-or-names) + "Kill buffers, read buffer with restriction to current perspective." + (interactive (list + (let ((*persp-restrict-buffers-to* 0) + persp-restrict-buffers-to-if-foreign-buffer) + (if persp-mode + (persp-read-buffer + "Kill buffers: " (current-buffer) t nil t) + (read-buffer "Kill buffer: " (current-buffer) t))))) + (unless (listp buffers-or-names) + (setq buffers-or-names (list buffers-or-names))) + (mapc #'kill-buffer + (cl-remove-if-not #'persp-get-buffer-or-null buffers-or-names)) + buffers-or-names) + +(defun persp-switch-to-buffer (buffer-or-name + &optional norecord force-same-window) + + "Switch to buffer, read buffer with restriction to current perspective." + + (interactive (list + (let ((*persp-restrict-buffers-to* 0) + persp-restrict-buffers-to-if-foreign-buffer) + (if persp-mode + (let ((dflt (other-buffer (current-buffer)))) + (unless (memq dflt (safe-persp-buffers + (get-current-persp))) + (cl-psetq dflt (current-buffer))) + (persp-read-buffer "Switch to buffer: " dflt t)) + (read-buffer-to-switch "Switch to buffer: "))))) + (when (and buffer-or-name + (persp-get-buffer-or-null (get-buffer buffer-or-name))) + (switch-to-buffer buffer-or-name norecord force-same-window))) + +(cl-defun persp-remove-buffers-by-regexp + (&optional regexp (persp (get-current-persp))) + (interactive) + (when persp + (persp-do-buffer-list-by-regexp + :regexp regexp :func 'persp-remove-buffer + :blist (persp-buffers persp) :rest-args (list persp)))) + +(cl-defun persp-import-buffers-from (persp-from + &optional (persp-to (get-current-persp))) + (if persp-to + (mapc #'(lambda (b) (persp-add-buffer b persp-to nil nil)) + (safe-persp-buffers persp-from)) + (message "[persp-mode] Error: Can't import buffers to the 'nil' perspective, \ +cause it already contain all buffers."))) + +(cl-defun persp-import-buffers + (names + &optional (persp-to (get-current-persp)) (phash *persp-hash*)) + "Import buffers from perspectives with the given names to another one." + (interactive "i") + (unless (listp names) (setq names (list names))) + (unless names + (setq names (persp-read-persp "to import buffers from" t nil t nil t))) + (mapc #'(lambda (persp-from) + (persp-import-buffers-from persp-from persp-to)) + (mapcar #'(lambda (pn) (persp-get-by-name pn phash)) names))) + +(cl-defun persp-import-win-conf + (name + &optional (persp-to (get-current-persp)) (phash *persp-hash*) + no-update-frames) + (interactive "i") + (unless name + (setq name (persp-read-persp + "to import window configuration from" nil nil t nil t))) + (let ((persp-from (persp-get-by-name name phash))) + (unless (or (eq persp-to persp-from) + (not (persp-p persp-from))) + (if persp-to + (setf (persp-window-conf persp-to) (safe-persp-window-conf persp-from)) + (setq persp-nil-wconf (persp-window-conf persp-from))) + (unless no-update-frames + (persp-update-frames-window-confs (list (safe-persp-name persp-to))))))) + +(cl-defun persp-copy + (new-name + &optional switch (called-interactively-p (called-interactively-p 'any))) + (interactive "i") + (unless new-name + (setq new-name + (read-string "Copy current persp with name: "))) + (if (member new-name (persp-names)) + (progn + (message + "[persp-mode] Error: There is already a perspective with that name %S" + new-name) + nil) + (let* ((new-persp (persp-add-new new-name)) + (current-persp (get-current-persp)) + (new-buffers (when new-persp + (if current-persp + (cl-copy-list (persp-buffers current-persp)) + (safe-persp-buffers current-persp))))) + (when new-persp + (when (and called-interactively-p current-prefix-arg) + (setq new-buffers + (let (choosen-buffers) + (cl-delete-if-not + (cl-destructuring-bind (char &rest _) + (read-multiple-choice + "What buffers to copy? " + '((?a "all") + (?d "displayed") + (?f "free and displayed") + (?F "free") + (?c "choose") + (?n "none"))) + (cl-case char + (?d #'(lambda (b) (get-buffer-window-list b 'no-minibuf))) + (?f #'(lambda (b) (or (persp-buffer-free-p b t) + (get-buffer-window-list b 'no-minibuf)))) + (?F #'(lambda (b) (persp-buffer-free-p b t))) + (?c (setq choosen-buffers + (mapcar #'get-buffer + (persp-read-buffer + "" (current-buffer) t nil t 'push))) + #'(lambda (b) (memq b choosen-buffers))) + (?n #'not) + (?a nil) + (t nil))) + new-buffers)))) + (persp-save-state current-persp) + (setf (persp-window-conf new-persp) + (safe-persp-window-conf current-persp) + (persp-parameters new-persp) + (cl-copy-list (safe-persp-parameters current-persp)) + (persp-weak new-persp) + (if current-persp (persp-weak current-persp) nil)) + (persp-add-buffer new-buffers new-persp nil nil) + (cl-case switch + (window (persp-window-switch new-name)) + (frame (persp-frame-switch new-name)) + (no-switch nil) + (t (persp-switch new-name))) + new-persp)))) + +(cl-defun persp-get-buffer + (&optional (buff-or-name (current-buffer)) (persp (get-current-persp))) + "Like `get-buffer', but constrained to the perspective's list of buffers. +Return the buffer if it's in the perspective or the first buffer from the +perspective buffers or nil." + (let ((buffer (persp-get-buffer-or-null buff-or-name))) + (or (cl-find buffer (safe-persp-buffers persp)) + (cl-first (safe-persp-buffers persp))))) + +(defun persp-get-buffer-or-null (buff-or-name) + "Safely return a buffer or the nil without errors." + (cl-typecase buff-or-name + ((or string buffer) + (let ((buf (get-buffer buff-or-name))) + (and (buffer-live-p buf) + buf))) + (otherwise nil))) + +(defun persp-buffer-filtered-out-p (buff-or-name &rest filters) + (setq filters (if filters + (cons + persp-common-buffer-filter-functions + filters) + persp-common-buffer-filter-functions) + buff-or-name (get-buffer buff-or-name)) + (cl-find-if #'(lambda (filter) + (if (functionp filter) + (funcall filter buff-or-name) + (cl-find-if #'(lambda (f) (funcall f buff-or-name)) filter))) + filters)) + +(defun persp-buffer-free-p (&optional buff-or-name del-weak) + (unless buff-or-name (setq buff-or-name (current-buffer))) + (let ((persps (persp--buffer-in-persps + (persp-get-buffer-or-null buff-or-name)))) + (if persps + (if del-weak + (not + (cl-find-if-not #'persp-weak persps)) + nil) + t))) + + +(cl-defun persp-set-another-buffer-for-window + (&optional (old-buff-or-name (current-buffer)) (window (selected-window)) + (persp (get-current-persp nil window))) + (unless (window-minibuffer-p window) + (let* ((old-buf (persp-get-buffer-or-null old-buff-or-name)) + (new-buf (if persp-set-frame-buffer-predicate + (other-buffer old-buf) + (cl-find-if #'(lambda (bc) + (and (bufferp bc) (not (eq bc old-buf)) + (persp-contain-buffer-p bc persp))) + (append (mapcar #'car + (window-prev-buffers window)) + (window-next-buffers window)))))) + (set-window-buffer + window + (or (and (buffer-live-p new-buf) new-buf) + (car (persp-buffer-list-restricted (window-frame window) 2.5)) + (car (buffer-list))))))) + +(cl-defun persp-switch-to-prev-buffer + (&optional (old-buff-or-name (current-buffer)) (persp (get-current-persp))) + "Switch all windows in all frames with a perspective displaying that buffer +to some previous buffer in the perspective. +Return that old buffer." + (let ((old-buf (persp-get-buffer-or-null old-buff-or-name))) + (cl-destructuring-bind (frames . windows) + (persp-frames-and-windows-with-persp persp) + (dolist (w windows) + (persp-set-another-buffer-for-window old-buf w)) + (dolist (f frames) + (dolist (w (get-buffer-window-list old-buf 'no-minibuf f)) + (persp-set-another-buffer-for-window old-buf w)))) + old-buf)) + +(cl-defsubst persp-filter-out-bad-buffers (&optional (persp (get-current-persp))) + ;; filter out killed buffers + (when persp + (setf (persp-buffers persp) + (cl-delete-if-not #'persp-get-buffer-or-null (persp-buffers persp))))) + +(defun persp-hide (names) + (interactive "i") + (unless (listp names) (setq names (list names))) + (unless names + (setq names (persp-read-persp + "to hide" t (safe-persp-name (get-current-persp)) t))) + (let ((persp-to-switch (get-current-persp)) + (hidden-persps + (mapcar #'(lambda (pn) + (let ((persp (persp-get-by-name pn))) + (when (persp-p persp) + (if persp + (setf (persp-hidden persp) t) + (setq persp-nil-hidden t))) + persp)) + names))) + (when (safe-persp-hidden persp-to-switch) + (setq persp-to-switch + (car (persp-other-not-hidden-persps persp-to-switch)))) + (mapc #'(lambda (p) + (when (persp-p p) + (cl-destructuring-bind (frames . windows) + (persp-frames-and-windows-with-persp p) + (dolist (w windows) (clear-window-persp w)) + (dolist (f frames) + (persp-frame-switch (safe-persp-name persp-to-switch) f))))) + hidden-persps))) + +(defun persp-unhide (names) + (interactive "i") + (unless (listp names) (setq names (list names))) + (unless names + (let ((hidden-persps + (mapcar #'safe-persp-name + (cl-delete-if-not #'safe-persp-hidden + (persp-persps))))) + (setq names + (persp-read-persp + "to unhide" t (car hidden-persps) t nil nil hidden-persps t)))) + (when names + (mapc #'(lambda (pn) + (let ((persp (persp-get-by-name pn))) + (when (persp-p persp) + (if persp + (setf (persp-hidden persp) nil) + (setq persp-nil-hidden nil))))) + names))) + +(cl-defun persp-kill (names &optional dont-kill-buffers + (called-interactively-p (called-interactively-p 'any))) + (interactive "i") + (when (and called-interactively-p current-prefix-arg) + (setq dont-kill-buffers (not dont-kill-buffers))) + (unless (listp names) (setq names (list names))) + (unless names + (setq names (persp-read-persp + (concat "to kill" + (and dont-kill-buffers " not killing buffers")) + t (safe-persp-name (get-current-persp)) t))) + (mapc #'(lambda (pn) + (let ((persp (persp-get-by-name pn))) + (when (persp-p persp) + (when (or (not called-interactively-p) + (not (null persp)) + (yes-or-no-p + "Really kill the 'nil' perspective (It'l kill all buffers)?")) + (let ((pfile (persp-parameter 'persp-file persp))) + (cl-case persp-auto-save-persps-to-their-file-before-kill + (persp-file nil) + ('nil (setq pfile nil)) + (t (unless pfile + (setq pfile persp-auto-save-fname)))) + (when pfile + (persp-save-to-file-by-names + pfile *persp-hash* (list pn) t nil))) + (run-hook-with-args 'persp-before-kill-functions persp) + (let (persp-autokill-persp-when-removed-last-buffer) + (if dont-kill-buffers + (let (persp-autokill-buffer-on-remove) + (mapc #'(lambda (b) + (persp-remove-buffer b persp t t nil nil)) + (safe-persp-buffers persp))) + (mapc #'(lambda (b) + (persp-remove-buffer b persp t t nil nil)) + (safe-persp-buffers persp)))) + (when persp + (persp-remove-by-name pn)))))) + names)) + +(defun persp-kill-without-buffers (names) + (interactive "i") + (persp-kill names t nil)) + +(cl-defun persp-save-and-kill + (names &optional dont-kill-buffers + (called-interactively-p (called-interactively-p 'any))) + (interactive "i") + (when (and called-interactively-p current-prefix-arg) + (setq dont-kill-buffers (not dont-kill-buffers))) + (unless (listp names) (setq names (list names))) + (unless names + (setq names (persp-read-persp + (concat "to save and kill" + (and dont-kill-buffers " not killing buffers")) + t (safe-persp-name (get-current-persp)) t))) + (let ((temphash (make-hash-table :test 'equal :size 10))) + (mapc #'(lambda (p) + (persp-add p temphash)) + (mapcar #'(lambda (pn) (persp-get-by-name pn)) names)) + (persp-save-state-to-file persp-auto-save-fname temphash + persp-auto-save-persps-to-their-file + 'yes))) + +(cl-defun persp-rename (new-name + &optional (persp (get-current-persp)) (phash *persp-hash*)) + "Change the name field of the `PERSP'. +Return old name on success, otherwise nil." + (interactive "i") + (if persp + (let ((opersp (persp-get-by-name new-name phash)) + (old-name (safe-persp-name persp))) + (unless new-name + (setq new-name + (read-string + (concat "New name for the " old-name " perspective: ") old-name))) + (if (and (not (persp-p opersp)) new-name + (not (equal old-name new-name))) + (progn + (when (eq phash *persp-hash*) + (persp-remove-from-menu persp)) + (remhash old-name phash) + (setf (persp-name persp) new-name) + (puthash new-name persp phash) + (when (eq phash *persp-hash*) + (persp-add-to-menu persp) + (run-hook-with-args + 'persp-renamed-functions persp old-name new-name)) + old-name) + (message + "[persp-mode] Error: There is already a perspective with that name: %S." + new-name) + nil)) + (message + "[persp-mode] Error: You can't rename the `nil' perspective, use \ +M-x: customize-variable RET persp-nil-name RET") + nil)) + +(cl-defun persp-switch + (name &optional frame (window (selected-window)) + (called-interactively-p (called-interactively-p 'any))) + "Switch to the perspective with name `NAME'. +If there is no perspective with that name it will be created. +Return `NAME'." + (interactive "i") + (let ((switch-type 'frame)) + (if (or (window-persp-set-p window) + (and called-interactively-p current-prefix-arg)) + (setq switch-type 'window) + (unless frame (setq frame (window-frame window)))) + (if (eq 'window switch-type) + (persp-window-switch name window) + (persp-frame-switch name frame)))) +(cl-defun persp-frame-switch (name &optional (frame (selected-frame))) + (interactive "i") + (unless name + (setq name (persp-read-persp "to switch(in frame)" nil nil nil nil t))) + (unless (memq frame persp-inhibit-switch-for) + (run-hook-with-args 'persp-before-switch-functions name frame) + (let ((persp-inhibit-switch-for (cons frame persp-inhibit-switch-for))) + (persp-activate (persp-add-new name) frame))) + name) +(cl-defun persp-window-switch (name &optional (window (selected-window))) + (interactive "i") + (unless name + (setq name (persp-read-persp "to switch(in window)" nil nil nil nil t))) + (unless (memq window persp-inhibit-switch-for) + (run-hook-with-args 'persp-before-switch-functions name window) + (let ((persp-inhibit-switch-for (cons window persp-inhibit-switch-for))) + (persp-activate (persp-add-new name) window))) + name) + +(defun persp-before-make-frame () + (let ((persp (persp-get-by-name + (or (and persp-set-last-persp-for-new-frames + persp-last-persp-name) + persp-nil-name)))) + (unless (persp-p persp) + (when persp-set-last-persp-for-new-frames + (setq persp-last-persp-name persp-nil-name)) + (setq persp (persp-add-new persp-nil-name))) + (persp-save-state persp nil t))) + +(defun persp--do-auto-action-if-needed (persp) + (when (and (safe-persp-auto persp) + persp-autokill-persp-when-removed-last-buffer + (null (safe-persp-buffers persp))) + (cond + ((functionp persp-autokill-persp-when-removed-last-buffer) + (funcall persp-autokill-persp-when-removed-last-buffer persp)) + ((or + (eq 'hide persp-autokill-persp-when-removed-last-buffer) + (and (eq 'hide-auto persp-autokill-persp-when-removed-last-buffer) + (safe-persp-auto persp))) + (persp-hide (safe-persp-name persp))) + ((or + (eq t persp-autokill-persp-when-removed-last-buffer) + (eq 'kill persp-autokill-persp-when-removed-last-buffer) + (and + (eq 'kill-auto persp-autokill-persp-when-removed-last-buffer) + (safe-persp-auto persp))) + (persp-kill (safe-persp-name persp) nil nil))))) + +(defsubst persp--deactivate (frame-or-window &optional new-persp) + (let (persp) + (cl-typecase frame-or-window + (frame + (setq persp (get-frame-persp frame-or-window)) + (unless (eq persp new-persp) + (with-selected-frame frame-or-window + (run-hook-with-args 'persp-before-deactivate-functions 'frame)) + (persp-frame-save-state + frame-or-window + (if persp-set-last-persp-for-new-frames + (equal (safe-persp-name persp) persp-last-persp-name) + (null persp))))) + (window + (setq persp (get-window-persp frame-or-window)) + (unless (eq persp new-persp) + (with-selected-window frame-or-window + (run-hook-with-args 'persp-before-deactivate-functions 'window))))) + (let ((persp-inhibit-switch-for + (cons frame-or-window persp-inhibit-switch-for))) + (persp--do-auto-action-if-needed persp)))) + +(cl-defun persp-activate + (persp &optional (frame-or-window (selected-frame)) new-frame-p) + (when frame-or-window + (let (old-persp type) + (cl-typecase frame-or-window + (frame + (setq old-persp (get-frame-persp frame-or-window) + type 'frame)) + (window + (setq old-persp (get-window-persp frame-or-window) + type 'window))) + (when (or new-frame-p + (not (eq old-persp persp))) + (unless new-frame-p + (persp--deactivate frame-or-window persp)) + (cl-case type + (frame + (setq persp-last-persp-name (safe-persp-name persp)) + (set-frame-persp persp frame-or-window) + (when persp-init-frame-behaviour + (persp-restore-window-conf frame-or-window persp new-frame-p)) + (with-selected-frame frame-or-window + (run-hook-with-args 'persp-activated-functions 'frame))) + (window + (set-window-persp persp frame-or-window) + (let ((cbuf (window-buffer frame-or-window))) + (unless (persp-contain-buffer-p cbuf persp) + (persp-set-another-buffer-for-window cbuf frame-or-window persp))) + (with-selected-window frame-or-window + (run-hook-with-args 'persp-activated-functions 'window)))))))) + +(defun persp-init-new-frame (frame) + (condition-case-unless-debug err + (persp-init-frame frame t (frame-parameter frame 'client)) + (error + (message "[persp-mode] Error: Can not initialize frame -- %S" + err)))) +(cl-defun persp-init-frame (frame &optional new-frame-p client) + (let ((persp-init-frame-behaviour + (cond + ((and client + (not (eql -1 persp-emacsclient-init-frame-behaviour-override))) + persp-emacsclient-init-frame-behaviour-override) + ((and (eq this-command 'make-frame) + (not (eql -1 persp-interactive-init-frame-behaviour-override))) + persp-interactive-init-frame-behaviour-override) + ((and new-frame-p (not (eql -1 persp-init-new-frame-behaviour-override))) + persp-init-new-frame-behaviour-override) + (t persp-init-frame-behaviour)))) + (let (persp-name persp) + (cl-macrolet + ((set-default-persp + () + `(progn + (setq persp-name (or (and persp-set-last-persp-for-new-frames + persp-last-persp-name) + persp-nil-name) + persp (persp-get-by-name persp-name)) + (unless (persp-p persp) + (setq persp-name persp-nil-name + persp (persp-add-new persp-name)))))) + (cl-typecase persp-init-frame-behaviour + (function + (funcall persp-init-frame-behaviour frame new-frame-p)) + (string + (setq persp-name persp-init-frame-behaviour + persp (persp-add-new persp-name))) + (symbol + (cl-case persp-init-frame-behaviour + (auto-temp (setq persp-name (persp-gen-random-name) + persp (persp-add-new persp-name)) + (when persp + (setf (persp-auto persp) t))) + (prompt (select-frame frame) + (setq persp-name + (persp-read-persp "to switch" nil nil nil nil t) + persp (persp-add-new persp-name))) + (t (set-default-persp)))) + (t (set-default-persp)))) + (when persp-name + (modify-frame-parameters frame `((persp . nil))) + (when persp-set-frame-buffer-predicate + (persp-set-frame-buffer-predicate frame)) + (persp-set-frame-server-switch-hook frame) + (when (or (eq persp-init-frame-behaviour 'persp-ignore-wconf) + (eq persp-init-frame-behaviour 'persp-ignore-wconf-once)) + (set-frame-parameter frame persp-init-frame-behaviour t)) + (persp-activate persp frame new-frame-p))))) + +(defun persp-delete-frame (frame) + (condition-case-unless-debug err + (persp--deactivate frame persp-not-persp) + (error + (message "[persp-mode] Error: Can not deactivate frame -- %S" + err)))) + +;; TODO: rename +(cl-defun find-other-frame-with-persp (&optional (persp (get-frame-persp)) + (exframe (selected-frame)) + for-save) + (let ((flist (delq exframe (persp-frames-with-persp persp)))) + (cl-find-if + #'(lambda (f) + (and f + (if for-save + (and (not (frame-parameter f 'persp-ignore-wconf)) + (not (frame-parameter f 'persp-ignore-wconf-once))) + t) + (eq persp (get-frame-persp f)))) + flist))) + + +;; Helper funcs: + +(defun persp-add-minor-mode-menu () + (easy-menu-define persp-minor-mode-menu + persp-mode-map + "The menu for the `persp-mode'." + '("Perspectives" + "-"))) + +(defun persp-remove-from-menu (persp) + (let ((name (safe-persp-name persp))) + (cl-psetq persp-names-cache (cl-delete name persp-names-cache :count 1)) + (easy-menu-remove-item persp-minor-mode-menu nil name) + (when persp + (easy-menu-remove-item persp-minor-mode-menu '("kill") name)))) + +(defun persp-add-to-menu (persp) + (let ((name (safe-persp-name persp))) + (cl-psetq persp-names-cache + (append persp-names-cache (list name))) + (let ((str_name name)) + (easy-menu-add-item persp-minor-mode-menu nil + (vector str_name #'(lambda () (interactive) + (persp-switch str_name)))) + (when persp + (easy-menu-add-item persp-minor-mode-menu '("kill") + (vector str_name #'(lambda () (interactive) + (persp-kill str_name)))))))) + +(cl-defun persp-read-persp + (&optional action multiple default require-match delnil delcur persp-list + show-hidden (default-mode t)) + + "Read perspective name(s)." + + (when persp-names-sort-before-read-function + (cl-psetq persp-names-cache + (funcall persp-names-sort-before-read-function + persp-names-cache))) + + (cl-psetq persp-list + (if persp-list + (cl-delete-if-not #'(lambda (pn) (member pn persp-list)) + (persp-names-current-frame-fast-ordered)) + (persp-names-current-frame-fast-ordered))) + + (when delnil + (setq persp-list (cl-delete persp-nil-name persp-list :count 1))) + (when delcur + (setq persp-list (cl-delete (safe-persp-name (get-current-persp)) persp-list :count 1))) + (unless show-hidden + (setq persp-list + (cl-delete-if #'safe-persp-hidden persp-list :key #'persp-get-by-name))) + (when (and default (not (member default persp-list))) + (setq default nil)) + (let (retlst) + (cl-macrolet + ((call-pif + () + `(funcall + persp-interactive-completion-function + (concat + "Perspective name" (and multiple "s") (and action " ") action + (if default (concat " (default " default ")") "") + (when retlst + (concat "< " (mapconcat #'identity retlst " ") " > ")) + ": ") + persp-list nil require-match nil nil default))) + (if multiple + (let ((done_str "[>done<]") (not-finished default-mode) + exit-minibuffer-function mb-local-key-map + (push-keys (alist-get 'push-item persp-read-multiple-keys)) + (pop-keys (alist-get 'pop-item persp-read-multiple-keys)) + push-keys-backup pop-keys-backup) + (while (member done_str persp-list) + (setq done_str (concat ">" done_str))) + (let ((persp-minibuffer-setup + #'(lambda () + (setq mb-local-key-map (current-local-map)) + (when (keymapp mb-local-key-map) + (unless exit-minibuffer-function + (setq exit-minibuffer-function + (or (lookup-key mb-local-key-map (kbd "RET")) + persp-read-multiple-exit-minibuffer-function))) + (unless push-keys-backup + (setq push-keys-backup + (lookup-key mb-local-key-map push-keys))) + (define-key mb-local-key-map push-keys + #'(lambda () (interactive) + (setq not-finished 'push) + (funcall exit-minibuffer-function))) + (unless pop-keys-backup + (setq pop-keys-backup + (lookup-key mb-local-key-map pop-keys))) + (define-key mb-local-key-map pop-keys + #'(lambda () (interactive) + (setq not-finished 'pop) + (funcall exit-minibuffer-function)))))) + cp) + (unwind-protect + (progn + (add-hook 'minibuffer-setup-hook persp-minibuffer-setup t) + (while not-finished + (setq cp (call-pif)) + (cl-case not-finished + (push + (when (and cp (member cp persp-list)) + (if retlst + (when (string= cp done_str) + (setq not-finished nil)) + (push done_str persp-list)) + (when not-finished + (if (eq 'reverse multiple) + (setq retlst (append retlst (list cp))) + (push cp retlst)) + (setq persp-list (cl-delete cp persp-list :count 1) + default done_str))) + (when not-finished + (setq not-finished default-mode))) + (pop + (let ((last-item (pop retlst))) + (unless retlst (setq persp-list (cl-delete done_str persp-list :count 1) + default nil)) + (when last-item + (push last-item persp-list))) + (setq not-finished default-mode)) + (t + (when (and cp (not (string= cp done_str)) + (member cp persp-list)) + (push cp retlst)) + (setq not-finished nil))))) + (remove-hook 'minibuffer-setup-hook persp-minibuffer-setup) + (when (keymapp mb-local-key-map) + (when (lookup-key mb-local-key-map push-keys) + (define-key mb-local-key-map push-keys push-keys-backup)) + (when (lookup-key mb-local-key-map pop-keys) + (define-key mb-local-key-map pop-keys pop-keys-backup))))) + retlst) + (call-pif))))) +(define-obsolete-function-alias 'persp-prompt 'persp-read-persp "persp-mode 2.9") + +(defsubst persp--set-frame-buffer-predicate-buffer-list-cache (buflist) + (prog1 + (setq persp-frame-buffer-predicate-buffer-list-cache buflist) + (unless persp-frame-buffer-predicate-buffer-list-cache + (setq persp-frame-buffer-predicate-buffer-list-cache :nil)) + (run-at-time + 2 nil #'(lambda () + (setq persp-frame-buffer-predicate-buffer-list-cache nil))))) +(defmacro persp--get-frame-buffer-predicate-buffer-list-cache (buflist) + `(if persp-frame-buffer-predicate-buffer-list-cache + (if (eq :nil persp-frame-buffer-predicate-buffer-list-cache) + nil + persp-frame-buffer-predicate-buffer-list-cache) + (persp--set-frame-buffer-predicate-buffer-list-cache ,buflist))) +(defun persp-generate-frame-buffer-predicate (opt) + (if opt + (eval + `(lambda (b) + (if (string-prefix-p " *temp*" (buffer-name (current-buffer))) + t + ,(cl-typecase opt + (function + `(funcall (with-no-warnings ',opt) b)) + (number + `(let ((*persp-restrict-buffers-to* ,opt)) + (memq + b (persp--get-frame-buffer-predicate-buffer-list-cache + (let ((ret + (persp-buffer-list-restricted + (selected-frame) ,opt + persp-restrict-buffers-to-if-foreign-buffer t))) + (if (get-current-persp) + ret + (cl-delete-if #'persp-buffer-filtered-out-p ret))))))) + (symbol + (cl-case opt + ('nil t) + (restricted-buffer-list + '(progn + (memq + b (persp--get-frame-buffer-predicate-buffer-list-cache + (let ((ret + (persp-buffer-list-restricted + (selected-frame) + *persp-restrict-buffers-to* + persp-restrict-buffers-to-if-foreign-buffer + t))) + (if (get-current-persp) + ret + (cl-delete-if #'persp-buffer-filtered-out-p ret))))))) + (t '(memq + b (persp--get-frame-buffer-predicate-buffer-list-cache + (let ((ret (safe-persp-buffers (get-current-persp)))) + (if (get-current-persp) + ret + (cl-delete-if #'persp-buffer-filtered-out-p ret)))))))) + (t t))))) + nil)) + +(defun persp-set-frame-buffer-predicate (frame &optional off) + (let ((old-pred (frame-parameter frame 'persp-buffer-predicate-old)) + (cur-pred (frame-parameter frame 'buffer-predicate)) + (last-persp-pred + (frame-parameter frame 'persp-buffer-predicate-generated))) + (let (new-pred) + (if off + (progn + (set-frame-parameter frame 'persp-buffer-predicate-old nil) + (set-frame-parameter frame 'persp-buffer-predicate-generated nil) + (setq new-pred (if (eq cur-pred last-persp-pred) old-pred cur-pred)) + (set-frame-parameter frame 'buffer-predicate new-pred)) + (unless persp-frame-buffer-predicate + (setq persp-frame-buffer-predicate + (persp-generate-frame-buffer-predicate + persp-set-frame-buffer-predicate))) + (if persp-frame-buffer-predicate + (progn + (set-frame-parameter frame 'persp-buffer-predicate-old + (if (eq cur-pred last-persp-pred) + old-pred (setq old-pred cur-pred))) + (setq new-pred + (cl-case old-pred + ('nil persp-frame-buffer-predicate) + (t `(lambda (b) + (and + (funcall (with-no-warnings + ',persp-frame-buffer-predicate) + b) + (funcall (with-no-warnings ',old-pred) b)))))) + (unless (symbolp new-pred) + (setq new-pred (with-no-warnings + (let ((warning-minimum-level :emergency) + byte-compile-warnings) + (byte-compile new-pred))))) + (set-frame-parameter + frame 'persp-buffer-predicate-generated new-pred) + (set-frame-parameter frame 'buffer-predicate new-pred)) + (persp-set-frame-buffer-predicate frame t)))))) + +(defun persp-update-frames-buffer-predicate (&optional off) + (unless off + (setq persp-frame-buffer-predicate nil) + (persp-update-frames-buffer-predicate t)) + (mapc #'(lambda (f) (persp-set-frame-buffer-predicate f off)) + (persp-frame-list-without-daemon))) + + +(defun persp-generate-frame-server-switch-hook (opt) + (if opt + (eval + `(lambda (frame) + ,(if (functionp opt) + `(funcall (with-no-warnings ',opt) frame) + `(let* ((frame-client (frame-parameter frame 'client)) + (frame-client-bl (when (processp frame-client) + (process-get frame-client 'buffers)))) + ,(cl-case opt + (only-file-windows + `(if frame-client + (when frame-client-bl + (mapc #'(lambda (w) + (unless (memq (window-buffer w) + frame-client-bl) + (delete-window w))) + (window-list frame 'no-minibuf))) + (let (frame-server-bl) + (mapc #'(lambda (proc) + (setq frame-server-bl + (append frame-server-bl + (process-get proc 'buffers)))) + (server-clients-with 'frame nil)) + (when frame-server-bl + (mapc #'(lambda (w) + (unless (memq (window-buffer w) + frame-server-bl) + (delete-window w))) + (window-list frame 'no-minibuf)))))) + (only-file-windows-for-client-frame + `(when frame-client-bl + (mapc #'(lambda (w) + (unless (memq (window-buffer w) frame-client-bl) + (delete-window w))) + (window-list frame 'no-minibuf)))) + (t nil)))))) + nil)) + +(defun persp-set-frame-server-switch-hook (frame) + (when (frame-parameter frame 'client) + (set-frame-parameter + frame 'persp-server-switch-hook persp-frame-server-switch-hook))) + +(defun persp-update-frame-server-switch-hook () + (setq persp-frame-server-switch-hook + (persp-generate-frame-server-switch-hook persp-server-switch-behaviour)) + (mapc #'persp-set-frame-server-switch-hook + (persp-frame-list-without-daemon))) + + +(defun persp-ido-setup () + (when (eq ido-cur-item 'buffer) + (setq persp-disable-buffer-restriction-once nil))) + +(defun persp-restrict-ido-buffers () + "Support for the `ido-mode'." + (let ((buffer-names-sorted + (if persp-disable-buffer-restriction-once + (mapcar #'buffer-name (persp-buffer-list-restricted nil -1 nil)) + (mapcar #'buffer-name (persp-buffer-list-restricted)))) + (indices (make-hash-table))) + (let ((i 0)) + (dolist (elt ido-temp-list) + (puthash elt i indices) + (setq i (1+ i)))) + (setq ido-temp-list + (sort buffer-names-sorted #'(lambda (a b) + (< (gethash a indices 10000) + (gethash b indices 10000))))))) + +;; TODO: rename +(defun ido-toggle-persp-filter () + (interactive) + (setq persp-disable-buffer-restriction-once + (not persp-disable-buffer-restriction-once) + ido-text-init ido-text ido-exit 'refresh) + (exit-minibuffer)) + + +(cl-defun persp-read-buffer + (prompt &optional default require-match predicate multiple (default-mode t)) + + "Read buffers with restriction." + + (setq persp-disable-buffer-restriction-once nil) + + (when default + (unless (stringp default) + (if (and (bufferp default) (buffer-live-p default)) + (setq default (buffer-name default)) + (setq default nil)))) + + (if prompt + (setq prompt (car (split-string prompt ": *$" t))) + (setq prompt "Please provide a buffer name: ")) + + (let* ((buffer-names (mapcar #'buffer-name (persp-buffer-list-restricted))) + cp retlst + (done_str "[>done<]") (not-finished default-mode) + + (push-keys (alist-get 'push-item persp-read-multiple-keys)) + (pop-keys (alist-get 'pop-item persp-read-multiple-keys)) + push-keys-backup pop-keys-backup + (toggle-filter-keys + (alist-get 'toggle-persp-buffer-filter persp-read-multiple-keys)) + toggle-filter-keys-backup + + exit-minibuffer-function mb-local-key-map + (persp-minibuffer-setup + #'(lambda () + (setq mb-local-key-map (current-local-map)) + (when (keymapp mb-local-key-map) + (unless exit-minibuffer-function + (setq exit-minibuffer-function + (or (lookup-key mb-local-key-map (kbd "RET")) + persp-read-multiple-exit-minibuffer-function))) + (unless toggle-filter-keys-backup + (setq toggle-filter-keys-backup + (lookup-key mb-local-key-map toggle-filter-keys))) + (define-key mb-local-key-map toggle-filter-keys + #'(lambda () (interactive) + (setq not-finished 'toggle-filter) + (funcall exit-minibuffer-function)))))) + (persp-multiple-minibuffer-setup + #'(lambda () + (when (keymapp mb-local-key-map) + (unless push-keys-backup + (setq push-keys-backup + (lookup-key mb-local-key-map push-keys))) + (define-key mb-local-key-map push-keys + #'(lambda () (interactive) + (setq not-finished 'push) + (funcall exit-minibuffer-function))) + (unless pop-keys-backup + (setq pop-keys-backup + (lookup-key mb-local-key-map pop-keys))) + (define-key mb-local-key-map pop-keys + #'(lambda () (interactive) + (setq not-finished 'pop) + (funcall exit-minibuffer-function))))))) + + (while (member done_str buffer-names) + (setq done_str (concat ">" done_str))) + + (unwind-protect + (progn + (when (and default (not (member default buffer-names))) + (push default buffer-names) + ;; TODO: remove this + ;; (setq default nil) + ) + (when multiple + (add-hook 'minibuffer-setup-hook persp-multiple-minibuffer-setup)) + (add-hook 'minibuffer-setup-hook persp-minibuffer-setup) + (while not-finished + (setq cp + (funcall + persp-interactive-completion-function + (concat prompt + (and default (concat "(default " default ")")) + (and retlst + (concat + "< " (mapconcat #'identity retlst " ") " >")) + (and persp-toggle-read-buffer-filter-keys + (concat + " [`" + (help-key-description + persp-toggle-read-buffer-filter-keys + nil) + "' toggles filter]")) + ": ") + buffer-names predicate require-match nil nil default)) + (cl-case not-finished + (push + (when (and cp (member cp buffer-names)) + (if retlst + (when (string= cp done_str) + (setq not-finished nil)) + (push done_str buffer-names)) + (when not-finished + (if (eq 'reverse multiple) + (setq retlst (append retlst (list cp))) + (push cp retlst)) + (setq buffer-names (cl-delete cp buffer-names :count 1) + default done_str))) + (when not-finished + (setq not-finished default-mode))) + (pop + (let ((last-item (pop retlst))) + (unless retlst (setq buffer-names (cl-delete done_str buffer-names :count 1) + default nil)) + (when last-item + (push last-item buffer-names))) + (setq not-finished default-mode)) + (toggle-filter + (setq persp-disable-buffer-restriction-once + (not persp-disable-buffer-restriction-once)) + (setq buffer-names + (cl-delete-if + #'(lambda (bn) (member bn retlst)) + (mapcar #'buffer-name + (if persp-disable-buffer-restriction-once + (funcall persp-buffer-list-function) + (cl-delete-if #'persp-buffer-filtered-out-p + (persp-buffer-list-restricted)))))) + (setq not-finished default-mode)) + (t + (when (and cp (not (string= cp done_str)) + (member cp buffer-names)) + (push cp retlst)) + (setq not-finished nil)))) + (if multiple retlst (car retlst))) + (remove-hook 'minibuffer-setup-hook persp-multiple-minibuffer-setup) + (remove-hook 'minibuffer-setup-hook persp-minibuffer-setup) + (when (keymapp mb-local-key-map) + (when multiple + (when (lookup-key mb-local-key-map push-keys) + (define-key mb-local-key-map push-keys push-keys-backup)) + (when (lookup-key mb-local-key-map pop-keys) + (define-key mb-local-key-map pop-keys pop-keys-backup))) + (when (lookup-key mb-local-key-map toggle-filter-keys) + (define-key mb-local-key-map toggle-filter-keys + toggle-filter-keys-backup))) + (setq persp-disable-buffer-restriction-once nil)))) + + +;; Save/Load funcs: + +(defun persp-delete-other-windows () + (let ((win (selected-window))) + (when (or (window-parameter win 'window-side) + (window-minibuffer-p win)) + (setq win (cl-loop + for win in (window-list nil 1) + unless (window-parameter win 'window-side) + return win))) + (when win + (let ((ignore-window-parameters t)) + (condition-case-unless-debug err + (delete-other-windows win) + (error + (message "[persp-mode] Warning: Can not delete-other-windows -- %S" err))))))) + +(cl-defun persp-restore-window-conf (&optional (frame (selected-frame)) + (persp (get-frame-persp frame)) + new-frame-p) + (when new-frame-p (sit-for 0.01)) + (unless (run-hook-with-args-until-success 'persp-restore-window-conf-filter-functions + frame persp new-frame-p) + (with-selected-frame frame + (let ((pwc (safe-persp-window-conf persp)) + (split-width-threshold 2) + (split-height-threshold 2) + (window-safe-min-height 1) + (window-safe-min-width 1) + (window-min-height 1) + (window-min-width 1) + (window-resize-pixelwise t) + (gr-mode (and (boundp 'golden-ratio-mode) golden-ratio-mode))) + (when gr-mode + (golden-ratio-mode -1)) + (unwind-protect + (cond + ((functionp persp-restore-window-conf-method) + (funcall persp-restore-window-conf-method frame persp new-frame-p)) + ((null persp-restore-window-conf-method) nil) + (t + (if pwc + (progn + (persp-delete-other-windows) + (set-window-dedicated-p nil nil) + (condition-case-unless-debug err + (funcall persp-window-state-put-function pwc frame) + (error + (message + "[persp-mode] Warning: Can not restore the window \ +configuration, because of the error -- %S" err) + (let* ((cw (selected-window)) + (cwb (window-buffer cw))) + (unless (persp-contain-buffer-p cwb persp) + (persp-set-another-buffer-for-window + cwb cw persp))))) + (when (and new-frame-p persp-is-ibc-as-f-supported) + (setq initial-buffer-choice + #'(lambda () persp-special-last-buffer)))) + (when persp-reset-windows-on-nil-window-conf + (if (functionp persp-reset-windows-on-nil-window-conf) + (funcall persp-reset-windows-on-nil-window-conf) + (persp-delete-other-windows) + (set-window-dedicated-p nil nil) + (let* ((pbs (safe-persp-buffers persp)) + (w (selected-window)) + (wb (window-buffer w))) + (when (and pbs (not (memq wb pbs))) + (persp-set-another-buffer-for-window wb w persp)))))))) + (when gr-mode + (golden-ratio-mode 1))))))) + + +;; Save funcs + +(cl-defun persp-frame-save-state + (&optional (frame (selected-frame)) set-persp-special-last-buffer) + (when (and (frame-live-p frame) + (not (persp-is-frame-daemons-frame frame)) + (not (frame-parameter frame 'persp-ignore-wconf)) + (not (frame-parameter frame 'persp-ignore-wconf-once))) + (let ((persp (get-frame-persp frame))) + (with-selected-frame frame + (when set-persp-special-last-buffer + (persp-special-last-buffer-make-current)) + (if persp + (setf (persp-window-conf persp) + (funcall persp-window-state-get-function frame)) + (setq persp-nil-wconf + (funcall persp-window-state-get-function frame))))))) + +(cl-defun persp-save-state + (&optional (persp (get-frame-persp)) exfr set-persp-special-last-buffer) + (let ((frame (selected-frame))) + (when (eq frame exfr) (setq frame nil)) + (unless (and frame (eq persp (get-frame-persp frame))) + (setq frame (find-other-frame-with-persp persp exfr t))) + (when frame (persp-frame-save-state frame set-persp-special-last-buffer)))) + + +(defun persp-buffers-to-savelist (persp) + (cl-delete-if + #'symbolp + (let (find-ret) + (mapcar #'(lambda (b) + (setq find-ret nil) + (cl-find-if #'(lambda (sl) (when sl (setq find-ret sl))) + persp-save-buffer-functions + :key #'(lambda (s-f) (with-current-buffer b + (funcall s-f b)))) + find-ret) + (if persp + (persp-buffers persp) + (cl-delete-if-not #'persp-buffer-free-p + (funcall persp-buffer-list-function))))))) + +(defun persp-window-conf-to-savelist (persp) + `(def-wconf ,(if (or persp-use-workgroups + (not (version< emacs-version "24.4"))) + (safe-persp-window-conf persp) + nil))) + +(defun persp-elisp-object-readable-p (obj) + (let (print-length print-level) + (or (stringp obj) + (not (string-match-p "#<.*?>" (prin1-to-string obj)))))) + +(defun persp-parameters-to-savelist (persp) + `(def-params ,(cl-remove-if + #'(lambda (param) + (and (not (persp-elisp-object-readable-p param)) + (message "[persp-mode] Info: The parameter %S \ +of the perspective %S can't be saved." + param (safe-persp-name persp)) + t)) + (safe-persp-parameters persp)))) + +(defun persp-to-savelist (persp) + `(def-persp ,(and persp (persp-name persp)) + ,(persp-buffers-to-savelist persp) + ,(persp-window-conf-to-savelist persp) + ,(persp-parameters-to-savelist persp) + ,(safe-persp-weak persp) + ,(safe-persp-auto persp) + ,(safe-persp-hidden persp))) + +(defun persps-to-savelist (&optional phash names-regexp) + (mapcar + #'persp-to-savelist + (cl-delete-if + (apply-partially #'persp-parameter 'dont-save-to-file) + (if (eq phash *persp-hash*) + (mapcar #'(lambda (pn) + (when (or (not names-regexp) + (persp-string-match-p names-regexp pn)) + (persp-get-by-name pn *persp-hash* nil))) + (persp-names-current-frame-fast-ordered)) + (persp-persps (or phash *persp-hash*) names-regexp t))))) + +(defsubst persp-save-with-backups (fname) + (when (and (string= fname + (concat (expand-file-name persp-save-dir) + persp-auto-save-fname)) + (> persp-auto-save-num-of-backups 0)) + (cl-do ((cur persp-auto-save-num-of-backups (1- cur)) + (prev (1- persp-auto-save-num-of-backups) (1- prev))) + ((> 1 cur) nil) + (let ((cf (concat fname (number-to-string cur))) + (pf (concat fname (if (> prev 0) + (number-to-string prev) + "")))) + (when (file-exists-p pf) + (when (file-exists-p cf) + (delete-file cf)) + (rename-file pf cf t)))) + (when (file-exists-p fname) + (rename-file fname (concat fname (number-to-string 1)) t))) + (write-file fname nil) + t) + +(cl-defun persp-save-state-to-file + (&optional + (fname persp-auto-save-fname) (phash *persp-hash*) + (respect-persp-file-parameter persp-auto-save-persps-to-their-file) + (keep-others-in-non-parametric-file 'no)) + (interactive (list (read-file-name "Save perspectives to a file: " + persp-save-dir ""))) + (when (and (stringp fname) phash) + (when (< (string-width (file-name-nondirectory fname)) 1) + (message "[persp-mode] Error: You must provide nonempty filename to save perspectives.") + (cl-return-from persp-save-state-to-file nil)) + (let* ((p-save-dir (or (file-name-directory fname) + (expand-file-name persp-save-dir))) + (p-save-file (concat p-save-dir (file-name-nondirectory fname)))) + (unless (and (file-exists-p p-save-dir) + (file-directory-p p-save-dir)) + (message "[persp-mode] Info: Trying to create the `persp-conf-dir'.") + (make-directory p-save-dir t)) + (if (not (and (file-exists-p p-save-dir) + (file-directory-p p-save-dir))) + (progn + (message "[persp-mode] Error: Can't save perspectives -- \ +`persp-save-dir' does not exists or not a directory %S." p-save-dir) + nil) + (mapc #'persp-save-state (persp-persps phash)) + (run-hook-with-args 'persp-before-save-state-to-file-functions + fname phash respect-persp-file-parameter) + (if (and respect-persp-file-parameter + (cl-member-if (apply-partially #'persp-parameter 'persp-file) + (persp-persps phash nil))) + (let (persp-auto-save-persps-to-their-file + persp-before-save-state-to-file-functions) + (mapc #'(lambda (gr) + (cl-destructuring-bind (pfname . pl) gr + (let ((names (mapcar #'safe-persp-name pl))) + (if pfname + (persp-save-to-file-by-names + pfname phash names 'yes nil) + (persp-save-to-file-by-names + p-save-file phash names + keep-others-in-non-parametric-file nil))))) + (persp-group-by + (apply-partially #'persp-parameter 'persp-file) + (persp-persps phash nil t) t))) + (with-temp-buffer + (buffer-disable-undo) + (erase-buffer) + (goto-char (point-min)) + (insert + ";; -*- mode: emacs-lisp; eval: (progn (pp-buffer) (indent-buffer)) -*-") + (newline) + (insert (let (print-length print-level) + (pp-to-string (persps-to-savelist phash)))) + (persp-save-with-backups p-save-file))))))) + +(cl-defun persp-save-to-file-by-names + (&optional (fname persp-auto-save-fname) (phash *persp-hash*) names + keep-others (called-interactively-p (called-interactively-p 'any))) + (interactive) + (unless names + (setq names + (persp-read-persp + "to save" 'reverse (safe-persp-name (get-current-persp)) + t nil nil nil nil 'push))) + (when (or (not fname) called-interactively-p) + (setq fname (read-file-name + (format "Save a subset of perspectives%s to a file: " names) + persp-save-dir))) + (when names + (unless keep-others + (setq keep-others + (if (and (file-exists-p fname) + (yes-or-no-p "Keep other perspectives in the file?")) + 'yes 'no))) + (let ((temphash (make-hash-table :test 'equal :size 10)) + (persp-nil-wconf persp-nil-wconf) + (persp-nil-parameters (copy-tree persp-nil-parameters)) + (persp-nil-hidden persp-nil-hidden) + bufferlist-diff) + (when (or (eq keep-others 'yes) (eq keep-others t)) + (let ((bufferlist-pre + (mapcar #'(lambda (b) (cons b (persp--buffer-in-persps b))) + (funcall persp-buffer-list-function)))) + (persp-load-state-from-file + fname temphash (cons :not (regexp-opt names))) + (setq bufferlist-diff + (cl-delete-if #'(lambda (bcons) + (when bcons + (cl-destructuring-bind (buf . buf-persps) bcons + (when buf + (persp--buffer-in-persps-set buf buf-persps) + t)))) + (funcall persp-buffer-list-function) + :key #'(lambda (b) (assq b bufferlist-pre)))))) + (mapc #'(lambda (p) + (persp-add p temphash) + (when (and p persp-auto-save-persps-to-their-file) + (set-persp-parameter 'persp-file fname p))) + (mapcar #'(lambda (pn) (persp-get-by-name pn phash)) names)) + (persp-save-state-to-file fname temphash nil) + (mapc #'kill-buffer bufferlist-diff)))) + +(defun persp-tramp-save-buffer (b) + (let* ((buf-f-name (buffer-file-name b)) + (persp-tramp-file-name + (when (and (or (featurep 'tramp) (require 'tramp nil t)) + (tramp-tramp-file-p buf-f-name)) + (let ((dissected-f-name (tramp-dissect-file-name buf-f-name)) + tmh) + (if (tramp-file-name-method dissected-f-name) + (when (and + (or (featurep 'tramp-sh) (require 'tramp-sh nil t)) + (fboundp 'tramp-compute-multi-hops) + (setq tmh + (condition-case-unless-debug err + (tramp-compute-multi-hops dissected-f-name) + (error nil)))) + (let ((persp-tramp-file-name tramp-prefix-format)) + (while tmh + (let* ((hop (car tmh)) + (method (tramp-file-name-method hop)) + (user (tramp-file-name-user hop)) + (host (tramp-file-name-host hop)) + (port (tramp-file-name-port hop)) + (filename (tramp-file-name-localname hop))) + (setq persp-tramp-file-name + (concat + persp-tramp-file-name + method tramp-postfix-method-format + user (when user tramp-postfix-user-format) + host + (when port tramp-prefix-port-format) + port + (if (= (string-width filename) 0) + tramp-postfix-hop-format + (concat + tramp-postfix-host-format filename))) + tmh (cdr tmh)))) + persp-tramp-file-name)) + buf-f-name))))) + (when persp-tramp-file-name + `(def-buffer ,(buffer-name b) + ,persp-tramp-file-name + ,(buffer-local-value 'major-mode b))))) + +;; Load funcs + +(defun persp-update-frames-window-confs (&optional persp-names) + (mapc #'persp-restore-window-conf + (if persp-names + (cl-delete-if-not + #'(lambda (pn) (member pn persp-names)) + (persp-frame-list-without-daemon) + :key #'(lambda (f) (safe-persp-name (get-frame-persp f)))) + (persp-frame-list-without-daemon)))) + +(defmacro persp-car-as-fun-cdr-as-args (lst) + (let ((kar (gensym "lst-car"))) + `(let* ((,kar (car-safe ,lst)) + (args (cdr-safe ,lst)) + (fun (or (condition-case-unless-debug err + (symbol-function ,kar) + (error nil)) + (symbol-value ,kar)))) + (if (functionp fun) + (apply fun args) + (message "[persp-mode] Error: %S is not a function." fun))))) + +(defvar def-buffer nil) +(defun persp-buffer-from-savelist (savelist) + (when (eq (car savelist) 'def-buffer) + (let (persp-add-buffer-on-find-file + buf + (def-buffer + #'(lambda (bname fname mode &optional parameters) + (setq buf (persp-get-buffer-or-null bname)) + (if buf + (if (or (null fname) + (string= fname (buffer-file-name buf))) + buf + (if (file-exists-p fname) + (setq buf (find-file-noselect fname)) + (message + "[persp-mode] Warning: The file %S no longer exists." + fname) + (setq buf nil))) + (if (and fname (file-exists-p fname)) + (with-current-buffer (setq buf (find-file-noselect fname)) + (unless (string= bname (buffer-name buf)) + (rename-buffer bname t))) + (when fname + (message + "[persp-mode] Warning: The file %S no longer exists." + fname)) + (setq buf (get-buffer-create bname)))) + (when (buffer-live-p buf) + (cl-macrolet + ((restorevars + () + `(mapc + #'(lambda (varcons) + (cl-destructuring-bind (vname . vvalue) varcons + (unless (or (eq vname 'buffer-file-name) + (eq vname 'major-mode)) + (set (make-local-variable vname) vvalue)))) + (alist-get 'local-vars parameters)))) + (with-current-buffer buf + (restorevars) + (cond + ((and (boundp 'persp-load-buffer-mode-restore-function) + (variable-binding-locus 'persp-load-buffer-mode-restore-function) + (functionp persp-load-buffer-mode-restore-function)) + (funcall persp-load-buffer-mode-restore-function mode) + (restorevars)) + ((functionp mode) + (when (and (not (eq major-mode mode)) + (not (eq major-mode 'not-loaded-yet))) + (funcall mode) + (restorevars))))))) + buf))) + (condition-case-unless-debug err + (persp-car-as-fun-cdr-as-args savelist) + (error + (message "[persp-mode] Error details: %S" savelist) + (message "[persp-mode] Error: persp-buffer-from-savelist failed to restore a buffer -- %S" err) + buf))))) + +(defun persp-buffers-from-savelist-0 (savelist) + (cl-delete-if-not + #'persp-get-buffer-or-null + (let (find-ret) + (mapcar + #'(lambda (saved-buf) + (setq find-ret nil) + (cl-find-if + #'(lambda (lb) (when lb (setq find-ret lb))) + persp-load-buffer-functions + :key #'(lambda (l-f) + (condition-case-unless-debug err + (funcall l-f saved-buf) + (error + (message "[persp-mode] Error details: %S" saved-buf) + (message "[persp-mode] Error: Failed to resume buffer using %S load buffer function -- %S" l-f err) + nil)))) + find-ret) + savelist)))) + +(defvar def-wconf nil) +(defun persp-window-conf-from-savelist-0 (savelist) + (let ((def-wconf #'identity)) + (persp-car-as-fun-cdr-as-args savelist))) + +(defvar def-params nil) +(defun persp-parameters-from-savelist-0 (savelist) + (let ((def-params #'identity)) + (persp-car-as-fun-cdr-as-args savelist))) + +(defvar def-persp nil) +(defun persp-from-savelist-0 (savelist phash persp-file) + (let ((def-persp + #'(lambda (name dbufs dwc &optional dparams weak auto hidden) + (let* ((pname (or name persp-nil-name)) + (persp (persp-add-new pname phash))) + (mapc #'(lambda (b) + (persp-add-buffer b persp nil nil)) + (condition-case-unless-debug err + (persp-buffers-from-savelist-0 dbufs) + (error + (message "[persp-mode] Error details: %S" dbufs) + (message "[persp-mode] Error: failed to load buffers for %S perspective from %S file -- %S" pname persp-file err) + nil))) + (let ((loaded-wconf + (condition-case-unless-debug err + (persp-window-conf-from-savelist-0 dwc) + (error + (message "[persp-mode] Error details: %S" dwc) + (message "[persp-mode] Error: failed to load window configuration for %S perspective from %S file -- %S" pname persp-file err) + nil)))) + (if (and persp loaded-wconf) + (setf (persp-window-conf persp) loaded-wconf) + (setq persp-nil-wconf loaded-wconf))) + (modify-persp-parameters + (condition-case-unless-debug err + (persp-parameters-from-savelist-0 dparams) + (error + (message "[persp-mode] Error details: %S" dparams) + (message "[persp-mode] Error: Failed to load %S perspective parameters from %S file -- %S" pname persp-file err) + nil)) + persp) + (when persp + (setf (persp-weak persp) weak + (persp-auto persp) auto)) + + (if persp + (setf (persp-hidden persp) hidden) + (setq persp-nil-hidden hidden)) + + (when persp-file + (set-persp-parameter 'persp-file persp-file persp)) + pname)))) + (persp-car-as-fun-cdr-as-args savelist))) + +(defun persps-from-savelist-0 + (savelist phash persp-file set-persp-file names-regexp) + (when (and names-regexp (not (consp names-regexp))) + (setq names-regexp (cons t names-regexp))) + (delq nil + (mapcar #'(lambda (pd) + (condition-case-unless-debug err + (persp-from-savelist-0 pd phash (and set-persp-file persp-file)) + (error + (message "[persp-mode] Error details: %S" pd) + (message "[persp-mode] Error: Can not load a perspective from %S file -- %S" persp-file err) + nil))) + (if names-regexp + (cl-delete-if-not + (apply-partially #'persp-string-match-p names-regexp) + savelist + :key #'(lambda (pd) (or (cadr pd) persp-nil-name))) + savelist)))) + +(defun persp-names-from-savelist-0 (savelist) + (mapcar #'(lambda (pd) (or (cadr pd) persp-nil-name)) savelist)) + +(defun persps-savelist-version-string (savelist) + (let* ((version-list (car savelist)) + (version (or (and (eq (car version-list) + 'def-persp-save-format-version) + (cadr version-list)) + 0))) + (list + (format "%S" version) + (if (eql version 0) + savelist + (cdr savelist))))) + +(defun persp-dispatch-loadf-version (funsym savelist) + (cl-destructuring-bind (version s-list) + (persps-savelist-version-string savelist) + (let ((funame (intern (concat (symbol-name funsym) "-" version)))) + (if (fboundp funame) + (list funame s-list) + (message + "[persp-mode] Warning: Can not find load function for this version: %S." + version) + (list nil s-list))))) + +(defun persps-from-savelist + (savelist phash persp-file set-persp-file names-regexp) + (cl-destructuring-bind (fun s-list) + (persp-dispatch-loadf-version 'persps-from-savelist savelist) + (if fun + (let ((persp-names + (funcall fun s-list phash persp-file set-persp-file names-regexp))) + (run-hook-with-args 'persp-after-load-state-functions persp-file phash + persp-names) + persp-names) + (message + "[persp-mode] Error: Can not load perspectives from savelist: %S +\tloaded from %S" savelist persp-file) + nil))) + +(defun persp-list-persp-names-in-file (fname) + (when (and fname (file-exists-p fname)) + (let* ((pslist (with-temp-buffer + (buffer-disable-undo) + (insert-file-contents fname nil nil nil t) + (goto-char (point-min)) + (read (current-buffer))))) + (cl-destructuring-bind (fun s-list) + (persp-dispatch-loadf-version 'persp-names-from-savelist pslist) + (if fun + (funcall fun s-list) + (message + "[persp-mode] Error: Can not list perspective names in file %S." + fname)))))) + + +(cl-defun persp-load-state-from-file + (&optional (fname persp-auto-save-fname) (phash *persp-hash*) + names-regexp set-persp-file) + (interactive (list (read-file-name "Load perspectives from a file: " + persp-save-dir))) + (when fname + (let ((p-save-file (concat (or (file-name-directory fname) + (expand-file-name persp-save-dir)) + (file-name-nondirectory fname)))) + (if (not (file-exists-p p-save-file)) + (progn (message "[persp-mode] Error: No such file -- %S." p-save-file) + nil) + (let ((readed-list + (with-temp-buffer + (buffer-disable-undo) + (insert-file-contents p-save-file nil nil nil t) + (goto-char (point-min)) + (read (current-buffer))))) + (persps-from-savelist + readed-list phash p-save-file set-persp-file names-regexp)))))) + +(cl-defun persp-load-from-file-by-names (&optional (fname persp-auto-save-fname) + (phash *persp-hash*) + names) + (interactive + (list (read-file-name "Load a subset of perspectives from a file: " + persp-save-dir))) + (unless names + (let* ((p-save-file (concat (or (file-name-directory fname) + (expand-file-name persp-save-dir)) + (file-name-nondirectory fname))) + (available-names (persp-list-persp-names-in-file p-save-file))) + (setq names + (persp-read-persp + "to load" 'reverse nil t nil nil available-names nil 'push)))) + (when names + (let ((names-regexp (regexp-opt names))) + (persp-load-state-from-file fname phash names-regexp t)))) + + +(provide 'persp-mode) + + +;; Local Variables: +;; indent-tabs-mode: nil +;; End: + +;;; persp-mode.el ends here