From fce87dc510f6503091250e90fdb55fc9c034a948 Mon Sep 17 00:00:00 2001 From: KemoNine Date: Thu, 15 Sep 2022 14:58:44 -0400 Subject: [PATCH] update org profile [m]elpa --- org/elpa/archives/melpa/archive-contents | 81 +- .../.dir-locals.el | 0 .../emacs-helm.sh | 0 .../helm-adaptive.el | 0 .../helm-autoloads.el | 0 .../helm-bookmark.el | 0 .../helm-buffers.el | 0 .../helm-color.el | 0 .../helm-comint.el | 0 .../helm-command.el | 0 .../helm-config.el | 0 .../helm-dabbrev.el | 0 .../helm-easymenu.el | 0 .../helm-elisp-package.el | 0 .../helm-elisp.el | 0 .../helm-epa.el | 0 .../helm-eshell.el | 0 .../helm-eval.el | 0 .../helm-external.el | 0 .../helm-fd.el | 0 .../helm-files.el | 0 .../helm-find.el | 0 .../helm-font.el | 0 .../helm-for-files.el | 0 .../helm-global-bindings.el | 0 .../helm-grep.el | 12 +- .../helm-help.el | 0 .../helm-id-utils.el | 0 .../helm-imenu.el | 0 .../helm-info.el | 9 +- .../helm-locate.el | 0 .../helm-man.el | 0 .../helm-misc.el | 0 .../helm-mode.el | 0 .../helm-net.el | 0 .../helm-occur.el | 0 .../helm-pkg.el | 4 +- .../helm-regexp.el | 0 .../helm-ring.el | 0 .../helm-semantic.el | 0 .../helm-shell.el | 0 .../helm-sys.el | 0 .../helm-tags.el | 0 .../helm-types.el | 0 .../helm-utils.el | 0 .../helm-x-files.el | 0 .../helm.el | 0 .../helm-ls-git-pkg.el | 2 - .../helm-ls-git-20220727.505/helm-ls-git.el | 1929 -------- .../helm-ls-git-autoloads.el | 47 - .../helm-ls-git-pkg.el | 2 - .../helm-ls-git-autoloads.el | 0 .../helm-ls-git-pkg.el | 2 + .../helm-ls-git.el | 33 +- .../AUTHORS.md | 0 .../LICENSE | 0 .../dir | 0 .../git-rebase.el | 10 +- .../magit-apply.el | 0 .../magit-autoloads.el | 0 .../magit-autorevert.el | 0 .../magit-base.el | 0 .../magit-bisect.el | 0 .../magit-blame.el | 0 .../magit-bookmark.el | 0 .../magit-branch.el | 0 .../magit-bundle.el | 0 .../magit-clone.el | 2 +- .../magit-commit.el | 0 .../magit-core.el | 0 .../magit-diff.el | 0 .../magit-ediff.el | 0 .../magit-extras.el | 0 .../magit-fetch.el | 0 .../magit-files.el | 0 .../magit-git.el | 0 .../magit-gitignore.el | 0 .../magit-log.el | 0 .../magit-margin.el | 0 .../magit-merge.el | 0 .../magit-mode.el | 0 .../magit-notes.el | 0 .../magit-obsolete.el | 0 .../magit-patch.el | 0 .../magit-pkg.el | 4 +- .../magit-process.el | 0 .../magit-pull.el | 0 .../magit-push.el | 0 .../magit-reflog.el | 0 .../magit-refs.el | 0 .../magit-remote.el | 0 .../magit-repos.el | 0 .../magit-reset.el | 0 .../magit-sequence.el | 0 .../magit-sparse-checkout.el | 0 .../magit-stash.el | 0 .../magit-status.el | 0 .../magit-submodule.el | 0 .../magit-subtree.el | 0 .../magit-tag.el | 0 .../magit-transient.el | 0 .../magit-wip.el | 0 .../magit-worktree.el | 0 .../magit.el | 0 .../magit.info | 0 org/elpa/transient-20220803.1000/dir | 18 - .../transient-autoloads.el | 84 - org/elpa/transient-20220803.1000/transient.el | 4092 ----------------- .../transient-20220803.1000/transient.info | 2658 ----------- .../transient-20220806.2224/transient-pkg.el | 13 - .../dir | 0 .../gpl.info | 0 .../transient-autoloads.el | 0 .../transient-pkg.el | 4 +- .../transient.el | 14 +- .../transient.info | 0 .../transpose-frame-pkg.el | 2 - .../transpose-frame-autoloads.el | 0 .../transpose-frame-pkg.el | 2 + .../transpose-frame.el | 8 +- 120 files changed, 105 insertions(+), 8927 deletions(-) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/.dir-locals.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/emacs-helm.sh (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-adaptive.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-autoloads.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-bookmark.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-buffers.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-color.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-comint.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-command.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-config.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-dabbrev.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-easymenu.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-elisp-package.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-elisp.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-epa.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-eshell.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-eval.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-external.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-fd.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-files.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-find.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-font.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-for-files.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-global-bindings.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-grep.el (99%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-help.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-id-utils.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-imenu.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-info.el (98%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-locate.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-man.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-misc.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-mode.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-net.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-occur.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-pkg.el (69%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-regexp.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-ring.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-semantic.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-shell.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-sys.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-tags.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-types.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-utils.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm-x-files.el (100%) rename org/elpa/{helm-20220911.1317 => helm-20220914.1117}/helm.el (100%) delete mode 100644 org/elpa/helm-ls-git-20220727.505/helm-ls-git-pkg.el delete mode 100644 org/elpa/helm-ls-git-20220727.505/helm-ls-git.el delete mode 100644 org/elpa/helm-ls-git-20220818.553/helm-ls-git-autoloads.el delete mode 100644 org/elpa/helm-ls-git-20220818.553/helm-ls-git-pkg.el rename org/elpa/{helm-ls-git-20220727.505 => helm-ls-git-20220914.954}/helm-ls-git-autoloads.el (100%) create mode 100644 org/elpa/helm-ls-git-20220914.954/helm-ls-git-pkg.el rename org/elpa/{helm-ls-git-20220818.553 => helm-ls-git-20220914.954}/helm-ls-git.el (98%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/AUTHORS.md (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/LICENSE (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/dir (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/git-rebase.el (98%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-apply.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-autoloads.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-autorevert.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-base.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-bisect.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-blame.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-bookmark.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-branch.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-bundle.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-clone.el (99%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-commit.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-core.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-diff.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-ediff.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-extras.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-fetch.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-files.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-git.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-gitignore.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-log.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-margin.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-merge.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-mode.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-notes.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-obsolete.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-patch.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-pkg.el (77%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-process.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-pull.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-push.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-reflog.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-refs.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-remote.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-repos.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-reset.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-sequence.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-sparse-checkout.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-stash.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-status.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-submodule.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-subtree.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-tag.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-transient.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-wip.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit-worktree.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit.el (100%) rename org/elpa/{magit-20220912.331 => magit-20220914.2356}/magit.info (100%) delete mode 100644 org/elpa/transient-20220803.1000/dir delete mode 100644 org/elpa/transient-20220803.1000/transient-autoloads.el delete mode 100644 org/elpa/transient-20220803.1000/transient.el delete mode 100644 org/elpa/transient-20220803.1000/transient.info delete mode 100644 org/elpa/transient-20220806.2224/transient-pkg.el rename org/elpa/{transient-20220806.2224 => transient-20220915.1511}/dir (100%) rename org/elpa/{transient-20220806.2224 => transient-20220915.1511}/gpl.info (100%) rename org/elpa/{transient-20220806.2224 => transient-20220915.1511}/transient-autoloads.el (100%) rename org/elpa/{transient-20220803.1000 => transient-20220915.1511}/transient-pkg.el (68%) rename org/elpa/{transient-20220806.2224 => transient-20220915.1511}/transient.el (99%) rename org/elpa/{transient-20220806.2224 => transient-20220915.1511}/transient.info (100%) delete mode 100644 org/elpa/transpose-frame-20200307.2119/transpose-frame-pkg.el rename org/elpa/{transpose-frame-20200307.2119 => transpose-frame-20220913.1749}/transpose-frame-autoloads.el (100%) create mode 100644 org/elpa/transpose-frame-20220913.1749/transpose-frame-pkg.el rename org/elpa/{transpose-frame-20200307.2119 => transpose-frame-20220913.1749}/transpose-frame.el (98%) diff --git a/org/elpa/archives/melpa/archive-contents b/org/elpa/archives/melpa/archive-contents index bae6dbc..0e23104 100644 --- a/org/elpa/archives/melpa/archive-contents +++ b/org/elpa/archives/melpa/archive-contents @@ -91,7 +91,7 @@ (alda-mode . [(20210705 654) ((emacs (24 0))) "An Alda major mode" single ((:commit . "ae08444d16bd1859a06c8ed6a3e7ae2e9ad397ed") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:keywords "alda" "highlight") (:url . "http://gitlab.com/jgkamat/alda-mode"))]) (alect-themes . [(20211022 1651) ((emacs (24 0))) "Configurable light, dark and black themes for Emacs 24 or later" tar ((:commit . "89560047934c236d05ea6b911c0c63702a8e06f3") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "color" "theme") (:url . "https://github.com/alezost/alect-themes"))]) (alectryon . [(20211018 321) ((flycheck (31)) (emacs (25 1))) "Toggle between Coq and reStructuredText" tar ((:commit . "5505e00e5c8a5080ee0e640e5dc8de947e3b9aff") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/cpitclaudel/alectryon"))]) - (alert . [(20220818 1606) ((gntp (0 1)) (log4e (0 3 0)) (cl-lib (0 5))) "Growl-style notification system for Emacs" single ((:commit . "c39ce68ed8d80fb996fb78eafc06481a54bf27ce") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:keywords "notification" "emacs" "message") (:url . "https://github.com/jwiegley/alert"))]) + (alert . [(20220914 2051) ((gntp (0 1)) (log4e (0 3 0)) (cl-lib (0 5))) "Growl-style notification system for Emacs" single ((:commit . "2c11cf9374f88bfc657764afe39ec7f6bad1779d") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:keywords "notification" "emacs" "message") (:url . "https://github.com/jwiegley/alert"))]) (alert-termux . [(20181119 951) ((emacs (24 4))) "alert.el notifications on Termux" single ((:commit . "8215cf1d86392738c35a90bbc0055359265dfc4d") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu") (:keywords "terminals") (:url . "https://github.com/gergelypolonkai/alert-termux"))]) (alert-toast . [(20220312 229) ((emacs (25 1)) (alert (1 2)) (f (0 20 0)) (s (1 12 0))) "Windows 10 toast notifications" single ((:commit . "96c88c93c1084de681700f655223142ee0eb944a") (:authors ("Grzegorz Kowzan" . "grzegorz@kowzan.eu")) (:maintainer "Grzegorz Kowzan" . "grzegorz@kowzan.eu") (:url . "https://github.com/gkowzan/alert-toast"))]) (align-cljlet . [(20160112 2101) ((clojure-mode (1 11 5))) "Space align various Clojure forms" single ((:commit . "ebcf0a912e836579a3a9d386e22c1c4bef7fba17") (:url . "https://github.com/gstamp/align-cljlet"))]) @@ -102,7 +102,7 @@ (all-the-icons-gnus . [(20180511 654) ((emacs (24 4)) (dash (2 12 0)) (all-the-icons (3 1 0))) "Shows icons for in Gnus" single ((:commit . "27f78996da0725943bcfb2d18038e6f7bddfa9c7") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "mail" "tools"))]) (all-the-icons-ibuffer . [(20220424 1027) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" single ((:commit . "0c7221366ceddbf122073ecd07dd86e1baf032ff") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ibuffer") (:url . "https://github.com/seagle0128/all-the-icons-ibuffer"))]) (all-the-icons-ivy . [(20190508 1803) ((emacs (24 4)) (all-the-icons (2 4 0)) (ivy (0 8 0))) "Shows icons while using ivy and counsel" single ((:commit . "babea626db20773de4c408acb2788e2b9c8277e3") (:authors ("asok")) (:maintainer "asok") (:keywords "faces"))]) - (all-the-icons-ivy-rich . [(20220913 1631) ((emacs (25 1)) (ivy-rich (0 1 0)) (all-the-icons (2 2 0))) "Better experience with icons for ivy" single ((:commit . "55ccff918e27beb6a17feb747a8bc3fb27be82ca") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ivy") (:url . "https://github.com/seagle0128/all-the-icons-ivy-rich"))]) + (all-the-icons-ivy-rich . [(20220914 934) ((emacs (25 1)) (ivy-rich (0 1 0)) (all-the-icons (2 2 0))) "Better experience with icons for ivy" single ((:commit . "f5d27ebd729837daec1311e353dcfc850202a945") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ivy") (:url . "https://github.com/seagle0128/all-the-icons-ivy-rich"))]) (almost-mono-themes . [(20220422 1714) ((emacs (24))) "Almost monochromatic color themes" tar ((:commit . "0641bf565c113caef8d5c2a93f38cff32ebb62b7") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:keywords "faces") (:url . "https://github.com/cryon/almost-mono-themes"))]) (alsamixer . [(20191002 1133) nil "Functions to call out to amixer." single ((:commit . "1bdb99e433acd38685f05408562746cfbf2bc820") (:authors ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:keywords "convenience") (:url . "https://github.com/remvee/alsamixer-el"))]) (alt-codes . [(20220704 644) ((emacs (26 1))) "Insert alt codes using meta key" single ((:commit . "36dbcbeb69525cd21caeb4c267421b69fa2fffcb") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "alt" "codes" "insertion" "meta") (:url . "https://github.com/jcs-elpa/alt-codes"))]) @@ -147,7 +147,7 @@ (apache-mode . [(20210519 1931) nil "Major mode for editing Apache httpd configuration files" single ((:commit . "f2c11aac2f5fc598123e04f4604bea248689a117") (:authors ("Karl Chen" . "quarl@nospam.quarl.org")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "languages" "faces") (:url . "https://github.com/emacs-php/apache-mode"))]) (apdl-mode . [(20211023 1831) ((emacs (25 1))) "Major mode for the APDL programming language." tar ((:commit . "ba756eaa1d229c9bf6936fb8d2d4126ad073d488") (:authors ("H. Dieter Wilhelm" . "dieter@duenenhof-wilhelm.de")) (:maintainer "H. Dieter Wilhelm") (:keywords "languages" "convenience" "tools" "ansys" "apdl") (:url . "https://github.com/dieter-wilhelm/apdl-mode"))]) (apel . [(20220720 1308) ((emacs (24 5))) "A Portable Emacs Library provides support for portable Emacs Lisp programs" tar ((:commit . "82eb2325bd149dc57b43a9ce9402c6c6183e4052"))]) - (apheleia . [(20220911 818) ((emacs (26))) "Reformat buffer stably" single ((:commit . "e01ced3ac985eabd51dad348d04974cefa778625") (:authors ("Radian LLC" . "contact+apheleia@radian.codes")) (:maintainer "Radian LLC" . "contact+apheleia@radian.codes") (:keywords "tools") (:url . "https://github.com/raxod502/apheleia"))]) + (apheleia . [(20220915 208) ((emacs (26))) "Reformat buffer stably" single ((:commit . "7aa46ba84f06251f280d226f98cb06ef83a0a697") (:authors ("Radian LLC" . "contact+apheleia@radian.codes")) (:maintainer "Radian LLC" . "contact+apheleia@radian.codes") (:keywords "tools") (:url . "https://github.com/raxod502/apheleia"))]) (apib-mode . [(20200101 1017) ((markdown-mode (2 1))) "Major mode for API Blueprint files" single ((:commit . "c6dd05201f6eb9295736d8668a79a7510d11159e") (:authors ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainer "Vilibald Wanča" . "vilibald@wvi.cz") (:keywords "tools" "api-blueprint") (:url . "http://github.com/w-vi/apib-mode"))]) (apiwrap . [(20180602 2231) ((emacs (25))) "api-wrapping macros" single ((:commit . "e4c9c57d6620a788ec8a715ff1bb50542edea3a6") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "tools" "maint" "convenience") (:url . "https://github.com/vermiculus/apiwrap.el"))]) (apparmor-mode . [(20220411 648) ((emacs (24 4))) "Major mode for editing AppArmor policy files" single ((:commit . "abc2a6adf563b89daee9f8fa07a71d78957defdb") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/apparmor-mode"))]) @@ -382,7 +382,7 @@ (buffer-manage . [(20211122 1957) ((emacs (26 1)) (choice-program (0 13)) (dash (2 17 0))) "Manage buffers" tar ((:commit . "819bbfd9ae2f028361f484bc3b60d751623a2df5") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "internal" "maint") (:url . "https://github.com/plandes/buffer-manage"))]) (buffer-move . [(20220512 755) ((emacs (24 1))) "easily swap buffers" single ((:commit . "e7800b3ab1bd76ee475ef35507ec51ecd5a3f065") (:keywords "convenience") (:url . "https://github.com/lukhas/buffer-move/"))]) (buffer-ring . [(20220120 124) ((emacs (25 1)) (dynaring (0 3)) (s (1 12 0)) (ht (2 0))) "Rings and tori for buffer navigation" single ((:commit . "177d67238c4d126a0270585e21c0f03ae750ca2a") (:authors ("Mike Mattie" . "codermattie@gmail.com") ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com") (:url . "https://github.com/countvajhula/buffer-ring"))]) - (buffer-sets . [(20220825 2335) ((cl-lib (0 5))) "Sets of Buffers for Buffer Management" single ((:commit . "e6ae7a60e671375bc43b60c4febe10fd1d1f7b14") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "buffer-management") (:url . "https://git.sr.ht/~swflint/buffer-sets"))]) + (buffer-sets . [(20220914 2115) ((cl-lib (0 5))) "Sets of Buffers for Buffer Management" single ((:commit . "c6c09baf3ca39260b2f4c6aaf2f3d967f688760d") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "buffer-management") (:url . "https://git.sr.ht/~swflint/buffer-sets"))]) (buffer-utils . [(20140512 1400) nil "Buffer-manipulation utility functions" single ((:commit . "32e1f23817b9c6caedb53e5359baad29e99eaa2b") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/buffer-utils"))]) (buffer-watcher . [(20170913 839) ((f (0 16 2)) (cl-lib (0 5))) "Easily run shell scripts per filetype/directory when a buffer is saved" single ((:commit . "b32c67c8a5d724257d759f4c903d0dedc32246ef") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) (buffer-wrap . [(20220704 646) ((emacs (24 4))) "Wrap the beginning and the end of buffer" single ((:commit . "b6b2118f59b8152fa02bd0b09d65a1f8ade4141b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience" "buffer" "tool" "wrap") (:url . "https://github.com/jcs-elpa/buffer-wrap"))]) @@ -560,7 +560,7 @@ (clojure-mode . [(20220905 1237) ((emacs (25 1))) "Major mode for Clojure code" single ((:commit . "d47298212ffc486ade3f2428f103feba3a467af0") (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "languages" "clojure" "clojurescript" "lisp") (:url . "http://github.com/clojure-emacs/clojure-mode"))]) (clojure-mode-extra-font-locking . [(20220715 1509) ((clojure-mode (3 0))) "Extra font-locking for Clojure mode" single ((:commit . "fee38d780f7d0b2a42a441e4d8bcfaa4fa672983") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.dev")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev") (:keywords "languages" "lisp") (:url . "http://github.com/clojure-emacs/clojure-mode"))]) (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 . [(20180314 1308) ((yasnippet (0 10 0))) "Yasnippets for clojure" tar ((:commit . "6068dca90467a0f4ebc2cd39338a173d6f5ddc04") (:authors ("Max Penet" . "m@qbits.cc")) (:maintainer "Max Penet" . "m@qbits.cc") (:keywords "snippets"))]) + (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 . [(20220821 1814) ((emacs (25 1)) (compat (28 1 1 0)) (emacsql-sqlite (3 0 0))) "Store EIEIO objects using EmacSQL" single ((:commit . "46b3020acf6655fd8abb4ef60e090629ee33e8c3") (: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"))]) @@ -702,7 +702,7 @@ (conllu-mode . [(20200501 2328) ((emacs (25)) (cl-lib (0 5)) (flycheck (30)) (hydra (0 13 0)) (s (1 0))) "editing mode for CoNLL-U files" tar ((:commit . "0db3063572b0de08874822e20570bb153747e6ed") (:authors ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com") (:keywords "extensions") (:url . "https://github.com/odanoburu/conllu-mode"))]) (connection . [(20191111 446) nil "TCP-based client connection" single ((:commit . "c9cad101100975e88873636bfd426b7a19304ebd") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "network"))]) (constant-theme . [(20180921 1012) ((emacs (24 1))) "A calm, dark, almost monochrome color theme." tar ((:commit . "0feb9f99d708633d62fa548c953ebbe68fd70de0") (:authors ("Jannis Pohlmann" . "contact@jannispohlmann.de")) (:maintainer "Jannis Pohlmann" . "contact@jannispohlmann.de") (:keywords "themes") (:url . "https://github.com/jannis/emacs-constant-theme"))]) - (consult . [(20220909 1347) ((emacs (27 1)) (compat (28 1))) "Consulting completing-read" tar ((:commit . "ef3aad65e41e425fbcc80c4a9a1f6fc4cafff383") (:authors ("Daniel Mendler and Consult contributors")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/consult"))]) + (consult . [(20220914 920) ((emacs (27 1)) (compat (28 1))) "Consulting completing-read" tar ((:commit . "76aab86015c3d7628dbd5f92b2dd8ab9aeadac8d") (:authors ("Daniel Mendler and Consult contributors")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/consult"))]) (consult-ag . [(20220419 1721) ((emacs (27 1)) (consult (0 16))) "The silver searcher integration using Consult" single ((:commit . "2460ae6829e86c9f1186a852304d919526838cb8") (:authors ("Kanon Kakuno" . "yadex205@outlook.jp")) (:maintainer "Kanon Kakuno" . "yadex205@outlook.jp") (:url . "https://github.com/yadex205/consult-ag"))]) (consult-company . [(20220830 1834) ((emacs (27 1)) (company (0 9)) (consult (0 9))) "Consult frontend for company" single ((:commit . "5d8275bff131ce2aaa678dd46aac345eb4fc8b27") (:authors ("mohsin kaleem" . "mohkale@kisara.moe")) (:maintainer "mohsin kaleem" . "mohkale@kisara.moe") (:url . "https://github.com/mohkale/consult-company"))]) (consult-dash . [(20220621 226) ((emacs (27 2)) (dash-docs (1 4 0)) (consult (0 16))) "Consult front-end for dash-docs" single ((:commit . "0eb8e133a12570f482efcf367dcc7887c15def32") (:authors ("Ravi R Kiran" . "lists.ravi@gmail.com")) (:maintainer "Ravi R Kiran" . "lists.ravi@gmail.com") (:keywords "consult" "dash" "docs") (:url . "https://codeberg.org/ravi/consult-dash"))]) @@ -836,7 +836,7 @@ (dakrone-theme . [(20170801 1933) nil "dakrone's custom dark theme" single ((:commit . "232ad1be5f3572dcbdf528f1655109aa355a6937") (:authors ("Lee Hinman ")) (:maintainer "Lee Hinman ") (:keywords "color" "themes") (:url . "https://github.com/dakrone/dakrone-theme"))]) (danneskjold-theme . [(20220316 1101) nil "Beautiful high-contrast Emacs theme." tar ((:commit . "054c0b9bc9cefb53a4065096e66707d20885c461") (:authors ("Dmitry Akatov" . "akatovda@yandex.com")) (:maintainer "Dmitry Akatov" . "akatovda@yandex.com") (:url . "https://github.com/rails-to-cosmos/"))]) (dante . [(20220907 1402) ((dash (2 12 0)) (emacs (25 1)) (f (0 19 0)) (flycheck (0 30)) (company (0 9)) (haskell-mode (13 14)) (s (1 11 0)) (lcr (1 0))) "Development mode for Haskell" single ((:commit . "1ab4d9520d17cd37d1f370d1c8adebf4d9d3f737") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:keywords "haskell" "tools") (:url . "https://github.com/jyp/dante"))]) - (dap-mode . [(20220827 1015) ((emacs (26 1)) (dash (2 18 0)) (lsp-mode (6 0)) (bui (1 1 0)) (f (0 20 0)) (s (1 12 0)) (lsp-treemacs (0 1)) (posframe (0 7 0)) (ht (2 3)) (lsp-docker (1 0 0))) "Debug Adapter Protocol mode" tar ((:commit . "7f924d7feacb2c271e5cde179f6fe1c390a78223") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/dap-mode"))]) + (dap-mode . [(20220915 1323) ((emacs (26 1)) (dash (2 18 0)) (lsp-mode (6 0)) (bui (1 1 0)) (f (0 20 0)) (s (1 12 0)) (lsp-treemacs (0 1)) (posframe (0 7 0)) (ht (2 3)) (lsp-docker (1 0 0))) "Debug Adapter Protocol mode" tar ((:commit . "5d5043f962de030cadf761613199e0251c602d1e") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/dap-mode"))]) (darcsum . [(20190316 2215) nil "a pcl-cvs like interface for managing darcs patches" single ((:commit . "6a8b690539d133c5e3d17cb23fe4365fbb6fb493") (:authors ("John Wiegley" . "johnw@gnu.org")) (:maintainer "John Wiegley" . "johnw@gnu.org") (:keywords "completion" "convenience" "tools" "vc"))]) (darcula-theme . [(20171227 1845) nil "Inspired by IntelliJ's Darcula theme" single ((:commit . "d9b82b58ded9014985be6658f4ab17e26ed9e93e") (:authors ("Sam Halliday" . "Sam.Halliday@gmail.com")) (:maintainer "Sam Halliday" . "Sam.Halliday@gmail.com") (:keywords "faces") (:url . "https://gitlab.com/fommil/emacs-darcula-theme"))]) (dark-krystal-theme . [(20170808 1300) ((emacs (24 0))) "an Emacs 24 theme based on Dark Krystal (tmTheme)" single ((:commit . "79084b99665dc9ffb0ec62cc092349a5ecebebbc") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) @@ -897,7 +897,7 @@ (desktop-environment . [(20220425 1834) ((emacs (25 1))) "Helps you control your GNU/Linux computer" single ((:commit . "2863dc3d66aed9052c8af39cc8c8c264be300560") (:authors ("Damien Cassou , Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Damien Cassou , Nicolas Petton" . "nicolas@petton.fr") (:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment"))]) (desktop-mail-user-agent . [(20210519 1008) ((emacs (24 3))) "Call OS default mail program to compose mail" single ((:commit . "caac672ef7e4ddced960fa31cef3a6ba5d7ab451") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "mail") (:url . "https://github.com/lassik/emacs-desktop-mail-user-agent"))]) (desktop-registry . [(20140119 2143) nil "Keep a central registry of desktop files" single ((:commit . "244c2e7f9f0a1050aa8a47ad0b38f4e4584682dd") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "convenience") (:url . "http://projects.ryuslash.org/desktop-registry/"))]) - (detached . [(20220910 1010) ((emacs (27 1))) "A package to launch, and manage, detached processes" tar ((:commit . "ee0821fd9799ec4c89ad65d34b8bed10728d74d9") (:authors ("Niklas Eklund" . "niklas.eklund@posteo.net")) (:maintainer "detached.el Development" . "~niklaseklund/detached.el@lists.sr.ht") (:keywords "convenience" "processes") (:url . "https://sr.ht/~niklaseklund/detached.el/"))]) + (detached . [(20220915 1320) ((emacs (27 1))) "A package to launch, and manage, detached processes" tar ((:commit . "77921c6cf4020a8062f9fd6cccda19bef51b2350") (:authors ("Niklas Eklund" . "niklas.eklund@posteo.net")) (:maintainer "detached.el Development" . "~niklaseklund/detached.el@lists.sr.ht") (:keywords "convenience" "processes") (:url . "https://sr.ht/~niklaseklund/detached.el/"))]) (detour . [(20181122 2138) ((emacs (24 4))) "Take a quick detour and return" single ((:commit . "f41f17cf1cf4f3db41563ff011786b6567596fb4") (:authors ("Stefan Kamphausen ")) (:maintainer "Stefan Kamphausen ") (:keywords "convenience" "abbrev") (:url . "https://github.com/ska2342/detour/"))]) (devdocs . [(20220811 703) ((emacs (27 1))) "Emacs viewer for DevDocs" single ((:commit . "61ce83b79dc64e2f99d7f016a09b97e14b331459") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") (:keywords "help") (:url . "https://github.com/astoff/devdocs.el"))]) (devdocs-browser . [(20211218 949) ((emacs (27 1))) "Browse devdocs.io documents using EWW" single ((:commit . "a46a2cdb83ed27869befe56fea04914a33252b3a") (:authors ("blahgeek" . "i@blahgeek.com")) (:maintainer "blahgeek" . "i@blahgeek.com") (:keywords "docs" "help" "tools") (:url . "https://github.com/blahgeek/emacs-devdocs-browser"))]) @@ -973,7 +973,7 @@ (direx-grep . [(20140515 1506) ((direx (0 1 -3))) "Grep node of direx.el using incremental search like anything.el/helm.el" single ((:commit . "1109a512a80b2673a70b18b8568514049017faad") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/direx-grep"))]) (dirtree . [(20140129 832) ((tree-mode (1 1 1 1)) (windata (0))) "Directory tree views" single ((:commit . "ba55f1e716e386fdd37cb8e7f48616e405dc7251") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com"))]) (dirtree-prosjekt . [(20140129 904) ((prosjekt (0 3)) (dirtree (0 1))) "dirtree integration for prosjekt." single ((:commit . "03e06910589ba5cd736868793eb436b3233c6a26") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))]) - (dirvish . [(20220913 1503) ((emacs (27 1)) (transient (0 3 7))) "A modern file manager based on dired mode" tar ((:commit . "699d9754c409aa40a4ae7610c7d4f0ed90648680") (:authors ("Alex Lu ")) (:maintainer "Alex Lu ") (:keywords "files" "convenience") (:url . "https://github.com/alexluigit/dirvish"))]) + (dirvish . [(20220915 1457) ((emacs (27 1)) (transient (0 3 7))) "A modern file manager based on dired mode" tar ((:commit . "49ffb1dba47165daeaf2d9b604ecfee78f6da98a") (:authors ("Alex Lu ")) (:maintainer "Alex Lu ") (:keywords "files" "convenience") (:url . "https://github.com/alexluigit/dirvish"))]) (disable-mouse . [(20210512 2114) ((emacs (24 1))) "Disable mouse commands globally" single ((:commit . "cae3be9dd012727b40ad3b511731191f79cebe42") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "mouse") (:url . "https://github.com/purcell/disable-mouse"))]) (disaster . [(20220904 449) ((emacs (27))) "Disassemble C, C++ or Fortran code under cursor" single ((:commit . "0c13bd244cc43773af81e52ce73a55f199d58a61") (:authors ("Justine Tunney" . "jtunney@gmail.com") ("Abdelhak Bougouffa" . "abougouffa@fedoraproject.org")) (:maintainer "Abdelhak Bougouffa" . "abougouffa@fedoraproject.org") (:keywords "tools" "c") (:url . "https://github.com/jart/disaster"))]) (discourse . [(20160911 819) ((cl-lib (0 5)) (request (0 2)) (s (1 11 0))) "discourse api" single ((:commit . "a86c7e608851e186fe12e892a573994f08c8e65e") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "discourse") (:url . "https://github.com/lujun9972/discourse-api"))]) @@ -1775,12 +1775,12 @@ (fontawesome . [(20170305 1356) ((emacs (24 4))) "fontawesome utility" tar ((:commit . "a743f80bfd53767ca9ee32da34c5ca032172a480") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-fontawesome"))]) (fontify-face . [(20210503 1956) ((emacs (24))) "Fontify symbols representing faces with that face." single ((:commit . "d1386c88ccc77ccfb40b888ff90d6181325d14f8") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "faces") (:url . "https://github.com/Fuco1/fontify-face"))]) (fontsloth . [(20211118 2018) ((f (0 20 0)) (logito (0 1)) (pcache (0 5)) (stream (2 2 5)) (emacs (28 0))) "Elisp otf/ttf font loader/renderer" tar ((:commit . "615dd846cb80701cda4b34bc1dfb43bf695318b6") (:authors ("Jo Gay" . "jo.gay@mailfence.com")) (:maintainer "Jo Gay" . "jo.gay@mailfence.com") (:keywords "data" "font" "rasterization" "ttf" "otf") (:url . "https://github.com/jollm/fontsloth"))]) - (for . [(20220913 924) ((emacs (28 1))) "Iteration and sequence" tar ((:commit . "89e3eac132dc8f5d2ae7616ec7cccf2e78fd4134") (:authors ("Wing Hei Chan" . "whmunkchan@outlook.com")) (:maintainer "Wing Hei Chan" . "whmunkchan@outlook.com") (:keywords "extensions") (:url . "https://github.com/usaoc/elisp-for"))]) + (for . [(20220915 1158) ((emacs (28 1))) "Iteration and sequence" tar ((:commit . "0ea6470632f254e6926c46e8e86e2436520fd7c9") (:authors ("Wing Hei Chan" . "whmunkchan@outlook.com")) (:maintainer "Wing Hei Chan" . "whmunkchan@outlook.com") (:keywords "extensions") (:url . "https://github.com/usaoc/elisp-for"))]) (forecast . [(20191004 1850) ((emacs (24 4))) "Weather forecasts" single ((:commit . "5f3e67448cc98fe2875115163849acae4d9e8526") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com") (:keywords "weather" "forecast") (:url . "https://dev.gkayaalp.com/elisp/index.html#forecast-el"))]) (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 . [(20220821 2143) ((emacs (25 1)) (compat (28 1 1 0)) (closql (1 2 0)) (dash (2 19 1)) (emacsql-sqlite (3 0 0)) (ghub (20220621)) (let-alist (1 0 6)) (magit (20220621)) (markdown-mode (2 4)) (transient (0 3 6)) (yaml (0 3 5))) "Access Git forges from Magit." tar ((:commit . "6a820a424465900b0cc7bc54ccdad6491764e581") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/forge"))]) + (forge . [(20220915 1551) ((emacs (25 1)) (compat (28 1 1 0)) (closql (1 2 0)) (dash (2 19 1)) (emacsql-sqlite (3 0 0)) (ghub (20220621)) (let-alist (1 0 6)) (magit (20220621)) (markdown-mode (2 4)) (transient (0 3 6)) (yaml (0 3 5))) "Access Git forges from Magit." tar ((:commit . "2a2c6dde1754679673ccb29eb384dabe1d43624c") (: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 . [(20220909 1032) ((emacs (24 4)) (inheritenv (0 1)) (language-id (0 19))) "Auto-format C, C++, JS, Python, Ruby and 50 other languages" single ((:commit . "48f79e894c04b0c73c6334194ee17d7f72046c83") (: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"))]) @@ -2102,7 +2102,7 @@ (hcl-mode . [(20200315 2129) ((emacs (24 3))) "Major mode for Hashicorp" single ((:commit . "c3d1158ad1a64f06aa8986ab1cdea6b7fbdd4bf7") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/emacs-hcl-mode"))]) (headlong . [(20150417 1526) nil "reckless completion" single ((:commit . "f6830f87f236eee88263cb6976125f72422abe72") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "completion") (:url . "https://github.com/abo-abo/headlong"))]) (heaven-and-hell . [(20190713 1830) ((emacs (24 4))) "easy toggle light/dark themes" single ((:commit . "e1febfd60d060c110a1e43c5f093cd8537251308") (:authors ("Valentin Ignatev" . "valentignatev@gmail.com")) (:maintainer "Valentin Ignatev" . "valentignatev@gmail.com") (:keywords "faces") (:url . "https://github.com/valignatev/heaven-and-hell"))]) - (helm . [(20220911 1317) ((helm-core (3 8 7)) (popup (0 5 3))) "Helm is an Emacs incremental and narrowing framework" tar ((:commit . "288f7d9f173d7ddd7a7766eb333cc2db1c1caa34") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:url . "https://emacs-helm.github.io/helm/"))]) + (helm . [(20220914 1117) ((helm-core (3 8 7)) (popup (0 5 3))) "Helm is an Emacs incremental and narrowing framework" tar ((:commit . "c3cd741a27247334c5f25998442c377cd3b36c78") (:authors ("Thierry Volpiatto" . "thievol@posteo.net")) (:maintainer "Thierry Volpiatto" . "thievol@posteo.net") (:url . "https://emacs-helm.github.io/helm/"))]) (helm-R . [(20120820 14) ((helm (20120517)) (ess (20120509))) "helm-sources and some utilities for GNU R." single ((:commit . "b0eb9d5f6a483a9dbe6eb6cf1f2024d4f5938bc2") (:authors ("myuhe ")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/helm-R.el"))]) (helm-ack . [(20141030 1226) ((helm (1 0)) (cl-lib (0 5))) "Ack command with helm interface" single ((:commit . "5982f3cb6ec9f460ebbe06ec0ce7b3590bca3118") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-ack"))]) (helm-ad . [(20151209 1015) ((dash (2 8 0)) (helm (1 6 2))) "helm source for Active Directory" single ((:commit . "8ac044705d8620ee354a9cfa8cc1b865e83c0d55") (:authors ("Takahiro Noda" . "takahiro.noda+github@gmail.com")) (:maintainer "Takahiro Noda" . "takahiro.noda+github@gmail.com") (:keywords "comm"))]) @@ -2205,7 +2205,7 @@ (helm-lib-babel . [(20180510 1324) ((cl-lib (0 5)) (helm (1 9 2)) (emacs (24 4))) "helm insertion of babel function references" single ((:commit . "41bc0cdea8a604c6c8dc83ed5066644d33688fad") (:authors ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainer "Derek Feichtinger" . "dfeich@gmail.com") (:keywords "convenience") (:url . "https://github.com/dfeich/helm-lib-babel.el"))]) (helm-lines . [(20220103 1909) ((emacs (24 4)) (helm (1 9 8))) "A helm interface for completing by lines" single ((:commit . "f5ad178818d223f32a0bf60d370b50c01df5f3da") (:authors ("@torgeir")) (:maintainer "@torgeir") (:keywords "files" "helm" "rg" "ag" "pt" "vc" "git" "lines" "complete" "tools" "languages") (:url . "https://github.com/torgeir/helm-lines.el/"))]) (helm-lobsters . [(20150213 1546) ((helm (1 0)) (cl-lib (0 5))) "helm front-end for lobste.rs" single ((:commit . "4121b232aeded2f82ad2c8a85c7dda17ef9d97bb") (:authors ("Julien BLANCHARD" . "julien@sideburns.eu")) (:maintainer "Julien BLANCHARD" . "julien@sideburns.eu") (:url . "https://github.com/julienXX/helm-lobste.rs"))]) - (helm-ls-git . [(20220818 553) ((helm (1 7 8))) "list git files." single ((:commit . "fc44fc1015bbc75d16e7d7aa5d971ff1ad85e9e1"))]) + (helm-ls-git . [(20220914 954) ((helm (1 7 8))) "list git files." single ((:commit . "a0dbaa0df28942a70f580dcbd73febe29b6c2167"))]) (helm-ls-hg . [(20150909 543) ((helm (1 7 8))) "List hg files in hg project." single ((:commit . "61b91a22fcfb62d0fc56e361ec01ce96973c7165"))]) (helm-ls-svn . [(20190316 2203) ((emacs (24 1)) (helm (1 7 0)) (cl-lib (0 5))) "helm extension to list svn files" single ((:commit . "a6043e1187282f649e2cb9f0e722a42daf41294b") (:authors ("Chunyang Xu" . "chunyang@macports.org")) (:maintainer "Chunyang Xu" . "chunyang@macports.org") (:keywords "helm" "svn") (:url . "https://svn.macports.org/repository/macports/users/chunyang/helm-ls-svn.el/helm-ls-svn.el"))]) (helm-lsp . [(20210419 2014) ((emacs (25 1)) (dash (2 14 1)) (lsp-mode (5 0)) (helm (2 0))) "LSP helm integration" single ((:commit . "c2c6974dadfac459b1a69a1217441283874cea92") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/yyoncho/helm-lsp"))]) @@ -2339,7 +2339,7 @@ (hl-block-mode . [(20220731 2352) ((emacs (26 1))) "Highlighting nested blocks" single ((:commit . "a9e8e8cfd83972a448bdbb0a9967989d0aa1d05a") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-hl-block-mode"))]) (hl-fill-column . [(20200607 757) ((names (0 5)) (emacs (24))) "Highlight fill column." single ((:commit . "5782a91ba0182c4e562fa0db6379ff9dd472856b") (:keywords "fill column" "faces") (:url . "https://github.com/laishulu/hl-fill-column"))]) (hl-indent . [(20170429 2104) ((emacs (24)) (cl-lib (0 5))) "Highlight irregular indentation." single ((:commit . "bdb2e0177a7c8b29af26998e688b856adc6ded93") (:authors ("Kirill Ignatiev ")) (:maintainer "Kirill Ignatiev ") (:keywords "convenience" "faces") (:url . "https://github.com/ikirill/hl-indent"))]) - (hl-indent-scope . [(20220913 1050) ((emacs (26 1))) "Highlight indentation by scope" tar ((:commit . "d7e660860623818ab86c58e8f725a0e6f622bcc7") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-hl-indent-scope"))]) + (hl-indent-scope . [(20220911 920) ((emacs (26 1))) "Highlight indentation by scope" tar ((:commit . "c8fd8bc602d71050d4e953ddd8922583081745ad") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-hl-indent-scope"))]) (hl-prog-extra . [(20220731 2353) ((emacs (26 2))) "Customizable highlighting for source-code" tar ((:commit . "6d419cc36936f3bb3c9c63a6f77cc88a80b0db9c") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://codeberg.org/ideasman42/emacs-hl-prog-extra"))]) (hl-sentence . [(20171018 1519) nil "highlight a sentence based on customizable face" single ((:commit . "86ae38d3103bd20da5485cbdd59dfbd396c45ee4") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "highlighting") (:url . "http://github.com/milkypostman/hl-sentence"))]) (hl-todo . [(20220422 1611) ((emacs (25 1)) (compat (28 1 1 0))) "Highlight TODO and similar keywords" single ((:commit . "6769accd7003ba5a0376d2c5cef0fcffce8f45be") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/hl-todo"))]) @@ -2384,7 +2384,7 @@ (hungry-delete . [(20210409 1643) nil "hungry delete minor mode" single ((:commit . "d919e555e5c13a2edf4570f3ceec84f0ade71657") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "http://github.com/nflath/hungry-delete"))]) (hy-mode . [(20211016 2011) ((dash (2 18 0)) (s (1 11 0)) (emacs (24))) "Major mode for Hylang" tar ((:commit . "df814865a1faa8414dacdbb35b2a9029995312ec") (:keywords "languages" "lisp" "python") (:url . "http://github.com/hylang/hy-mode"))]) (hyai . [(20170301 1447) ((cl-lib (0 5)) (emacs (24))) "Haskell Yet Another Indentation" single ((:commit . "e9a7e945fed12d8e664e898cf8b434b0376d5d80") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/hyai"))]) - (hybrid-reverse-theme . [(20220913 1259) ((emacs (24 1))) "Emacs theme with material color scheme" single ((:commit . "f70c885e2319a573b383b3097ee08351aa063834") (:authors ("Riyyi")) (:maintainer "Riyyi") (:keywords "faces" "theme") (:url . "https://github.com/riyyi/emacs-hybrid-reverse"))]) + (hybrid-reverse-theme . [(20220913 1954) ((emacs (24 1))) "Emacs theme with material color scheme" single ((:commit . "7315c279a63872b5da370eba11d1846961b08cb0") (:authors ("Riyyi")) (:maintainer "Riyyi") (:keywords "faces" "theme") (:url . "https://github.com/riyyi/emacs-hybrid-reverse"))]) (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"))]) @@ -2535,7 +2535,7 @@ (iterator . [(20210109 1859) ((emacs (24)) (cl-lib (0 5))) "A library to create and use elisp iterators objects." single ((:commit . "b514d4d1d0167e5973afbc93a34070d1aa967d82") (:authors ("Thierry Volpiatto ")) (:maintainer "Thierry Volpiatto ") (:url . "https://github.com/thierryvolpiatto/iterator"))]) (ivariants . [(20170823 224) ((emacs (24 3)) (ivs-edit (1 0))) "Ideographic variants editor and browser" tar ((:commit . "ca0b74d32b5d2d77a45cc6ad6edc00be0ee85284") (:authors ("KAWABATA, Taichi ")) (:maintainer "KAWABATA, Taichi ") (:keywords "i18n" "languages") (:url . "http://github.com/kawabata/ivariants"))]) (ivs-edit . [(20170818 1441) ((emacs (24 3)) (dash (2 6 0)) (cl-lib (1 0))) "IVS (Ideographic Variation Sequence) editing tool" tar ((:commit . "5db39c234aa7393b591168a4fd0a9a4cbbca347d") (:authors ("KAWABATA, Taichi ")) (:maintainer "KAWABATA, Taichi ") (:keywords "text") (:url . "http://github.com/kawabata/ivs-edit"))]) - (ivy . [(20220911 1209) ((emacs (24 5))) "Incremental Vertical completYon" tar ((:commit . "e9c0fb953db9f6a23018a52441f3cd775710472c") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "matching") (:url . "https://github.com/abo-abo/swiper"))]) + (ivy . [(20220915 1532) ((emacs (24 5))) "Incremental Vertical completYon" tar ((:commit . "011653a8c0572202603458fa90f337a419fb88a6") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "matching") (:url . "https://github.com/abo-abo/swiper"))]) (ivy-avy . [(20211021 1602) ((emacs (24 5)) (ivy (0 13 4)) (avy (0 5 0))) "Avy integration for Ivy" single ((:commit . "bb77cf058d9fbc0a64e73491179e88c32e0b0b47") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience") (:url . "https://github.com/abo-abo/swiper"))]) (ivy-bibtex . [(20210927 1205) ((bibtex-completion (1 0 0)) (ivy (0 13 0)) (cl-lib (0 5))) "A bibliography manager based on Ivy" single ((:commit . "bb47f355b0da8518aa3fb516019120c14c8747c9") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))]) (ivy-clipmenu . [(20220202 2122) ((emacs (26 1)) (f (0 20 0)) (s (1 12 0)) (dash (2 16 0)) (ivy (0 13 0))) "Ivy client for clipmenu" single ((:commit . "7c200cd4732821187084fad23547ee3f58365062") (:authors ("William Carroll" . "wpcarro@gmail.com")) (:maintainer "William Carroll" . "wpcarro@gmail.com") (:url . "https://github.com/wpcarro/ivy-clipmenu.el"))]) @@ -2846,7 +2846,6 @@ (literate-calc-mode . [(20220215 1814) ((emacs (25 1)) (s (1 12 0))) "Inline results from calc" single ((:commit . "f5133e65d8ffdab918cdfc269ac0c067a0de5e9b") (:authors ("Robin Schroer")) (:maintainer "Robin Schroer") (:keywords "calc" "languages" "tools") (:url . "https://github.com/sulami/literate-calc-mode.el"))]) (literate-coffee-mode . [(20170211 1515) ((coffee-mode (0 5 0))) "major-mode for Literate CoffeeScript" single ((:commit . "ef34c3a5b813ef078d44c29887761950ab6821c7") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-literate-coffee-mode"))]) (literate-elisp . [(20220626 932) ((emacs (26 1))) "Load Emacs Lisp code blocks from Org files" single ((:commit . "bbc4befbf13f63b92cb1d780501482ae5bd8285b") (:authors ("Jingtao Xu" . "jingtaozf@gmail.com")) (:maintainer "Jingtao Xu" . "jingtaozf@gmail.com") (:keywords "lisp" "docs" "extensions" "tools") (:url . "https://github.com/jingtaozf/literate-elisp"))]) - (literate-starter-kit . [(20150730 1854) ((emacs (24 3))) "A literate starter kit to configure Emacs using Org-mode files." tar ((:commit . "6dce1d01781966c14558aa553cfc85008c06e115"))]) (litex-mode . [(20220909 146) ((emacs (24 4))) "Minor mode for converting lisp to LaTeX" tar ((:commit . "ad98a61e71e76ab3caf2a2eb36886716d28e8c23") (: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"))]) @@ -2902,7 +2901,7 @@ (lsp-latex . [(20210815 1426) ((emacs (25 1)) (lsp-mode (6 0))) "LSP-mode client for LaTeX, on texlab" single ((:commit . "d1da34e21d88e507dc1abc75ec457c9cd30165db") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "languages" "tex") (:url . "https://github.com/ROCKTAKEY/lsp-latex"))]) (lsp-ltex . [(20220912 1600) ((emacs (27 1)) (lsp-mode (6 1))) "LSP Clients for LTEX" single ((:commit . "127c8e8ce7c8e23b6b6ad0c85eaa415044059053") (: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 . [(20220715 2128) ((emacs (26 1)) (scala-mode (1 1)) (lsp-mode (7 0)) (lsp-treemacs (0 2)) (dap-mode (0 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5))) "Scala Client settings" tar ((:commit . "097d6021a4ff0eae704cc3074e064c9509c5cafc") (: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 . [(20220913 1826) ((emacs (26 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0))) "LSP mode" tar ((:commit . "9cb2cb3da906e66622f15584788fd2e5546aa957") (: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 . [(20220914 1807) ((emacs (26 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0))) "LSP mode" tar ((:commit . "45fec559fe63da0742f9bd481a33adba3b1d6d9b") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-mode"))]) (lsp-mssql . [(20191204 1150) ((emacs (25 1)) (lsp-mode (6 2)) (dash (2 14 1)) (f (0 20 0)) (ht (2 0)) (lsp-treemacs (0 1))) "MSSQL LSP bindings" tar ((:commit . "e16e91d6a2a6cdb406ee9b98cfb47f7a32e41d61") (: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"))]) @@ -2911,7 +2910,7 @@ (lsp-pyright . [(20220614 1545) ((emacs (26 1)) (lsp-mode (7 0)) (dash (2 18 0)) (ht (2 0))) "Python LSP client using Pyright" single ((:commit . "b7d6e5bbf2141d2a1efb469ad3451ecc12ddb1cd") (:authors ("Arif Rezai, Vincent Zhang, Andrew Christianson")) (:maintainer "Arif Rezai, Vincent Zhang, Andrew Christianson") (:keywords "languages" "tools" "lsp") (:url . "https://github.com/emacs-lsp/lsp-pyright"))]) (lsp-python-ms . [(20211204 1209) ((emacs (25 1)) (lsp-mode (6 1))) "The lsp-mode client for Microsoft python-language-server" single ((:commit . "abf4d89ecf2fa0871130df5fce6065b7cf0a2721") (:authors ("Charl Botha")) (:maintainer "Andrew Christianson, Vincent Zhang") (:keywords "languages" "tools") (:url . "https://github.com/emacs-lsp/lsp-python-ms"))]) (lsp-rescript . [(20220314 1957) ((lsp-mode (7 0 1)) (emacs (25 1)) (rescript-mode (0 1))) "LSP client configuration for lsp-mode and rescript-vscode" single ((:commit . "7baf9adf10234cf964feefae99050268e9bc5681") (:authors ("John Lee")) (:maintainer "John Lee") (:keywords "languages") (:url . "https://github.com/jjlee/lsp-rescript"))]) - (lsp-scheme . [(20220913 1808) ((emacs (26 1)) (f (0 20 0)) (lsp-mode (8 0 0))) "Scheme support for lsp-mode" tar ((:commit . "b316f0507759126bfaeb31448b56aed21443064f") (:authors ("Ricardo G. Herdt" . "r.herdt@posteo.de")) (:maintainer "Ricardo G. Herdt" . "r.herdt@posteo.de") (:keywords "languages" "lisp" "tools") (:url . "https://codeberg.org/rgherdt/emacs-lsp-scheme"))]) + (lsp-scheme . [(20220914 2015) ((emacs (26 1)) (f (0 20 0)) (lsp-mode (8 0 0))) "Scheme support for lsp-mode" tar ((:commit . "62a2d49014312b7f80c06994cbf634aa8d175a95") (:authors ("Ricardo G. Herdt" . "r.herdt@posteo.de")) (:maintainer "Ricardo G. Herdt" . "r.herdt@posteo.de") (:keywords "languages" "lisp" "tools") (:url . "https://codeberg.org/rgherdt/emacs-lsp-scheme"))]) (lsp-sonarlint . [(20210820 2044) ((emacs (25)) (dash (2 12 0)) (lsp-mode (6 3)) (ht (2 3))) "Emacs Sonarlint lsp client" tar ((:commit . "3af97828f9c08d782fb2086e3a73bda5759e6788") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:keywords "languages" "tools" "php" "javascript" "xml" "ruby" "html" "scala" "java" "python") (:url . "https://github.com/emacs-lsp/lsp-sonarlint"))]) (lsp-sourcekit . [(20210905 2017) ((emacs (25 1)) (lsp-mode (5))) "sourcekit-lsp client for lsp-mode" single ((:commit . "97ff36b228a61e69734c7180f33cc6951b1a600f") (:authors ("Daniel Martín")) (:maintainer "Daniel Martín") (:keywords "languages" "lsp" "swift" "objective-c" "c++") (:url . "https://github.com/emacs-lsp/lsp-sourcekit"))]) (lsp-tailwindcss . [(20220912 1321) ((lsp-mode (7 1)) (f (0 20 0)) (emacs (26 1))) "A lsp-mode client for tailwindcss" single ((:commit . "c0ca58d090453db2ec70fe55f8203055d2358533") (:authors ("A.I." . "merrick@luois.me")) (:maintainer "A.I." . "merrick@luois.me") (:keywords "language" "tools") (:url . "https://github.com/merrickluo/lsp-tailwindcss"))]) @@ -2940,7 +2939,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 . [(20220702 1158) nil "mode for editing Magik + some utils." tar ((:commit . "a7c5553d2780640630d31b469d522ecffdf052f5") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))]) - (magit . [(20220912 331) ((emacs (25 1)) (compat (28 1 1 2)) (dash (20210826)) (git-commit (20220222)) (magit-section (20220325)) (transient (20220325)) (with-editor (20220318))) "A Git porcelain inside Emacs." tar ((:commit . "564cff8a40c2d7c8d4e679f1c7c2974c97f5f149") (: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 . [(20220914 2356) ((emacs (25 1)) (compat (28 1 1 2)) (dash (20210826)) (git-commit (20220222)) (magit-section (20220325)) (transient (20220325)) (with-editor (20220318))) "A Git porcelain inside Emacs." tar ((:commit . "75647d08a097157231c598648e2f632279ff3a41") (:authors ("Marius Vollmer" . "marius.vollmer@gmail.com") ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/magit"))]) (magit-annex . [(20220302 1725) ((cl-lib (0 3)) (magit (3 0 0))) "Control git-annex from Magit" single ((:commit . "efe484644666c6b7c544b0fb7b87e30703fa9425") (:authors ("Kyle Meyer" . "kyle@kyleam.com") ("Rémi Vanicat" . "vanicat@debian.org")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-annex"))]) (magit-circleci . [(20191209 2113) ((dash (2 16 0)) (transient (0 1 0)) (magit (2 90 0)) (emacs (25 3))) "CircleCI integration for Magit" single ((:commit . "3425ad5b16cb48d6802b7e9ed044b4cd7a99c785") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "circleci" "continuous" "integration" "magit" "vc" "tools") (:url . "https://github.com/abrochard/magit-circleci"))]) (magit-commit-mark . [(20220809 625) ((emacs (28 1)) (magit (3 3 0))) "Support marking commits as read" single ((:commit . "9367f7e4038792073f090b2c881cdbde1ab47f40") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://codeberg.org/ideasman42/emacs-magit-commit-mark"))]) @@ -2960,7 +2959,7 @@ (magit-rbr . [(20181009 2016) ((magit (2 13 0)) (emacs (24 3))) "Support for git rbr in Magit" single ((:commit . "029203b3e48537205052a058e964f058cd802c3c") (:authors ("Anatoly Fayngelerin" . "fanatoly+magitrbr@gmail.com")) (:maintainer "Anatoly Fayngelerin" . "fanatoly+magitrbr@gmail.com") (:keywords "git" "magit" "rbr" "tools") (:url . "https://github.com/fanatoly/magit-rbr"))]) (magit-reviewboard . [(20200727 1748) ((emacs (25 2)) (magit (2 13 0)) (s (1 12 0)) (request (0 3 0))) "Show open Reviewboard reviews in Magit" single ((:commit . "aceedff88921f1dfef8a6b2fb18fe316fb7223a8") (:authors ("Jules Tamagnan" . "jtamagnan@gmail.com")) (:maintainer "Jules Tamagnan" . "jtamagnan@gmail.com") (:keywords "magit" "vc") (:url . "http://github.com/jtamagnan/magit-reviewboard"))]) (magit-section . [(20220901 331) ((emacs (25 1)) (compat (28 1 1 2)) (dash (20210826))) "Sections for read-only buffers." tar ((:commit . "248d8103f83db841adf3d92b358ae42b81df41dc") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/magit/magit"))]) - (magit-stgit . [(20220911 845) ((emacs (24 4)) (magit (2 12 0)) (magit-popup (2 12 0))) "StGit extension for Magit" single ((:commit . "0b522949aa80109f2b8e3d38619cda26ca842558") (:authors ("Lluís Vilanova" . "vilanova@ac.upc.edu")) (:maintainer "UNMAINTAINED") (:keywords "vc" "tools"))]) + (magit-stgit . [(20220914 1349) ((emacs (24 4)) (magit (2 12 0)) (magit-popup (2 12 0))) "StGit extension for Magit" single ((:commit . "bf96fa0f40c087329ad7e6a3b1946de7df03559c") (:authors ("Lluís Vilanova" . "vilanova@ac.upc.edu")) (:maintainer "UNMAINTAINED") (:keywords "vc" "tools"))]) (magit-svn . [(20220314 1451) ((emacs (25 1)) (magit (2 90 1)) (transient (0 3 2))) "Git-Svn extension for Magit" single ((:commit . "b8277081db90977247ae3900ea6afeb0ca644d36") (:authors ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Phil Jackson" . "phil@shellarchive.co.uk") (:keywords "vc" "tools"))]) (magit-tbdiff . [(20220527 2213) ((emacs (25 1)) (magit (3 0 0))) "Magit extension for range diffs" single ((:commit . "55e6443710def357f3f78eea27d5bbe023d868f5") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-tbdiff"))]) (magit-todos . [(20220822 2224) ((emacs (26 1)) (async (1 9 2)) (dash (2 13 0)) (f (0 17 2)) (hl-todo (1 9 0)) (magit (2 13 0)) (pcre2el (1 8)) (s (1 12 0)) (transient (0 2 0))) "Show source file TODOs in Magit" single ((:commit . "c5030cc27c7c1a48db52b0134bf2648a59a43176") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "magit" "vc") (:url . "http://github.com/alphapapa/magit-todos"))]) @@ -2975,7 +2974,7 @@ (major-mode-icons . [(20220210 1404) ((emacs (24 3)) (powerline (2 4)) (all-the-icons (2 3 0))) "display icon for major-mode on mode-line." tar ((:commit . "b0214e0af13cd3691c4d28f03e3108bd98ec7a85") (:keywords "frames" "multimedia") (:url . "https://repo.or.cz/major-mode-icons.git"))]) (make-color . [(20140625 1150) nil "Alternative to picking color - update fg/bg color by pressing r/g/b/... keys" single ((:commit . "a1b34e95ccd3ebee4fba1489ab613d0b3078026d") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "color") (:url . "https://github.com/alezost/make-color.el"))]) (make-it-so . [(20190625 1036) ((swiper (0 8 0)) (emacs (24))) "Transform files with Makefile recipes." tar ((:commit . "b73dfb640588123c9eece230ad72b37604f5c126") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "make" "dired") (:url . "https://github.com/abo-abo/make-it-so"))]) - (makefile-executor . [(20201119 1500) ((emacs (24 3)) (dash (2 11 0)) (f (0 11 0)) (s (1 10 0))) "Commands for conveniently running makefile targets" single ((:commit . "d0a34c355fb80a8616ae7ed5eebbda8507aa14ac") (:authors ("Lowe Thiderman" . "lowe.thiderman@gmail.com")) (:maintainer "Lowe Thiderman" . "lowe.thiderman@gmail.com") (:keywords "processes") (:url . "https://github.com/thiderman/makefile-executor.el"))]) + (makefile-executor . [(20220914 1024) ((emacs (27 1)) (dash (2 11 0)) (f (0 11 0)) (s (1 10 0))) "Commands for conveniently running makefile targets" single ((:commit . "b2dd81e4218ed1c19ae48da815be01a55c435417") (:authors ("Lowe Thiderman" . "lowe.thiderman@gmail.com")) (:maintainer "Lowe Thiderman" . "lowe.thiderman@gmail.com") (:keywords "processes") (:url . "https://github.com/thiderman/makefile-executor.el"))]) (makey . [(20131231 1430) ((cl-lib (0 2))) "interactive commandline mode" single ((:commit . "a61781e69d3b451551e269446e1c5f624ab81137") (:authors ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainer "Mickey Petersen" . "mickey@masteringemacs.org"))]) (malinka . [(20171202 1021) ((s (1 9 0)) (dash (2 4 0)) (f (0 11 0)) (cl-lib (0 3)) (rtags (0 0)) (projectile (0 11 0))) "A C/C++ project configuration package for Emacs" single ((:commit . "e3dc5b0703a5954057110b82cb397a990ace23e6") (:authors ("Lefteris Karapetsas" . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas" . "lefteris@refu.co") (:keywords "c" "c++" "project-management") (:url . "https://github.com/LefterisJP/malinka"))]) (mallard-mode . [(20131204 425) nil "Major mode for editing Mallard files" tar ((:commit . "0a4cfede57bc31134495804ce513cc106de8de3c") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com") (:keywords "xml" "mallard") (:url . "https://github.com/jhradilek/emacs-mallard-mode"))]) @@ -2990,7 +2989,7 @@ (map-progress . [(20190128 16) ((cl-lib (0 6 1))) "mapping macros that report progress" single ((:commit . "1fb916159cd054c233ce3c80d9d01adfae640297") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/map-progress"))]) (map-regexp . [(20190128 18) ((cl-lib (0 6 1))) "map over matches of a regular expression" single ((:commit . "ae2d1c22f786ad987aef3e319925e80160a887a0") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/map-regexp"))]) (marcopolo . [(20160421 1004) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client to the Docker HUB/Registry API" tar ((:commit . "85db828f2bb4346a811b3326349b1c6d0aae4601") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "docker") (:url . "https://github.com/nlamirault/marcopolo"))]) - (marginalia . [(20220909 1343) ((emacs (27 1))) "Enrich existing commands with completion annotations" single ((:commit . "b6d9a7e663847d5b539adf46ecb68d25d18f68a3") (:authors ("Omar Antolín Camarena , Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Omar Antolín Camarena , Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/marginalia"))]) + (marginalia . [(20220914 945) ((emacs (27 1))) "Enrich existing commands with completion annotations" single ((:commit . "db12d80307ea9d6de44b59d18533c9cbf0c51724") (:authors ("Omar Antolín Camarena , Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Omar Antolín Camarena , Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/marginalia"))]) (mark-multiple . [(20121118 1554) nil "Sorta lets you mark several regions at once." tar ((:commit . "f6a53c7c5283d640ae718f4548b0fda78877a375") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "marking" "library"))]) (mark-thing-at . [(20201219 231) ((emacs (26)) (choice-program (0 13))) "Mark a pattern at the current point" single ((:commit . "b012270ea7780ed02ddf61d884b96cdc4fc01594") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "mark" "point" "lisp") (:url . "https://github.com/plandes/mark-thing-at"))]) (mark-tools . [(20130614 1025) nil "Some simple tools to access the mark-ring in Emacs" single ((:commit . "a11b61effa90bd0abc876d12573674d36fc17f0c") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/emacs-mark-tools"))]) @@ -3126,7 +3125,7 @@ (monokai-pro-theme . [(20210206 1820) nil "A simple theme based on the Monokai Pro Sublime color schemes" tar ((:commit . "d0489741a80d818713c290a1a4bdd985877228bb") (:authors ("Kaleb Elwert" . "belak@coded.io")) (:maintainer "Kaleb Elwert" . "belak@coded.io") (:url . "https://github.com/belak/emacs-monokai-pro-theme"))]) (monokai-theme . [(20220117 1244) nil "A fruity color theme for Emacs." single ((:commit . "4a09c59f948ba5b602b6f395e667f53224fd75a2") (:authors ("Kelvin Smith" . "oneKelvinSmith@gmail.com")) (:maintainer "Kelvin Smith" . "oneKelvinSmith@gmail.com") (:url . "http://github.com/oneKelvinSmith/monokai-emacs"))]) (monotropic-theme . [(20211116 1328) ((emacs (24))) "Monotropic Theme" single ((:commit . "f32a04b5bfee9cbcce4b223f17228d1142a28211") (:authors ("caffo")) (:maintainer "caffo") (:url . "https://github.com/caffo/monotropic-theme"))]) - (monroe . [(20210824 2348) nil "Yet another client for nREPL" single ((:commit . "d140512781bda5160b4786f591694a569639b9ad") (:authors ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainer "Sanel Zukan" . "sanelz@gmail.com") (:keywords "languages" "clojure" "nrepl" "lisp") (:url . "http://www.github.com/sanel/monroe"))]) + (monroe . [(20220915 1557) nil "Yet another client for nREPL" single ((:commit . "328da792abad95f14c40499f48d288f0baa6697b") (:authors ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainer "Sanel Zukan" . "sanelz@gmail.com") (:keywords "languages" "clojure" "nrepl" "lisp") (:url . "http://www.github.com/sanel/monroe"))]) (mood-line . [(20211003 2113) ((emacs (25 1))) "A minimal mode-line inspired by doom-modeline" single ((:commit . "ef1c752679a8f92faa7b4828adbbb300b6942f22") (:authors ("Jessie Hildebrandt ")) (:maintainer "Jessie Hildebrandt ") (:keywords "mode-line" "faces") (:url . "https://gitlab.com/jessieh/mood-line"))]) (mood-one-theme . [(20220613 114) ((emacs (24 4))) "A dark color scheme inspired by the Doom One theme." single ((:commit . "033910aaf1bb41f384d1b5b96d55975d1378a34b") (:authors ("Jessie Hildebrandt ")) (:maintainer "Jessie Hildebrandt ") (:keywords "mode-line" "faces") (:url . "https://gitlab.com/jessieh/mood-one-theme"))]) (moody . [(20220620 844) ((emacs (25 3)) (compat (28 1 1 0))) "Tabs and ribbons for the mode line" single ((:commit . "a798096ee4ccf66ef2aa7016c00c8531bd63d27a") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "faces") (:url . "https://github.com/tarsius/moody"))]) @@ -3142,7 +3141,7 @@ (mote-mode . [(20160123 29) ((ruby-mode (1 1))) "Mote minor mode" single ((:commit . "666c6641addbd3b337a7aa01fd2742ded2f41b83") (:authors ("Leandro López (inkel)" . "inkel.ar@gmail.com")) (:maintainer "Leandro López (inkel)" . "inkel.ar@gmail.com") (:url . "http://inkel.github.com/mote-mode/"))]) (motion-mode . [(20140920 156) ((flymake-easy (0 7)) (flymake-cursor (1 0 2))) "major mode for RubyMotion enviroment" tar ((:commit . "4c94180e3ecea611a61240a0c0cd48f1032c4a55") (:authors ("Satoshi Namai")) (:maintainer "Satoshi Namai") (:url . "https://github.com/ainame/motion-mode"))]) (move-dup . [(20210127 1938) ((emacs (25 1))) "Eclipse-like moving and duplicating lines or rectangles" single ((:commit . "bf2e578b89d7e7bf0b5500d9afcf49ac6ec2dcd1") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "convenience" "text" "edit") (:url . "https://github.com/wyuenho/move-dup"))]) - (move-text . [(20220908 1632) nil "Move current line or region with M-up or M-down." single ((:commit . "646378e8848811fdbc571a9d16c76ac62f27aaad") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:keywords "edit") (:url . "https://github.com/emacsfodder/move-text"))]) + (move-text . [(20220914 457) nil "Move current line or region with M-up or M-down." single ((:commit . "c47727ada2c17d2832d62079ca981852ae0b0623") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:keywords "edit") (:url . "https://github.com/emacsfodder/move-text"))]) (mowedline . [(20161122 235) nil "elisp utilities for using mowedline" single ((:commit . "bde4de0a4e1404127b0a48897d8cd1d1cb8a263d") (:authors ("John Foerch" . "jjfoerch@earthlink.net")) (:maintainer "John Foerch" . "jjfoerch@earthlink.net"))]) (mozc . [(20210306 1053) nil "minor mode to input Japanese with Mozc" single ((:commit . "b8dc3b676c0443853bf55c3ab5b73db54132441d") (:keywords "mule" "multilingual" "input method"))]) (mozc-cand-posframe . [(20200208 750) ((emacs (26 1)) (posframe (0 5 0)) (mozc (20180101 800)) (s (1 12))) "Posframe frontend for mozc.el" single ((:commit . "1d07d5055381008ccbb29b97315d140e09a7ee95") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "i18n" "tooltip") (:url . "https://github.com/akirak/mozc-posframe"))]) @@ -3276,7 +3275,7 @@ (nnreddit . [(20220423 2302) ((emacs (25 1)) (request (0 3 3)) (anaphora (1 0 4)) (dash (2 18 1)) (json-rpc (0 0 1)) (virtualenvwrapper (20151123)) (s (1 6 1))) "Gnus Backend For Reddit" tar ((:commit . "8f247dce12bd10de37f0903f3027a1ddbc318eff") (:keywords "news") (:url . "https://github.com/dickmao/nnreddit"))]) (nntwitter . [(20220213 1654) ((emacs (25 1)) (dash (20190401)) (anaphora (20180618)) (request (20190819))) "Gnus Backend For Twitter" tar ((:commit . "f0eb3f6e8040f9064a18d3761b41f41dfd21a6ee") (:keywords "news") (:url . "https://github.com/dickmao/nntwitter"))]) (no-emoji . [(20180515 1837) ((emacs (24))) "Show :emoji-name: instead of emoji characters" single ((:commit . "ebceeab50dbfe4d60235180a57633745dbc18c77") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:keywords "extensions") (:url . "https://github.com/ecraven/no-emoji"))]) - (no-littering . [(20220910 1920) ((emacs (25 1)) (compat (28 1 1 0))) "Help keeping ~/.emacs.d clean" single ((:commit . "f5265df68c73781a383d6c1379557b85b6318771") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/emacscollective/no-littering"))]) + (no-littering . [(20220915 1024) ((emacs (25 1)) (compat (28 1 1 0))) "Help keeping ~/.emacs.d clean" single ((:commit . "1d5ac2720662aa60a33ff916dc9402e61c65064b") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/emacscollective/no-littering"))]) (no-spam . [(20190724 1854) ((emacs (25 1))) "Add repeat delays to commands" single ((:commit . "860860e4a0d59bd15c8e092dc42f5f7f769a428e") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:keywords "keyboard" "tools") (:url . "https://github.com/mamapanda/no-spam"))]) (noaa . [(20220812 1535) ((emacs (27 1)) (kv (0 0 19)) (request (0 2 0)) (s (1 12 0))) "Get NOAA weather data" single ((:commit . "c691e770da0f1ed5b83c656087dfbc2ff231bef7") (:authors ("David Thompson")) (:maintainer "David Thompson") (:keywords "calendar") (:url . "https://github.com/thomp/noaa"))]) (noccur . [(20191015 719) nil "Run multi-occur on project/dired files" single ((:commit . "fa91647a305e89561d3dbe53da002fff49abe0bb") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "convenience"))]) @@ -3343,7 +3342,7 @@ (ob-dart . [(20170106 1624) nil "org-babel functions for Dart evaluation" single ((:commit . "2e463d83a3fe1c9c86f2040e0d22c06dfa49ecbf") (:authors ("Milan Zimmermann")) (:maintainer "Milan Zimmermann") (:keywords "literate programming" "reproducible research" "emacs" "org" "babel" "dart") (:url . "http://github.org/mzimmerm/ob-dart"))]) (ob-deno . [(20201019 101) ((emacs (26 1))) "Babel Functions for Javascript/TypeScript with Deno" single ((:commit . "e3b06d7662687e402905b9de4ad1d5816e89b842") (:authors ("HIGASHI Taiju")) (:maintainer "HIGASHI Taiju") (:keywords "literate programming" "reproducible research" "javascript" "typescript" "tools") (:url . "https://github.com/taiju/ob-deno"))]) (ob-diagrams . [(20160407 1237) nil "org-babel functions for diagrams evaluation" single ((:commit . "be45815f5596d181592fae709096b7b5f4a71992") (:authors ("Daniel Bergey")) (:maintainer "Daniel Bergey") (:keywords "literate programming" "reproducible research") (:url . "http://orgmode.org"))]) - (ob-dsq . [(20220614 1942) ((emacs (27 1))) "Babel functions for the `dsq` CLI tool by Multiprocess Labs" single ((:commit . "45a1e4a24bc89a23912478479b9afb162dd768a3") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "data" "tools") (:url . "https://github.com/fritzgrabo/ob-dsq"))]) + (ob-dsq . [(20220915 1610) ((emacs (27 1))) "Babel functions for the `dsq` CLI tool by Multiprocess Labs" single ((:commit . "e001b263af87993755319caefaf5d19e196e4e1b") (:authors ("Fritz Grabo" . "hello@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "hello@fritzgrabo.com") (:keywords "data" "tools") (:url . "https://github.com/fritzgrabo/ob-dsq"))]) (ob-elixir . [(20170725 1419) ((org (8))) "org-babel functions for elixir evaluation" single ((:commit . "8990a8178b2f7bd93504a9ab136622aab6e82e32") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "elixir") (:url . "http://github.com/zweifisch/ob-elixir"))]) (ob-elm . [(20200528 1857) ((emacs (26 1)) (org (9 3))) "Org-babel functions for elm evaluation" single ((:commit . "d3a9fbc2f56416894c9aed65ea9a20cc1d98f15d") (:authors ("Bonface M. K.")) (:maintainer "Bonface M. K.") (:keywords "languages" "tools") (:url . "https://www.bonfacemunyoki.com"))]) (ob-elvish . [(20180427 1900) nil "org-babel functions for Elvish shell" single ((:commit . "369181ceae1190bf971c71aebf9fc6133bd98c39") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "literate programming" "elvish" "shell" "languages" "processes" "tools") (:url . "https://github.com/zzamboni/ob-elvish"))]) @@ -3511,7 +3510,7 @@ (org-kanban . [(20220723 1216) ((s (0)) (dash (2 17 0)) (emacs (24 4)) (org (9 1))) "kanban dynamic block for org-mode." single ((:commit . "e78deb03880ae89d6bceae6563ef1383526233a1") (:authors ("Christian Köstlin" . "christian.koestlin@gmail.com")) (:maintainer "Christian Köstlin" . "christian.koestlin@gmail.com") (:keywords "org-mode" "org" "kanban" "tools") (:url . "http://github.com/gizmomogwai/org-kanban"))]) (org-kindle . [(20220210 1408) ((emacs (25)) (cl-lib (0 5)) (seq (2 20))) "Send org link file to ebook reader." single ((:commit . "fadcfd62e254d0c45e87d63128a82a08ae21869a") (:keywords "org" "link" "ebook" "kindle" "epub" "azw3" "mobi") (:url . "https://repo.or.cz/org-kindle.git"))]) (org-latex-impatient . [(20210409 2251) ((emacs (26)) (s (1 8 0)) (posframe (0 8 0)) (org (9 3)) (dash (2 17 0))) "Preview org-latex Fragments Instantly via MathJax" single ((:commit . "39f22dc98cb8268af67c6df71778ec5784d2b683") (:authors ("Sheng Yang" . "styang@fastmail.com")) (:maintainer "Sheng Yang" . "styang@fastmail.com") (:keywords "tex" "tools") (:url . "https://github.com/yangsheng6810/org-latex-instant-preview"))]) - (org-link-beautify . [(20220912 1056) ((emacs (28 1)) (all-the-icons (5 0 0))) "Beautify Org Links" single ((:commit . "8005f6de28ffee2d8d4f805582d24457bfc06de9") (:keywords "hypermedia") (:url . "https://repo.or.cz/org-link-beautify.git"))]) + (org-link-beautify . [(20220914 1311) ((emacs (28 1)) (all-the-icons (5 0 0))) "Beautify Org Links" single ((:commit . "e349e50928651199213518b84f6df429ac3a32d8") (:keywords "hypermedia") (:url . "https://repo.or.cz/org-link-beautify.git"))]) (org-link-travis . [(20140405 2327) ((org (7))) "Insert/Export the link of Travis CI on org-mode" single ((:commit . "596615ad8373d9090bd4138da683524f0ad0bda5") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "org") (:url . "https://github.com/aki2o/org-link-travis"))]) (org-linkotron . [(20200112 2235) ((emacs (26 1)) (org (9 3))) "Org-mode link selector" tar ((:commit . "d0adc5247b205bc73d2f1a83d4a512d2be541eb5") (:authors ("Per Weijnitz" . "per.weijnitz@gmail.com")) (:maintainer "Per Weijnitz" . "per.weijnitz@gmail.com") (:keywords "hypermedia" "org") (:url . "https://gitlab.com/perweij/org-linkotron"))]) (org-listcruncher . [(20210706 1741) ((seq (2 3)) (emacs (26 1))) "Planning tool - Parse Org mode lists into table" single ((:commit . "075e0e6d36eb50406a608bc8a2f0dd359ec63938") (:authors ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainer "Derek Feichtinger" . "dfeich@gmail.com") (:keywords "convenience") (:url . "https://github.com/dfeich/org-listcruncher"))]) @@ -3521,7 +3520,7 @@ (org-mind-map . [(20180826 2340) ((emacs (24)) (dash (1 8 0)) (org (8 2 10))) "Creates a directed graph from org-mode files" single ((:commit . "41df4b2e30455494f1848b4e06cc9208aa9e902b") (:authors ("Ted Wiles" . "theodore.wiles@gmail.com")) (:maintainer "Ted Wiles" . "theodore.wiles@gmail.com") (:keywords "orgmode" "extensions" "graphviz" "dot") (:url . "https://github.com/theodorewiles/org-mind-map"))]) (org-ml . [(20220711 1528) ((emacs (27 1)) (org (9 3)) (dash (2 17)) (s (1 12))) "Functional Org Mode API" tar ((:commit . "385e3bee497f858705144d7ab5e6570d31d3ffe8") (:authors ("Nathan Dwarshuis" . "ndwar@yavin4.ch")) (:maintainer "Nathan Dwarshuis" . "ndwar@yavin4.ch") (:keywords "org-mode" "outlines") (:url . "https://github.com/ndwarshuis/org-ml"))]) (org-mobile-sync . [(20180606 524) ((emacs (24 3 50)) (org (8 0))) "automatically sync org-mobile on changes" single ((:commit . "06764b943a528827df1e2acc6bc7806cc2c1351f") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "org-mode" "org" "mobile" "sync" "todo") (:url . "https://framagit.org/steckerhalter/org-mobile-sync"))]) - (org-modern . [(20220913 1543) ((emacs (27 1))) "Modern looks for Org" single ((:commit . "e086f14f352f387be61b93da99024254fe49071e") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/org-modern"))]) + (org-modern . [(20220914 1432) ((emacs (27 1))) "Modern looks for Org" single ((:commit . "d6307eefcc1576579f21defb1a18cac2f693a194") (:authors ("Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/org-modern"))]) (org-movies . [(20210920 101) ((emacs (26 1)) (org (9 0)) (request (0 3 0))) "Manage watchlist with Org mode" single ((:commit . "e96fecaffa2924de64a507aa31d2934e667ee1ea") (:authors ("Anh T Nguyen")) (:maintainer "Anh T Nguyen") (:keywords "hypermedia" "outlines" "org") (:url . "https://github.com/teeann/org-movies"))]) (org-mru-clock . [(20220902 654) ((emacs (26 1))) "Clock in/out of tasks with completion and persistent history" single ((:commit . "2d3374a1b758a04f08f75b2a5fe05e99989077c1") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "calendar") (:url . "https://github.com/unhammer/org-mru-clock"))]) (org-msg . [(20220809 1736) ((emacs (24 4)) (htmlize (1 54))) "Org mode to send and reply to email in HTML." single ((:commit . "e0174324ac37a63ed36869c7632dd7139f1b2419") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:keywords "extensions" "mail") (:url . "https://github.com/jeremy-compostella/org-msg"))]) @@ -3647,7 +3646,7 @@ (osx-org-clock-menubar . [(20150205 2111) nil "simple menubar integration for org-clock" tar ((:commit . "9964d2a97cc2fb6570dc4116da44f73bd8eb7cb3") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com") (:keywords "org" "osx") (:url . "https://github.com/jordonbiondo/osx-org-clock-menubar"))]) (osx-plist . [(20200212 1724) ((emacs (25 1))) "Apple plist file parser" single ((:commit . "cd86c03a52eab9b1a1496618809155b25b030ba6") (:authors ("Theresa O'Connor" . "tess@oconnor.cx")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:keywords "convenience") (:url . "https://github.com/gonewest818/osx-plist"))]) (osx-pseudo-daemon . [(20200215 513) nil "Daemon mode that plays nice with OSX." single ((:commit . "564b006835facc4a8df247d8a47ab1030d7e7beb") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "convenience" "osx") (:url . "https://github.com/DarwinAwardWinner/osx-pseudo-daemon"))]) - (osx-trash . [(20210419 2229) ((emacs (24 1))) "System trash for OS X" tar ((:commit . "af74a2055a15bf4182d8196600f7decd66eec634") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "files" "convenience" "tools" "unix") (:url . "https://github.com/lunaryorn/osx-trash.el"))]) + (osx-trash . [(20220913 1736) ((emacs (24 1))) "System trash for OS X" tar ((:commit . "90f0c99206022fec646206018fcd63d9d2e57325") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "files" "convenience" "tools" "unix") (:url . "https://github.com/lunaryorn/osx-trash.el"))]) (otama . [(20160404 1032) nil "Org-table Manipulator" single ((:commit . "b69e0740846ace7885b0c0717f7abe8d0419eefd") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "database" "org-mode"))]) (other-emacs-eval . [(20180408 1348) ((emacs (25 1)) (async (1 9 2))) "Evaluate the Emacs Lisp expression in other Emacs" single ((:commit . "8ace5acafef65daabf0c6619eff60733d7f5d792") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "tools") (:url . "https://github.com/xuchunyang/other-emacs-eval"))]) (ouroboros . [(20220810 1617) ((emacs (27 1)) (dash (2 19 0)) (cbor (0 2 2)) (bech32 (0 2 0))) "Ouroboros network mini-protocol" single ((:commit . "5e1bf8b8ffa4c75bece7a93feab9858f0e7d676e") (:authors ("Oscar Najera ")) (:maintainer "Oscar Najera" . "hi@oscarnajera.com") (:url . "https://github.com/Titan-C/cardano.el"))]) @@ -3892,7 +3891,7 @@ (poe-lootfilter-mode . [(20190330 1117) ((emacs (24 3))) "Major mode for editing Path of Exile lootfilters" single ((:commit . "5ef06684cb2b17b090ee1f303c2b789fa71bc106") (:authors ("Jeremiah Dodds" . "jeremiah.dodds@gmail.com")) (:maintainer "Jeremiah Dodds" . "jeremiah.dodds@gmail.com") (:keywords "languages" "games") (:url . "https://github.com/jdodds/poe-lootfilter-mode"))]) (poet-client . [(20190403 708) ((emacs (24 4)) (request (0 3 0))) "Client for po.et network api" single ((:commit . "38a9635cab4799224153f89ff47cf1b060fb3939") (:authors ("W.Yahia")) (:maintainer "W.Yahia") (:url . "https://github.com/wailo/emacs-poet"))]) (poet-theme . [(20200606 2343) ((emacs (24 1))) "A theme for prose" tar ((:commit . "16eb694f0755c04c4db98614d0eca1199fddad70") (:authors ("Kunal Bhalla" . "bhalla.kunal@gmail.com")) (:maintainer "Kunal Bhalla" . "bhalla.kunal@gmail.com") (:keywords "faces" "theme" "prose") (:url . "https://github.com/kunalb/poet/"))]) - (poetry . [(20211016 834) ((transient (0 2 0)) (pyvenv (1 2)) (emacs (25 1))) "Interface to Poetry" single ((:commit . "554ffd3ada6920f2f0ae0d0fcdd1f4e30d531769") (:authors ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainer "Gaby Launay" . "gaby.launay@protonmail.com") (:keywords "python" "tools") (:url . "https://github.com/galaunay/poetry.el"))]) + (poetry . [(20220915 801) ((transient (0 2 0)) (pyvenv (1 2)) (emacs (25 1))) "Interface to Poetry" single ((:commit . "3da3990d3cea17f84c90257cc206540d4ea1b6c6") (:authors ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainer "Gaby Launay" . "gaby.launay@protonmail.com") (:keywords "python" "tools") (:url . "https://github.com/galaunay/poetry.el"))]) (point-pos . [(20170421 1632) nil "Save and restore point positions" single ((:commit . "f4126b64567a81e7f22058f09d56c63b2ff06632") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/alezost/point-pos.el"))]) (point-stack . [(20200427 107) nil "Back and forward navigation through buffer locations" single ((:commit . "cddcea2c91038710c245819b3cda2dd739726134") (:authors ("Matt Harrison" . "matthewharrison@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Matt Harrison" . "matthewharrison@gmail.com"))]) (poke-line . [(20201023 247) ((emacs (24 3))) "Minor mode to show position in a buffer using a Pokemon" tar ((:commit . "8d484dbaa1215d902fbd1e3c9163b39a43ec532a") (:authors ("Ryan Miller" . "ryan@devopsmachine.com")) (:maintainer "Ryan Miller" . "ryan@devopsmachine.com") (:keywords "pokemon" "fun" "mode-line" "mouse") (:url . "https://github.com/RyanMillerC/poke-line/"))]) @@ -4272,7 +4271,7 @@ (rust-auto-use . [(20200608 1359) nil "Utility to automatically insert Rust use statements" single ((:commit . "d5205f7b9b9eae0f7d0893f87d3391464719f9c0") (:authors ("Rotem Yaari" . "rotemy@MBP.local")) (:maintainer "Rotem Yaari" . "rotemy@MBP.local") (:keywords "languages"))]) (rust-mode . [(20220825 1306) ((emacs (25 1))) "A major-mode for editing Rust source code" tar ((:commit . "2d6bc53f526623e585aae5855a81a13b709df97d") (:authors ("Mozilla")) (:maintainer "Mozilla") (:keywords "languages") (:url . "https://github.com/rust-lang/rust-mode"))]) (rust-playground . [(20200116 1043) ((emacs (24 3))) "Local Rust playground for short code snippets." single ((:commit . "5a117781dcb66065bea7830dd73618008fc34949") (:authors ("Alexander I.Grafov" . "grafov@gmail.com")) (:maintainer "Alexander I.Grafov" . "grafov@gmail.com") (:keywords "tools" "rust") (:url . "https://github.com/grafov/rust-playground"))]) - (rustic . [(20220830 1907) ((emacs (26 1)) (rust-mode (1 0 3)) (dash (2 13 0)) (f (0 18 2)) (let-alist (1 0 4)) (markdown-mode (2 3)) (project (0 3 0)) (s (1 10 0)) (seq (2 3)) (spinner (1 7 3)) (xterm-color (1 6))) "Rust development environment" tar ((:commit . "c5564b801a6ff966df39e86830b8313d4c29daed") (:authors ("Mozilla")) (:maintainer "Mozilla") (:keywords "languages"))]) + (rustic . [(20220915 1525) ((emacs (26 1)) (rust-mode (1 0 3)) (dash (2 13 0)) (f (0 18 2)) (let-alist (1 0 4)) (markdown-mode (2 3)) (project (0 3 0)) (s (1 10 0)) (seq (2 3)) (spinner (1 7 3)) (xterm-color (1 6))) "Rust development environment" tar ((:commit . "a391fa6052239fca9e07afafb3227feb4b7d8429") (:authors ("Mozilla")) (:maintainer "Mozilla") (:keywords "languages"))]) (rutils . [(20220619 1421) ((emacs (26 1)) (ess (18 10 1)) (transient (0 3 0))) "R utilities with transient" tar ((:commit . "dd500ab8062ce40cb339ec8620bdfc63fdd28364") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "convenience") (:url . "https://github.com/ShuguangSun/rutils.el"))]) (rvm . [(20220910 1558) nil "Emacs integration for rvm" single ((:commit . "e1e83b5466c132c066142ac63729ba833c530c83") (:authors ("Yves Senn" . "yves.senn@gmx.ch")) (:maintainer "Yves Senn" . "yves.senn@gmx.ch") (:keywords "ruby" "rvm") (:url . "http://www.emacswiki.org/emacs/RvmEl"))]) (ryo-modal . [(20220103 940) ((emacs (25 1))) "Roll your own modal mode" single ((:commit . "0a61eed4d2917422d6401b6abe2037c26dab658a") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com") (:keywords "convenience" "modal" "keys") (:url . "http://github.com/Kungsgeten/ryo-modal"))]) @@ -4710,7 +4709,7 @@ (tangonov-theme . [(20220825 1535) ((emacs (25))) "A 256 color dark theme featuring bright pastels" single ((:commit . "3c0000e3eb0ad5ec56e4415ed10c80f0eaba498b") (:authors ("Trevor Richards" . "trev@trevdev.ca")) (:maintainer "Trevor Richards" . "trev@trevdev.ca") (:keywords "faces" "theme" "dark" "fringe") (:url . "https://sr.ht/~trevdev/tangonov-theme/"))]) (tangotango-theme . [(20220714 2034) nil "Tango Palette color theme for Emacs 24." single ((:commit . "9036c4978965149ae9837bc0ad691b2ba9269052") (:authors ("Julien Barnier" . "julien@nozav.org")) (:maintainer "Julien Barnier" . "julien@nozav.org") (:keywords "tango" "palette" "color" "theme" "emacs") (:url . "https://github.com/juba/color-theme-tangotango"))]) (tao-theme . [(20220414 354) nil "This package provides two parametrized uncoloured color themes for Emacs: tao-yin and tao-yang." tar ((:commit . "d6fe980783e22df310df1ae51ac249c28c83ac53") (:authors ("Peter Kosov" . "11111000000@email.com")) (:maintainer "Peter Kosov" . "11111000000@email.com") (:url . "http://github.com/11111000000/tao-theme-emacs"))]) - (taskpaper-mode . [(20220903 1946) nil "Major mode for working with TaskPaper files" single ((:commit . "89f1afc63b3e4a264d547825477d5aaac12552c9") (:authors ("Dmitry Safronov" . "saf.dmitry@gmail.com")) (:maintainer "Dmitry Safronov" . "saf.dmitry@gmail.com") (:keywords "outlines" "notetaking" "task management" "productivity" "taskpaper") (:url . "https://github.com/saf-dmitry/taskpaper-mode"))]) + (taskpaper-mode . [(20220915 858) nil "Major mode for working with TaskPaper files" single ((:commit . "f61902771993589498345c0a7df0e0781e86794c") (:authors ("Dmitry Safronov" . "saf.dmitry@gmail.com")) (:maintainer "Dmitry Safronov" . "saf.dmitry@gmail.com") (:keywords "outlines" "notetaking" "task management" "productivity" "taskpaper") (:url . "https://github.com/saf-dmitry/taskpaper-mode"))]) (taskrunner . [(20190916 1608) ((emacs (25 1)) (projectile (2 0 0)) (async (1 9 3))) "Retrieve build system/taskrunner tasks" tar ((:commit . "716323aff410b4d864d137c9ebe4bbb5b8587f5e") (:authors ("Yavor Konstantinov ")) (:maintainer "Yavor Konstantinov ") (:keywords "build-system" "taskrunner" "build" "task-runner" "tasks" "convenience") (:url . "https://github.com/emacs-taskrunner/emacs-taskrunner"))]) (tawny-mode . [(20191108 1346) ((cider (0 12)) (emacs (25))) "Ontology Editing with Tawny-OWL" single ((:commit . "079028b7547743a36384650981ea068849aac53e") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) (tblui . [(20161007 1912) ((dash (2 12 1)) (magit-popup (2 6 0)) (tablist (0 70)) (cl-lib (0 5))) "Define tabulated list UI easily" single ((:commit . "e280e11b35a2fdbcadf9ce901a2b62684ac7a7a3") (:authors ("Yuki Inoue ")) (:maintainer "Yuki Inoue ") (:url . "https://github.com/Yuki-Inoue/tblui.el"))]) @@ -4807,7 +4806,7 @@ (toggle-quotes . [(20140710 926) nil "Toggle between single and double quoted string" single ((:commit . "33abc221d6887f0518337851318065cd86c34b03") (:authors ("Jim Tian" . "tianjin.sc@gmail.com")) (:maintainer "Jim Tian" . "tianjin.sc@gmail.com") (:keywords "convenience" "quotes") (:url . "https://github.com/toctan/toggle-quotes.el"))]) (toggle-test . [(20140723 537) nil "Toggle between source and test files in various programming languages" single ((:commit . "a0b64834101c2b8b24da365baea1d36e57b069b5") (:authors ("Raghunandan Rao" . "r.raghunandan@gmail.com")) (:maintainer "Raghunandan Rao" . "r.raghunandan@gmail.com") (:keywords "tdd" "test" "toggle" "productivity") (:url . "https://github.com/rags/toggle-test"))]) (toggle-window . [(20141207 1548) nil "toggle current window size between half and full" single ((:commit . "e82c60e543933880402ede11e9423e48a17dde53") (:authors ("Kenny Liu")) (:maintainer "Kenny Liu") (:keywords "hide" "window") (:url . "https://github.com/deadghost/toggle-window"))]) - (tok-theme . [(20220913 820) ((emacs (26 1))) "Comfy dark monochromatic theme" single ((:commit . "ce5b617ccff850e21afa75e75a80709fd30766d0") (:authors ("Topi Kettunen" . "topi@topikettunen.com")) (:maintainer "Topi Kettunen" . "topi@topikettunen.com") (:url . "https://github.com/topikettunen/tok-theme"))]) + (tok-theme . [(20220915 751) ((emacs (26 1))) "Comfy dark monochromatic theme" single ((:commit . "137a68f69c3df8754c195346bb3a82238ea3caa8") (:authors ("Topi Kettunen" . "topi@topikettunen.com")) (:maintainer "Topi Kettunen" . "topi@topikettunen.com") (:url . "https://github.com/topikettunen/tok-theme"))]) (tokei . [(20220823 2058) ((emacs (27 1)) (magit-section (3 3 0))) "Display codebase statistics" single ((:commit . "86fbca422f580a95eb30247e46891184f3ac5c18") (:authors ("Daniel Nagy ")) (:maintainer "Daniel Nagy" . "danielnagy@posteo.de") (:url . "https://github.com/nagy/tokei.el"))]) (tomatinho . [(20180621 1748) nil "Simple and beautiful pomodoro timer" tar ((:commit . "b53354b9b9f496c0388d6a573b06b7d6fc53d0bd") (:authors ("Konrad Scorciapino" . "scorciapino@gmail.com")) (:maintainer "Konrad Scorciapino" . "scorciapino@gmail.com") (:keywords "time" "productivity" "pomodoro technique"))]) (toml . [(20130903 1255) nil "TOML (Tom's Obvious, Minimal Language) parser" single ((:commit . "9633a6872928e737a2335aae1065768b23d8c3b3") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:keywords "toml" "parser") (:url . "https://github.com/gongo/emacs-toml"))]) @@ -4832,12 +4831,12 @@ (tramp-hdfs . [(20210526 339) ((emacs (24 4))) "Tramp extension to access hadoop/hdfs file system in Emacs" single ((:commit . "aa93bdbb3d5619c262ce53af1981edcd2a0705e5") (:authors ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainer "Raghav Kumar Gautam" . "raghav@apache.org") (:keywords "tramp" "emacs" "hdfs" "hadoop" "webhdfs" "rest"))]) (tramp-term . [(20220725 1441) nil "Automatic setup of directory tracking in ssh sessions" single ((:commit . "ed75189122737d301f716a30a8013205aa3736f1") (:authors ("Randy Morris" . "randy.morris@archlinux.us")) (:maintainer "Randy Morris" . "randy.morris@archlinux.us") (:keywords "comm" "terminals") (:url . "https://github.com/randymorris/tramp-term.el"))]) (transfer-sh . [(20200601 1708) ((emacs (24 3)) (async (1 0))) "Simple interface for sending buffer contents to transfer.sh" single ((:commit . "0621a66d00ec91a209a542c10b158095088bd44d") (:keywords "comm" "convenience" "files") (:url . "https://gitlab.com/tuedachu/transfer-sh.el"))]) - (transient . [(20220806 2224) ((emacs (25 1)) (compat (28 1 1 0))) "Transient commands" tar ((:commit . "3b267425c0fe93a518a703d814cff3cf6a304a97") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "extensions") (:url . "https://github.com/magit/transient"))]) + (transient . [(20220915 1511) ((emacs (25 1)) (compat (28 1 1 0))) "Transient commands" tar ((:commit . "555792f71e0ad41a08ab50cce26e229d5769aeea") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "extensions") (:url . "https://github.com/magit/transient"))]) (transient-dwim . [(20220425 1331) ((emacs (26 1)) (transient (0 1))) "Useful preset transient commands" single ((:commit . "7b6e70fb49b9d18106748202011863ebc39b864a") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/transient-dwim.el"))]) (transient-posframe . [(20210102 130) ((emacs (26 0)) (posframe (0 4 3)) (transient (0 2 0))) "Using posframe to show transient" single ((:commit . "5f0874ac3ce6f50968ed5e088d6538a07bdfd11f") (:authors ("Yanghao Xie")) (:maintainer "Yanghao Xie" . "yhaoxie@gmail.com") (:keywords "convenience" "bindings" "tooltip") (:url . "https://github.com/yanghaoxie/transient-posframe"))]) (translate-mode . [(20220511 1357) ((emacs (24 3))) "Paragraph-oriented side-by-side doc translation workflow" single ((:commit . "e1940b333241a4d0c224b7b875962736ca2b693b") (:authors ("Ray Wang" . "rayw.public@gmail.com")) (:maintainer "Ray Wang" . "rayw.public@gmail.com") (:keywords "translate" "convenience" "editing") (:url . "https://github.com/rayw000/translate-mode"))]) (transmission . [(20210705 2152) ((emacs (24 4)) (let-alist (1 0 5))) "Interface to a Transmission session" single ((:commit . "a03a6f5c7b133e0a37896b6d993dd6d6d4532cc2") (:authors ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainer "Mark Oteiza" . "mvoteiza@udel.edu") (:keywords "comm" "tools"))]) - (transpose-frame . [(20200307 2119) nil "Transpose windows arrangement in a frame" single ((:commit . "12e523d70ff78cc8868097b56120848befab5dbc") (:authors ("S. Irie")) (:maintainer "S. Irie") (:keywords "window"))]) + (transpose-frame . [(20220913 1749) nil "Transpose windows arrangement in a frame" single ((:commit . "7b7f8a1582436749a57ebbba6ead716b5a0edddc") (:authors ("S. Irie")) (:maintainer "S. Irie") (:keywords "window"))]) (transpose-mark . [(20150405 716) nil "Transpose data using the Emacs mark" single ((:commit . "667327602004794de97214cf336ac61650ef75b7") (:authors ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainer "Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com") (:keywords "transpose" "convenience"))]) (transwin . [(20220704 640) ((emacs (24 3))) "Make window/frame transparent" single ((:commit . "209b410f406ab4db5bb357d8f5b305982d3dea4b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "frames" "window" "transparent") (:url . "https://github.com/jcs-elpa/transwin"))]) (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"))]) @@ -4849,19 +4848,19 @@ (tree-sitter-ess-r . [(20220801 1453) ((emacs (26 1)) (ess (18 10 1)) (tree-sitter (0 12 1)) (tree-sitter-langs (0 12 0))) "R with tree-sitter" single ((:commit . "52fcf9a83dc3ec1cbd0b662794a59cfc23eaa204") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/tree-sitter-ess-r"))]) (tree-sitter-indent . [(20220411 1439) ((emacs (26 1)) (tree-sitter (0 12 1)) (seq (2 20))) "Provide indentation with a Tree-sitter backend" single ((:commit . "4ef246db3e4ff99f672fe5e4b416c890f885c09e") (:authors ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Felipe Lema" . "felipelema@mortemale.org") (:keywords "convenience" "internal") (:url . "https://codeberg.org/FelipeLema/tree-sitter-indent.el"))]) (tree-sitter-ispell . [(20220704 340) ((emacs (25 1)) (tree-sitter (0 15 0))) "Run ispell on tree-sitter text nodes" single ((:commit . "5cd63219bbef77eb002c7e7d0df30f5714ae69dc") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/tree-sitter-ispell.el"))]) - (tree-sitter-langs . [(20220911 657) ((emacs (25 1)) (tree-sitter (0 15 0))) "Grammar bundle for tree-sitter" tar ((:commit . "4896a562df42990c33891eda043b78420adbd3a0") (: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"))]) + (tree-sitter-langs . [(20220915 441) ((emacs (25 1)) (tree-sitter (0 15 0))) "Grammar bundle for tree-sitter" tar ((:commit . "6d18db5e68d106b21c5c6a746bd262a8e8782a2c") (: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 . [(20220913 1231) ((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 . "fd1e70e5ad212eee6cf42215f0e9af1f46621fe1") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs . [(20220915 1626) ((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 . "59b1fc20fed4b0c196a3f92606fd0358e2334eae") (: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 . "ba0afc8be921776b5813e44d5495f09556da087b") (: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 . "ba0afc8be921776b5813e44d5495f09556da087b") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) - (treemacs-icons-dired . [(20220913 1231) ((treemacs (0 0)) (emacs (26 1))) "Treemacs icons for dired" single ((:commit . "fd1e70e5ad212eee6cf42215f0e9af1f46621fe1") (: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 . [(20220911 1427) ((emacs (26 1)) (treemacs (0 0)) (pfuture (1 3)) (magit (2 90 0))) "Magit integration for treemacs" single ((:commit . "ba0afc8be921776b5813e44d5495f09556da087b") (: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 . "ba0afc8be921776b5813e44d5495f09556da087b") (: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 . "ba0afc8be921776b5813e44d5495f09556da087b") (: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 . "ba0afc8be921776b5813e44d5495f09556da087b") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) (treemacs-tab-bar . [(20220221 2038) ((emacs (27 1)) (treemacs (0 0)) (dash (2 11 0))) "Tab bar integration for treemacs" single ((:commit . "b18a05b1f62074a40e6011d83cd4c92cbee040dd") (: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 . [(20191108 2217) ((emacs (25 1))) "Generic tree traversal tools" single ((:commit . "306f7031d26e4ebfc9ff36614acdc6993f3e23c3") (: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"))]) - (treeview . [(20210723 2256) ((emacs (24 4))) "A generic tree navigation library" single ((:commit . "09c8c1d045c7c8eace61b10b6df9d2f9079de78e") (: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"))]) + (treeview . [(20220912 2346) ((emacs (24 4))) "A generic tree navigation library" single ((:commit . "b68f77bf102b289e7b0e97f767bb7ffff9a5835b") (: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"))]) (trident-mode . [(20190410 2036) ((emacs (24)) (slime (20130526)) (skewer-mode (1 5 0)) (dash (1 0 3))) "Live Parenscript interaction" single ((:commit . "109a1bc10bd0c4b47679a6ca5c4cd27c7c8d4ccb") (:authors ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainer "John Mastro" . "john.b.mastro@gmail.com") (:keywords "languages" "lisp" "processes" "tools") (:url . "https://github.com/johnmastro/trident-mode.el"))]) (trinary . [(20180904 2313) ((emacs (24))) "Trinary logic." single ((:commit . "886232c6d7e92a8e9fe573eef46754ebe321f90d") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "languages") (:url . "https://github.com/Fuco1/trinary-logic"))]) (tron-legacy-theme . [(20220610 1746) nil "An original retro-futuristic theme inspired by Tron: Legacy" single ((:commit . "72655ce5ea0580cc23966821d2813e4d5e961f93") (:authors ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/tron-legacy-emacs-theme"))]) @@ -5236,7 +5235,7 @@ (zephir-mode . [(20200417 830) ((cl-lib (0 5)) (pkg-info (0 4)) (emacs (25 1))) "Major mode for editing Zephir code" tar ((:commit . "4e9618b77dff67c1c7b6fff78605a62311db88b8") (:authors ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") (:keywords "languages") (:url . "https://github.com/zephir-lang/zephir-mode"))]) (zero-input . [(20200405 1220) ((emacs (24 3)) (s (1 2 0))) "Zero Chinese input method framework" single ((:commit . "729da9f4b99acb744ee6974ed7f3d4e252fd19da") (:url . "https://gitlab.emacsos.com/sylecn/zero-el"))]) (zerodark-theme . [(20211115 841) ((all-the-icons (2 0 0))) "A dark, medium contrast theme for Emacs" single ((:commit . "b463528704f6eb00684c0ee003fbd8e42901cde0") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "themes") (:url . "https://github.com/NicolasPetton/zerodark-theme"))]) - (zetteldeft . [(20220630 1825) ((emacs (25 1)) (deft (0 8)) (ace-window (0 7 0))) "Turn deft into a zettelkasten system" tar ((:commit . "40fe8845ea48c7a6a81ea2771962cd810f789406") (:authors ("EFLS ")) (:maintainer "EFLS ") (:keywords "deft" "zettelkasten" "zetteldeft" "wp" "files") (:url . "https://efls.github.io/zetteldeft/"))]) + (zetteldeft . [(20220914 1351) ((emacs (25 1)) (deft (0 8)) (ace-window (0 7 0))) "Turn deft into a zettelkasten system" tar ((:commit . "045f34532d3d96f08ccca2ab2b34354ff6078c63") (:authors ("EFLS ")) (:maintainer "EFLS ") (:keywords "deft" "zettelkasten" "zetteldeft" "wp" "files") (:url . "https://efls.github.io/zetteldeft/"))]) (zetteldesk . [(20220703 1648) ((emacs (27 1)) (org-roam (2 0))) "A revision and outlining tool for org-roam" single ((:commit . "b9367a738628dbb569ab878b65240a567eadaaf6") (:authors ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainer "Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com") (:url . "https://github.com/Vidianos-Giannitsis/zetteldesk.el"))]) (zetteldesk-info . [(20220626 1100) ((zetteldesk (0 4)) (emacs (27 1))) "A zetteldesk extension for interacting with the info program" single ((:commit . "171fefe91fc616c94b2ec29826fa6893f5816c00") (:authors ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainer "Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com") (:url . "https://github.com/Vidianos-Giannitsis/zetteldesk-info.el"))]) (zetteldesk-kb . [(20220703 1648) ((zetteldesk (1 0 1)) (hydra (0 15)) (major-mode-hydra (0 2)) (emacs (24 1))) "Keybindings for zetteldesk.el" single ((:commit . "b9367a738628dbb569ab878b65240a567eadaaf6") (:authors ("Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com")) (:maintainer "Vidianos Giannitsis" . "vidianosgiannitsis@gmail.com") (:url . "https://github.com/Vidianos-Giannitsis/zetteldesk-kb.el"))]) diff --git a/org/elpa/helm-20220911.1317/.dir-locals.el b/org/elpa/helm-20220914.1117/.dir-locals.el similarity index 100% rename from org/elpa/helm-20220911.1317/.dir-locals.el rename to org/elpa/helm-20220914.1117/.dir-locals.el diff --git a/org/elpa/helm-20220911.1317/emacs-helm.sh b/org/elpa/helm-20220914.1117/emacs-helm.sh similarity index 100% rename from org/elpa/helm-20220911.1317/emacs-helm.sh rename to org/elpa/helm-20220914.1117/emacs-helm.sh diff --git a/org/elpa/helm-20220911.1317/helm-adaptive.el b/org/elpa/helm-20220914.1117/helm-adaptive.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-adaptive.el rename to org/elpa/helm-20220914.1117/helm-adaptive.el diff --git a/org/elpa/helm-20220911.1317/helm-autoloads.el b/org/elpa/helm-20220914.1117/helm-autoloads.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-autoloads.el rename to org/elpa/helm-20220914.1117/helm-autoloads.el diff --git a/org/elpa/helm-20220911.1317/helm-bookmark.el b/org/elpa/helm-20220914.1117/helm-bookmark.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-bookmark.el rename to org/elpa/helm-20220914.1117/helm-bookmark.el diff --git a/org/elpa/helm-20220911.1317/helm-buffers.el b/org/elpa/helm-20220914.1117/helm-buffers.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-buffers.el rename to org/elpa/helm-20220914.1117/helm-buffers.el diff --git a/org/elpa/helm-20220911.1317/helm-color.el b/org/elpa/helm-20220914.1117/helm-color.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-color.el rename to org/elpa/helm-20220914.1117/helm-color.el diff --git a/org/elpa/helm-20220911.1317/helm-comint.el b/org/elpa/helm-20220914.1117/helm-comint.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-comint.el rename to org/elpa/helm-20220914.1117/helm-comint.el diff --git a/org/elpa/helm-20220911.1317/helm-command.el b/org/elpa/helm-20220914.1117/helm-command.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-command.el rename to org/elpa/helm-20220914.1117/helm-command.el diff --git a/org/elpa/helm-20220911.1317/helm-config.el b/org/elpa/helm-20220914.1117/helm-config.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-config.el rename to org/elpa/helm-20220914.1117/helm-config.el diff --git a/org/elpa/helm-20220911.1317/helm-dabbrev.el b/org/elpa/helm-20220914.1117/helm-dabbrev.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-dabbrev.el rename to org/elpa/helm-20220914.1117/helm-dabbrev.el diff --git a/org/elpa/helm-20220911.1317/helm-easymenu.el b/org/elpa/helm-20220914.1117/helm-easymenu.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-easymenu.el rename to org/elpa/helm-20220914.1117/helm-easymenu.el diff --git a/org/elpa/helm-20220911.1317/helm-elisp-package.el b/org/elpa/helm-20220914.1117/helm-elisp-package.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-elisp-package.el rename to org/elpa/helm-20220914.1117/helm-elisp-package.el diff --git a/org/elpa/helm-20220911.1317/helm-elisp.el b/org/elpa/helm-20220914.1117/helm-elisp.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-elisp.el rename to org/elpa/helm-20220914.1117/helm-elisp.el diff --git a/org/elpa/helm-20220911.1317/helm-epa.el b/org/elpa/helm-20220914.1117/helm-epa.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-epa.el rename to org/elpa/helm-20220914.1117/helm-epa.el diff --git a/org/elpa/helm-20220911.1317/helm-eshell.el b/org/elpa/helm-20220914.1117/helm-eshell.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-eshell.el rename to org/elpa/helm-20220914.1117/helm-eshell.el diff --git a/org/elpa/helm-20220911.1317/helm-eval.el b/org/elpa/helm-20220914.1117/helm-eval.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-eval.el rename to org/elpa/helm-20220914.1117/helm-eval.el diff --git a/org/elpa/helm-20220911.1317/helm-external.el b/org/elpa/helm-20220914.1117/helm-external.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-external.el rename to org/elpa/helm-20220914.1117/helm-external.el diff --git a/org/elpa/helm-20220911.1317/helm-fd.el b/org/elpa/helm-20220914.1117/helm-fd.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-fd.el rename to org/elpa/helm-20220914.1117/helm-fd.el diff --git a/org/elpa/helm-20220911.1317/helm-files.el b/org/elpa/helm-20220914.1117/helm-files.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-files.el rename to org/elpa/helm-20220914.1117/helm-files.el diff --git a/org/elpa/helm-20220911.1317/helm-find.el b/org/elpa/helm-20220914.1117/helm-find.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-find.el rename to org/elpa/helm-20220914.1117/helm-find.el diff --git a/org/elpa/helm-20220911.1317/helm-font.el b/org/elpa/helm-20220914.1117/helm-font.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-font.el rename to org/elpa/helm-20220914.1117/helm-font.el diff --git a/org/elpa/helm-20220911.1317/helm-for-files.el b/org/elpa/helm-20220914.1117/helm-for-files.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-for-files.el rename to org/elpa/helm-20220914.1117/helm-for-files.el diff --git a/org/elpa/helm-20220911.1317/helm-global-bindings.el b/org/elpa/helm-20220914.1117/helm-global-bindings.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-global-bindings.el rename to org/elpa/helm-20220914.1117/helm-global-bindings.el diff --git a/org/elpa/helm-20220911.1317/helm-grep.el b/org/elpa/helm-20220914.1117/helm-grep.el similarity index 99% rename from org/elpa/helm-20220911.1317/helm-grep.el rename to org/elpa/helm-20220914.1117/helm-grep.el index b222f96..91e5055 100644 --- a/org/elpa/helm-20220911.1317/helm-grep.el +++ b/org/elpa/helm-20220914.1117/helm-grep.el @@ -325,8 +325,16 @@ will have no effect, use customize instead." (define-key helm-grep-map (kbd "") nil)))) (defcustom helm-grep-ag-command - "ag --line-numbers -S --color --nogroup %s -- %s %s" - "The default command for AG, PT or RG. + (cond ((executable-find "rg") + "rg --color=always --smart-case --search-zip --no-heading --line-number %s -- %s %s") + ((executable-find "ag") + "ag --line-numbers -S --color --nogroup %s -- %s %s")) + "The default command for RG or AG. + +Prefer RG by default if available. + +Update: PT is still mentionned in this documentation but it seems it +doesn't exists anymore, or at least it is no more maintained. Takes three format specs, the first for type(s), the second for pattern and the third for directory. diff --git a/org/elpa/helm-20220911.1317/helm-help.el b/org/elpa/helm-20220914.1117/helm-help.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-help.el rename to org/elpa/helm-20220914.1117/helm-help.el diff --git a/org/elpa/helm-20220911.1317/helm-id-utils.el b/org/elpa/helm-20220914.1117/helm-id-utils.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-id-utils.el rename to org/elpa/helm-20220914.1117/helm-id-utils.el diff --git a/org/elpa/helm-20220911.1317/helm-imenu.el b/org/elpa/helm-20220914.1117/helm-imenu.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-imenu.el rename to org/elpa/helm-20220914.1117/helm-imenu.el diff --git a/org/elpa/helm-20220911.1317/helm-info.el b/org/elpa/helm-20220914.1117/helm-info.el similarity index 98% rename from org/elpa/helm-20220911.1317/helm-info.el rename to org/elpa/helm-20220914.1117/helm-info.el index e996c09..500e545 100644 --- a/org/elpa/helm-20220911.1317/helm-info.el +++ b/org/elpa/helm-20220914.1117/helm-info.el @@ -100,7 +100,7 @@ Argument TOBUF is the `helm-candidate-buffer'." (helm-goto-line (cdr node-line))) (defvar helm-info--node-regexp - "^\\* +\\(.+\\):[ \\t]+\\(.*\\)\\(?:[ \\t]*\\)(line +\\([0-9]+\\))" + "^\\* +\\(.+\\):[[:space:]]+\\(.*\\)\\(?:[[:space:]]*\\)(line +\\([0-9]+\\))" "A regexp that should match file name, node name and line number in a line like this: @@ -109,17 +109,18 @@ a line like this: (defun helm-info-display-to-real (line) "Transform LINE to an acceptable argument for `info'. If line have a node use the node, otherwise use directly first name found." - (let (nodename linum) + (let ((info-file (helm-get-attr 'info-file)) + nodename linum) (when (string-match helm-info--node-regexp line) (setq nodename (match-string 2 line) linum (match-string 3 line))) (if nodename (cons (format "(%s)%s" - (helm-get-attr 'info-file) + info-file (replace-regexp-in-string ":\\'" "" nodename)) (string-to-number (or linum "1"))) (cons (format "(%s)%s" - (helm-get-attr 'info-file) + info-file (helm-aand (replace-regexp-in-string "^* " "" line) (replace-regexp-in-string "::?.*\\'" "" it))) 1)))) diff --git a/org/elpa/helm-20220911.1317/helm-locate.el b/org/elpa/helm-20220914.1117/helm-locate.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-locate.el rename to org/elpa/helm-20220914.1117/helm-locate.el diff --git a/org/elpa/helm-20220911.1317/helm-man.el b/org/elpa/helm-20220914.1117/helm-man.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-man.el rename to org/elpa/helm-20220914.1117/helm-man.el diff --git a/org/elpa/helm-20220911.1317/helm-misc.el b/org/elpa/helm-20220914.1117/helm-misc.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-misc.el rename to org/elpa/helm-20220914.1117/helm-misc.el diff --git a/org/elpa/helm-20220911.1317/helm-mode.el b/org/elpa/helm-20220914.1117/helm-mode.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-mode.el rename to org/elpa/helm-20220914.1117/helm-mode.el diff --git a/org/elpa/helm-20220911.1317/helm-net.el b/org/elpa/helm-20220914.1117/helm-net.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-net.el rename to org/elpa/helm-20220914.1117/helm-net.el diff --git a/org/elpa/helm-20220911.1317/helm-occur.el b/org/elpa/helm-20220914.1117/helm-occur.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-occur.el rename to org/elpa/helm-20220914.1117/helm-occur.el diff --git a/org/elpa/helm-20220911.1317/helm-pkg.el b/org/elpa/helm-20220914.1117/helm-pkg.el similarity index 69% rename from org/elpa/helm-20220911.1317/helm-pkg.el rename to org/elpa/helm-20220914.1117/helm-pkg.el index 50c62f5..966cacc 100644 --- a/org/elpa/helm-20220911.1317/helm-pkg.el +++ b/org/elpa/helm-20220914.1117/helm-pkg.el @@ -1,7 +1,7 @@ -(define-package "helm" "20220911.1317" "Helm is an Emacs incremental and narrowing framework" +(define-package "helm" "20220914.1117" "Helm is an Emacs incremental and narrowing framework" '((helm-core "3.8.7") (popup "0.5.3")) - :commit "288f7d9f173d7ddd7a7766eb333cc2db1c1caa34" :authors + :commit "c3cd741a27247334c5f25998442c377cd3b36c78" :authors '(("Thierry Volpiatto" . "thievol@posteo.net")) :maintainer '("Thierry Volpiatto" . "thievol@posteo.net") diff --git a/org/elpa/helm-20220911.1317/helm-regexp.el b/org/elpa/helm-20220914.1117/helm-regexp.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-regexp.el rename to org/elpa/helm-20220914.1117/helm-regexp.el diff --git a/org/elpa/helm-20220911.1317/helm-ring.el b/org/elpa/helm-20220914.1117/helm-ring.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-ring.el rename to org/elpa/helm-20220914.1117/helm-ring.el diff --git a/org/elpa/helm-20220911.1317/helm-semantic.el b/org/elpa/helm-20220914.1117/helm-semantic.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-semantic.el rename to org/elpa/helm-20220914.1117/helm-semantic.el diff --git a/org/elpa/helm-20220911.1317/helm-shell.el b/org/elpa/helm-20220914.1117/helm-shell.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-shell.el rename to org/elpa/helm-20220914.1117/helm-shell.el diff --git a/org/elpa/helm-20220911.1317/helm-sys.el b/org/elpa/helm-20220914.1117/helm-sys.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-sys.el rename to org/elpa/helm-20220914.1117/helm-sys.el diff --git a/org/elpa/helm-20220911.1317/helm-tags.el b/org/elpa/helm-20220914.1117/helm-tags.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-tags.el rename to org/elpa/helm-20220914.1117/helm-tags.el diff --git a/org/elpa/helm-20220911.1317/helm-types.el b/org/elpa/helm-20220914.1117/helm-types.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-types.el rename to org/elpa/helm-20220914.1117/helm-types.el diff --git a/org/elpa/helm-20220911.1317/helm-utils.el b/org/elpa/helm-20220914.1117/helm-utils.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-utils.el rename to org/elpa/helm-20220914.1117/helm-utils.el diff --git a/org/elpa/helm-20220911.1317/helm-x-files.el b/org/elpa/helm-20220914.1117/helm-x-files.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm-x-files.el rename to org/elpa/helm-20220914.1117/helm-x-files.el diff --git a/org/elpa/helm-20220911.1317/helm.el b/org/elpa/helm-20220914.1117/helm.el similarity index 100% rename from org/elpa/helm-20220911.1317/helm.el rename to org/elpa/helm-20220914.1117/helm.el diff --git a/org/elpa/helm-ls-git-20220727.505/helm-ls-git-pkg.el b/org/elpa/helm-ls-git-20220727.505/helm-ls-git-pkg.el deleted file mode 100644 index c710cb8..0000000 --- a/org/elpa/helm-ls-git-20220727.505/helm-ls-git-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from helm-ls-git.el -*- no-byte-compile: t -*- -(define-package "helm-ls-git" "20220727.505" "list git files." '((helm "1.7.8")) :commit "9d91c25c7d1776d137fd126f241d0272b6e5f90e") diff --git a/org/elpa/helm-ls-git-20220727.505/helm-ls-git.el b/org/elpa/helm-ls-git-20220727.505/helm-ls-git.el deleted file mode 100644 index 8d2a2f0..0000000 --- a/org/elpa/helm-ls-git-20220727.505/helm-ls-git.el +++ /dev/null @@ -1,1929 +0,0 @@ -;;; helm-ls-git.el --- list git files. -*- lexical-binding: t -*- - -;; Copyright (C) 2012 ~ 2022 Thierry Volpiatto - -;; Package-Requires: ((helm "1.7.8")) -;; Package-Version: 20220727.505 -;; Package-Commit: 9d91c25c7d1776d137fd126f241d0272b6e5f90e - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Code - -(require 'cl-lib) -(require 'vc) -(require 'vc-git) -(require 'helm-files) ; helm-grep is required in helm-files. -(require 'helm-types) - -(defvaralias 'helm-c-source-ls-git 'helm-source-ls-git) -(make-obsolete-variable 'helm-c-source-ls-git 'helm-source-ls-git "1.5.1") -(defvaralias 'helm-c-source-ls-git-status 'helm-source-ls-git-status) -(make-obsolete-variable 'helm-c-source-ls-git-status 'helm-source-ls-git-status "1.5.1") - -;; Now the git-grep command is defined in helm-grep.el, -;; alias it for backward compatibility. -(defvar helm-ls-git-grep-command) -(defvaralias 'helm-ls-git-grep-command 'helm-grep-git-grep-command) -(make-obsolete-variable 'helm-ls-git-grep-command 'helm-grep-git-grep-command "1.8.0") - -(defvar server-clients) -(declare-function helm-comp-read "ext:helm-mode.el") -(declare-function server-running-p "server.el") -(declare-function server-edit "server.el") -(declare-function server-send-string "server.el") -(declare-function server-quote-arg "server.el") -;; Define the sources. -(defvar helm-source-ls-git-status nil - "This source will built at runtime. -It can be build explicitly with function -`helm-ls-git-build-git-status-source'.") -(defvar helm-source-ls-git nil - "This source will built at runtime. -It can be build explicitly with function -`helm-ls-git-build-ls-git-source'.") -(defvar helm-source-ls-git-buffers nil - "This source will built at runtime. -It can be build explicitly with function -`helm-ls-git-build-buffers-source'.") - - - -(defgroup helm-ls-git nil - "Helm completion for git repos." - :group 'helm) - -(defcustom helm-ls-git-show-abs-or-relative 'relative - "Show full path or relative path to repo when using `helm-ff-toggle-basename'. -Valid values are symbol \\='absolute' or \\='relative' (default)." - :type '(radio :tag "Show full path or relative path to Git repo when toggling" - (const :tag "Show full path" absolute) - (const :tag "Show relative path" relative))) - -(defcustom helm-ls-git-status-command 'vc-dir - "Favorite git-status command for emacs. - -If you want to use magit use `magit-status-setup-buffer' and not -`magit-status' which is working only interactively." - :type 'symbol) - -(defcustom helm-ls-git-fuzzy-match nil - "Enable fuzzy matching in `helm-source-ls-git-status' and `helm-source-ls-git'." - :set (lambda (var val) - (set var val) - (setq helm-source-ls-git nil - helm-source-ls-git-status nil - helm-source-ls-git-buffers nil)) - :type 'boolean) - -(defcustom helm-ls-git-default-sources '(helm-source-ls-git-status - helm-ls-git-branches-source - helm-source-ls-git-buffers - helm-source-ls-git - helm-ls-git-stashes-source - helm-ls-git-create-branch-source) - "Default sources for `helm-ls-git-ls'." - :type '(repeat symbol)) - -(defcustom helm-ls-git-format-glob-string "'%s'" - "String to format globs in `helm-grep-get-file-extensions'. -Glob are enclosed in single quotes by default." - :type 'string) - -(defcustom helm-ls-git-ls-switches '("ls-files" "--full-name" "--") - "A list of arguments to pass to `git-ls-files'. -To see files in submodules add the option \"--recurse-submodules\". -If you have problems displaying unicode filenames use -\'(\"-c\" \"core.quotePath=false\" \"ls-files\" \"--full-name\" \"--\"). -See Issue #52." - :type '(repeat string)) - -(defcustom helm-ls-git-auto-checkout nil - "Stash automatically uncommited changes before checking out a branch." - :type 'boolean) - -(defcustom helm-ls-git-log-max-commits "100" - "Max number of commits to show in git log (git log -n option). -NOTE: This reflects the number of candidates fetched and stored, not -the number of candidates displayed which is relative to -`helm-candidate-number-limit'. IOW if `helm-candidate-number-limit' -== 500 and `helm-ls-git-log-max-commits' == 600, only 500 candidates -will be displayed but if you search for a candidate which is in the -range 500/600 you will find it." - :type 'string) - -(defcustom helm-ls-git-delete-branch-on-remote nil - "Delete remote branch without asking when non nil. -This happen only when deleting a remote branch e.g. remotes/origin/foo." - :type 'boolean) - -(defcustom helm-ls-git-auto-refresh-at-eob t - "Increase git log by `window-height' lines when non nil. -When non nil this disable `helm-move-to-line-cycle-in-source'." - :type 'boolean) - - -(defgroup helm-ls-git-faces nil - "Customize the appearance of helm-files." - :prefix "helm-ls-git-" - :group 'helm-ls-git - :group 'helm-faces) - -(defface helm-ls-git-modified-not-staged-face - '((t :foreground "yellow")) - "Files which are modified but not yet staged.") - -(defface helm-ls-git-modified-and-staged-face - '((t :foreground "Goldenrod")) - "Files which are modified and already staged.") - -(defface helm-ls-git-renamed-modified-face - '((t :foreground "Goldenrod")) - "Files which are renamed or renamed and modified.") - -(defface helm-ls-git-untracked-face - '((t :foreground "red")) - "Files which are not yet tracked by git.") - -(defface helm-ls-git-added-copied-face - '((t :foreground "green")) - "Files which are newly added or copied.") - -(defface helm-ls-git-added-modified-face - '((t :foreground "blue")) - "Files which are newly added and have unstaged modifications.") - -(defface helm-ls-git-deleted-not-staged-face - '((t :foreground "Darkgoldenrod3")) - "Files which are deleted but not staged.") - -(defface helm-ls-git-deleted-and-staged-face - '((t :foreground "DimGray")) - "Files which are deleted and staged.") - -(defface helm-ls-git-conflict-face - '((t :foreground "MediumVioletRed")) - "Files which contain rebase/merge conflicts.") - -(defface helm-ls-git-branches-current - '((t :foreground "gold")) - "Color of the star prefixing current branch.") - -(defface helm-ls-git-branches-name - '((t :foreground "red")) - "Color of branches names.") - -(defface helm-ls-git-branches-name-current - '((t :foreground "green")) - "Color of current branch name.") - - -(defvar helm-ls-git-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map helm-generic-files-map) - (define-key map (kbd "C-s") 'helm-ff-run-grep) - (define-key map (kbd "M-g g") 'helm-ls-git-run-grep) - (define-key map (kbd "C-c g") 'helm-ff-run-gid) - (define-key map (kbd "C-c i") 'helm-ls-git-ls-files-show-others) - (define-key map (kbd "M-e") 'helm-ls-git-run-switch-to-shell) - map)) - -(defvar helm-ls-git-buffer-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map helm-buffer-map) - (define-key map (kbd "C-c i") 'helm-ls-git-ls-files-show-others) - map)) - -(defvar helm-ls-git-branches-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map helm-map) - (define-key map (kbd "C-c b") 'helm-ls-git-branches-toggle-show-all) - (define-key map (kbd "M-L") 'helm-ls-git-run-show-log) - (define-key map (kbd "C-c P") 'helm-ls-git-run-push) - (define-key map (kbd "C-c F") 'helm-ls-git-run-pull) - (define-key map (kbd "C-c f") 'helm-ls-git-run-fetch) - (define-key map (kbd "M-e") 'helm-ls-git-run-switch-to-shell) - map)) - -(defvar helm-ls-git-status-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map helm-ls-git-map) - (define-key map (kbd "C-c c") 'helm-ls-git-run-stage-marked-and-commit) - (define-key map (kbd "C-c a") 'helm-ls-git-run-stage-marked-and-amend-commit) - (define-key map (kbd "C-c s") 'helm-ls-git-run-stage-files) - (define-key map (kbd "C-c e") 'helm-ls-git-run-stage-marked-and-extend-commit) - (define-key map (kbd "C-c z") 'helm-ls-git-run-stash) - (define-key map (kbd "C-c Z") 'helm-ls-git-run-stash-snapshot) - (define-key map (kbd "M-e") 'helm-ls-git-run-switch-to-shell) - map)) - -(defvar helm-ls-git-help-message - "* Helm ls git - -** Tips - -*** Start helm-ls-git - -You can start with `helm-ls-git' but you can also use the generic -`helm-browse-project' which will use `helm-ls-git' if you are in -a git project (actually supported backends are git and hg though -helm-ls-hg is no more maintained). - -*** Git status command - -By default helm-ls-git is using emacs `vc-dir' as `helm-ls-git-status-command', -but perhaps you want to use something better like `magit-status'. - -However helm-ls-git provides most of what you need to basically -manage your git repo so you may not need to use another tool, -here an overview of its features: - -- Status of modified files -- List project branches -- List project files -- List project buffers -- List of Stashs -- Git log for each branches -- Create a new branch from current one -- Commit your changes from status source -- Rebase interactively -- Amend -- Diffs -- Pull and fetch -- Push -- Stash -- Revert -- Reset -- Format patches -- Git AM -- Cherry pick - -etc... - -Of course all these features are not enhanced as what you could -find in a Git specialized tool like Magit but it may fit most of -your needs. - -*** Git log - -From branches source, you can launch git log. With a numeric -prefix arg specify the number of commits to show, once you are in -git log and you want more commits, use a numeric prefix arg with -\\\\[helm-refresh] to specify the number of commits to show. - -When scrolling down with an empty pattern, helm can increase -automatically the number of candidates displayed when you reach -end of buffer if `helm-ls-git-auto-refresh-at-eob' is non nil. - -NOTE: When searching in git log, Helm search in the candidates -computed initially, this mean that when you have 100 candidates -displayed (see `helm-ls-git-log-max-commits') and you search for -a commit containing \"foo\", this commit will not be found if it -is located in the 101 commit which is not displayed. So if you -don't find something you are looking for, increase the number of -commits with \\\\[universal-argument] \\\\[helm-refresh]. - -**** Specify a range of commits - -Once you are in Git log you can specify with 2 marked -candidates a range of commits, specifying more than two marked -candidate for actions accepting only ranges will fail. When -specifying a range of commits, the top commit will be included in -range whereas the bottom commit will not be included, e.g. if you -mark commit-2 and commit-5, and use the format-patch action, git -will make 01-commit-4.patch, 02-commit-3.patch, and -03-commit-2.patch files taking care of naming files in the -reverse order for applying patches later, commit-5 beeing -excluded. - -NOTE: For commodity, commits are specified as short hash for all actions, witch -may clash if more than one commit have the same short ID (rare -but may happen), you should have an error in such case. - -**** Apply patches from one branch to current - -You can apply patches from one branch to current -branch using git AM action. -Patches are specified as a range of commits, see [[Specify a range of commits][Specify a range of commits]]. - -**** Persistent action in git log - -Persistent action in git log shows diff of selected commit, if you -want to always show diff while moving from one commit to the -other use follow-mode (C-c C-f). - -*** Git commit - -Commits will be done using emacsclient as GIT_EDITOR, with -major-mode `helm-ls-git-commmit-mode' which provide following commands: - -\\ -|Keys|Description -|-------------+--------------| -|\\[helm-ls-git-server-edit]|Exit when done -|\\[helm-ls-git-server-edit-abort]|Abort - -If you want to specify another author, use a prefix arg when -calling commit action, you will be prompted for author name and -email. - -NOTE: This mode is based on diff-mode, this to show a colorized -diff of your commit, you can use any regular emacs editing -commands from there. - -*** Git rebase - -helm-ls-git provide two rebase actions, one that run -interactively from git log source and one that work -non-interactively from branches source. With the former you can -rebase interactively from a given commit you selected from git log -and this ONLY for current branch, once done you can rebase one -branch into the other from branches source. This is one workflow -that helm-ls-git provide, other workflows may not work, so for -more complex usage switch to command line or a more enhaced tool -like Magit. For editing the first file git rebase use for -rebasing (\"git-rebase-todo\") helm-ls-git use a major-mode -called `helm-ls-git-rebase-todo-mode' which provide several commands: - -\\ -|Keys|Description -|-------------+--------------| -|p|pick -|r|reword -|e|edit -|s|squash -|f|fixup -|x|exec -|d|drop -|\\[helm-ls-git-rebase-todo-move-down]|Move line down -|\\[helm-ls-git-rebase-todo-move-up]|Move line up -|\\[helm-ls-git-server-edit]|Exit when done -|\\[helm-ls-git-server-edit-abort]|Abort - -*** Git grep usage - -The behavior is not exactly the same as what you have when you -launch git-grep from `helm-find-files', here in what it differ: - -1) The prefix arg allow to grep only the `default-directory' whereas -with `helm-find-files' the prefix arg allow browsing the whole repo. -So with `helm-ls-git' the default is to grep the whole repo. - -2) With `helm-ls-git', because you have the whole list of files of the repo -you can mark some of the files to grep only those, if no files are marked grep -the whole repo or the files under current directory depending of prefix arg. - -NOTE: The previous behavior was prompting user for the file -extensions to grep, this is non sense because we have here the -whole list of files (recursive) of current repo and not only the -file under current directory, so we have better time -selectionning the files we want to grep. - -**** Grep a subdirectory of current repository. - -Switch to `helm-find-files' with `C-x C-f', navigate to your directory -and launch git-grep from there. - -*** Problem with unicode filenames (chinese etc...) - -See docstring of `helm-ls-git-ls-switches'. - -** Commands -\\ -|Keys|Description -|-----------+----------| -|\\[helm-ls-git-run-grep]|Run git-grep. -|\\[helm-ff-run-gid]|Run Gid. -|\\[helm-ls-git-ls-files-show-others]|Toggle tracked/non tracked files view. -|\\[helm-ls-git-run-switch-to-shell]|Switch to shell -|\\ -|\\[helm-ff-run-toggle-basename]|Toggle basename. -|\\[helm-ff-run-zgrep]|Run zgrep. -|\\[helm-ff-run-pdfgrep]|Run Pdfgrep on marked files. -|\\[helm-ff-run-copy-file]|Copy file(s) -|\\[helm-ff-run-rename-file]|Rename file(s). -|\\[helm-ff-run-symlink-file]|Symlink file(s). -|\\[helm-ff-run-hardlink-file]|Hardlink file(s). -|\\[helm-ff-run-delete-file]|Delete file(s). -|\\[helm-ff-run-byte-compile-file]|Byte compile file(s) (C-u load) (elisp). -|\\[helm-ff-run-load-file]|Load file(s) (elisp). -|\\[helm-ff-run-ediff-file]|Ediff file. -|\\[helm-ff-run-ediff-merge-file]|Ediff merge file. -|\\[helm-ff-run-switch-other-window]|Switch other window. -|\\[helm-ff-properties-persistent]|Show file properties. -|\\[helm-ff-run-etags]|Run etags (C-u use tap, C-u C-u reload DB). -|\\[helm-yank-text-at-point]|Yank text at point. -|\\[helm-ff-run-open-file-externally]|Open file with external program (C-u to choose). -|\\[helm-ff-run-open-file-with-default-tool]|Open file externally with default tool. -|\\[helm-ff-run-insert-org-link]|Insert org link.") - - - -;; Append visited files from `helm-source-ls-git' to `file-name-history'. -(add-to-list 'helm-files-save-history-extra-sources "Git files") - - -(defvar helm-ls-git-log-file nil) ; Set it for debugging. - - -(defun helm-ls-git-list-files () - (when (and helm-ls-git-log-file - (file-exists-p helm-ls-git-log-file)) - (delete-file helm-ls-git-log-file)) - ;; `helm-resume' will use the local value of `default-directory' - ;; in `helm-buffer' as value for `default-directory'. - (helm-aif (helm-ls-git-root-dir) - (with-helm-default-directory it - (with-output-to-string - (with-current-buffer standard-output - (apply #'process-file - "git" - nil (list t helm-ls-git-log-file) nil - helm-ls-git-ls-switches)))) - ;; Return empty string to give to `split-string' - ;; in `helm-ls-git-init'. - "")) - -(defun helm-ls-git-ls-files-show-others () - "Toggle view of tracked/non tracked files." - (interactive) - (with-helm-alive-p - (setq helm-ls-git-ls-switches - (if (member "-o" helm-ls-git-ls-switches) - (remove "-o" helm-ls-git-ls-switches) - (helm-append-at-nth helm-ls-git-ls-switches "-o" 1))) - (helm-force-update))) -(put 'helm-ls-git-ls-files-show-others 'no-helm-mx t) - -(cl-defun helm-ls-git-root-dir (&optional (directory default-directory)) - (locate-dominating-file directory ".git")) - -(defun helm-ls-git-not-inside-git-repo () - (not (helm-ls-git-root-dir))) - -(defun helm-ls-git-transformer (candidates _source) - (cl-loop with root = (helm-ls-git-root-dir) - with untracking = (member "-o" helm-ls-git-ls-switches) - for file in candidates - for abs = (expand-file-name file root) - for disp = (if (and helm-ff-transformer-show-only-basename - (not (string-match "[.]\\{1,2\\}\\'" file))) - (helm-basename file) file) - collect - (cons (propertize (if untracking (concat "? " disp) disp) - 'face (if untracking - 'helm-ls-git-untracked-face - 'helm-ff-file)) - abs))) - -(defun helm-ls-git-sort-fn (candidates _source) - "Transformer for sorting candidates." - (helm-ff-sort-candidates candidates nil)) - -(defun helm-ls-git-init () - (let ((data (cl-loop with root = (helm-ls-git-root-dir) - for c in (split-string (helm-ls-git-list-files) "\n" t) - collect (if (eq helm-ls-git-show-abs-or-relative 'relative) - c (expand-file-name c root))))) - (when (null data) - (setq data - (if helm-ls-git-log-file - (with-current-buffer - (find-file-noselect helm-ls-git-log-file) - (prog1 - (buffer-substring-no-properties - (point-min) (point-max)) - (kill-buffer))) - data))) - (helm-init-candidates-in-buffer 'global data))) - -(defvar helm-ls-git--current-branch nil) -(defun helm-ls-git--branch () - (or helm-ls-git--current-branch - (with-temp-buffer - (let ((ret (process-file "git" nil t nil "symbolic-ref" "--short" "HEAD"))) - ;; Use sha of HEAD when branch name is missing. - (unless (zerop ret) - (erase-buffer) - (process-file "git" nil t nil "rev-parse" "--short" "HEAD"))) - ;; We use here (goto-char (point-min)) instead of (point-min) - ;; to not endup with a ^J control char at end of branch name. - (buffer-substring-no-properties (goto-char (point-min)) - (line-end-position))))) - -(defun helm-ls-git-header-name (name) - (format "%s (%s)" name (helm-ls-git--branch))) - -(defun helm-ls-git-actions-list (&optional actions) - (helm-append-at-nth - actions - (helm-make-actions "Git status" - (lambda (_candidate) - (funcall helm-ls-git-status-command - (helm-default-directory))) - "Git grep files (`C-u' only current directory)" - 'helm-ls-git-grep - "Gid" 'helm-ff-gid - "Switch to shell" 'helm-ls-git-switch-to-shell) - 1)) - -(defun helm-ls-git-match-part (candidate) - (if (with-helm-buffer helm-ff-transformer-show-only-basename) - (helm-basename candidate) - candidate)) - -(defclass helm-ls-git-source (helm-source-in-buffer) - ((header-name :initform 'helm-ls-git-header-name) - (init :initform 'helm-ls-git-init) - (cleanup :initform (lambda () - (setq helm-ls-git-ls-switches (remove "-o" helm-ls-git-ls-switches)))) - (update :initform (lambda () - (helm-set-local-variable - 'helm-ls-git--current-branch nil))) - (keymap :initform 'helm-ls-git-map) - (help-message :initform 'helm-ls-git-help-message) - (match-part :initform 'helm-ls-git-match-part) - (filtered-candidate-transformer - :initform '(helm-ls-git-transformer - helm-ls-git-sort-fn)) - (action-transformer :initform 'helm-transform-file-load-el) - (group :initform 'helm-ls-git))) - -(defclass helm-ls-git-status-source (helm-source-in-buffer) - ((header-name :initform 'helm-ls-git-header-name) - (init :initform - (lambda () - (helm-init-candidates-in-buffer 'global - (helm-ls-git-status)))) - (keymap :initform 'helm-ls-git-status-map) - (filtered-candidate-transformer :initform 'helm-ls-git-status-transformer) - (persistent-action :initform 'helm-ls-git-diff) - (persistent-help :initform "Diff") - (help-message :initform 'helm-ls-git-help-message) - (action-transformer :initform 'helm-ls-git-status-action-transformer) - (action :initform - (helm-make-actions - "Find file" 'helm-find-many-files - "Git status" (lambda (_candidate) - (funcall helm-ls-git-status-command - (helm-default-directory))) - "Switch to shell" #'helm-ls-git-switch-to-shell)) - (group :initform 'helm-ls-git))) - -(defun helm-ls-git-revert-buffers-in-project () - (cl-loop for buf in (helm-browse-project-get-buffers (helm-ls-git-root-dir)) - when (buffer-file-name (get-buffer buf)) - do (with-current-buffer buf (revert-buffer nil t)))) - -(defun helm-ls-git-diff (candidate) - (let ((default-directory - (expand-file-name (file-name-directory candidate))) - (win (get-buffer-window "*vc-diff*" 'visible))) - (if (and win - (eq last-command 'helm-execute-persistent-action)) - (with-helm-window - (kill-buffer "*vc-diff*") - (if (and helm-persistent-action-display-window - (window-dedicated-p (next-window win 1))) - (delete-window helm-persistent-action-display-window) - (set-window-buffer win helm-current-buffer))) - (when (buffer-live-p (get-buffer "*vc-diff*")) - (kill-buffer "*vc-diff*")) - (vc-git-diff (helm-marked-candidates)) - (pop-to-buffer "*vc-diff*") - (diff-mode)))) - -;;; Git grep -;; -(defun helm-ls-git-grep (_candidate) - (let* ((helm-grep-default-command helm-ls-git-grep-command) - helm-grep-default-recurse-command - (mkd (helm-marked-candidates)) - (files (if (cdr mkd) mkd '(""))) - ;; Expand filename of each candidate with the git root dir. - ;; The filename will be in the help-echo prop. - (helm-grep-default-directory-fn 'helm-ls-git-root-dir) - ;; set `helm-ff-default-directory' to the root of project. - (helm-ff-default-directory (if helm-current-prefix-arg - default-directory - (helm-ls-git-root-dir)))) - (helm-do-grep-1 files))) - -(defun helm-ls-git-run-grep () - "Run Git Grep action from helm-ls-git." - (interactive) - (with-helm-alive-p - (helm-exit-and-execute-action 'helm-ls-git-grep))) -(put 'helm-ls-git-run-grep 'no-helm-mx t) - -;;; Git log -;; -(defvar helm-ls-git-log--last-log "" - "Cache for git log during the helm-ls-git-log session.") -(defvar helm-ls-git-log--last-number-commits "0" - "The number of commits actually displayed in this session.") -(defvar helm-ls-git-log--is-full nil) - -(defun helm-ls-git-auto-refresh-and-scroll () - "Increase git log by `window-height' lines." - (with-helm-window - (let ((wlines (window-height))) - (when (and (helm-end-of-source-p) - (string= helm-pattern "") - (eq this-command 'helm-next-line)) - (let ((current-prefix-arg wlines)) - (with-helm-after-update-hook - (setq unread-command-events nil)) - (helm-force-update)))))) - -(defun helm-ls-git-log (&optional branch num) - "Run git log branch -n num and return the resulting string." - (when (and branch (string-match "->" branch)) - (setq branch (car (last (split-string branch "->"))))) - (let* ((last-number-commits (string-to-number - helm-ls-git-log--last-number-commits)) - (commits-number (if num - (number-to-string - (if (> num last-number-commits) - (- num last-number-commits) - num)) - helm-ls-git-log-max-commits)) - (switches `("log" "--color" - "--date=local" - "--pretty=format:%C(yellow)%h%Creset \ - %C(green)%ad%Creset %<(60,trunc)%s %Cred%an%Creset %C(auto)%d%Creset" - "-n" ,commits-number - "--skip" ,(helm-stringify - helm-ls-git-log--last-number-commits) - ,(or branch ""))) - output) - (unless helm-ls-git-log--is-full - (setq helm-ls-git-log--last-number-commits - (number-to-string - (+ last-number-commits - (string-to-number commits-number)))) - (helm-set-attr 'candidate-number-limit - (string-to-number helm-ls-git-log--last-number-commits)) - (message "Git log on `%s' updating to `%s' commits..." - branch helm-ls-git-log--last-number-commits) - (with-helm-default-directory (helm-ls-git-root-dir) - (setq helm-ls-git-log--last-log - (concat helm-ls-git-log--last-log - ;; Avoid adding a newline at first run. - (unless (zerop last-number-commits) "\n") - (setq output - (with-output-to-string - (with-current-buffer standard-output - (apply #'process-file "git" nil t nil switches))))))) - (when (and (stringp output) (string= output "")) - (setq helm-ls-git-log--is-full t))) - (if helm-ls-git-log--is-full - (message "No more commits on `%s' branch" branch) - (message "Git log on `%s' updating to `%s' commits done" - branch helm-ls-git-log--last-number-commits)) - helm-ls-git-log--last-log)) - -(defun helm-ls-git-show-log (branch) - (let ((name (replace-regexp-in-string "[ *]" "" branch)) - ;; Use helm-current-prefix-arg only on first call - ;; of init function. - (prefarg helm-current-prefix-arg)) - (when (buffer-live-p "*git log diff*") - (kill-buffer "*git log diff*")) - (helm :sources (helm-build-in-buffer-source "Git log" - :header-name (lambda (sname) (format "%s (%s)" sname name)) - :init (lambda () - (helm-init-candidates-in-buffer 'global - (helm-ls-git-log name (helm-aif (or prefarg - ;; for force-update. - current-prefix-arg) - (prefix-numeric-value it)))) - (setq prefarg nil)) - :get-line 'buffer-substring - :marked-with-props 'withprop - :cleanup (lambda () - (setq helm-ls-git-log--last-log "" - helm-ls-git-log--last-number-commits "0" - helm-ls-git-log--is-full nil)) - :help-message 'helm-ls-git-help-message - :action '(("Show commit" . helm-ls-git-log-show-commit) - ("Find file at rev" . helm-ls-git-log-find-file) - ("Kill rev as short hash" . - helm-ls-git-log-kill-short-hash) - ("Kill rev as long hash" . - helm-ls-git-log-kill-long-hash) - ("Cherry-pick" . helm-ls-git-log-cherry-pick) - ("Format patches (range between 2 marked)" . helm-ls-git-log-format-patch) - ("Git am (range between 2 marked)" . helm-ls-git-log-am) - ("Git interactive rebase" . helm-ls-git-log-interactive-rebase) - ("Hard reset" . helm-ls-git-log-hard-reset) - ("Soft reset" . helm-ls-git-log-soft-reset) - ("Git revert" . helm-ls-git-log-revert)) - :candidate-transformer - (lambda (candidates) - (cl-loop for c in candidates - collect (ansi-color-apply c))) - :group 'helm-ls-git) - :move-selection-before-hook (and helm-ls-git-auto-refresh-at-eob - 'helm-ls-git-auto-refresh-and-scroll) - :move-to-line-cycle-in-source (unless helm-ls-git-auto-refresh-at-eob - (default-value 'helm-move-to-line-cycle-in-source)) - :buffer "*helm-ls-git log*"))) - -(defun helm-ls-git-log-show-commit-1 (candidate) - (let ((sha (car (split-string candidate)))) - (with-current-buffer (get-buffer-create "*git log diff*") - (let ((inhibit-read-only t)) - (erase-buffer) - (insert (with-helm-default-directory (helm-ls-git-root-dir - (helm-default-directory)) - (with-output-to-string - (with-current-buffer standard-output - (process-file - "git" nil (list t helm-ls-git-log-file) nil - "show" "-p" sha))))) - (goto-char (point-min)) - (diff-mode)) - (display-buffer (current-buffer))))) - -(defun helm-ls-git-log-kill-short-hash (candidate) - (kill-new (car (split-string candidate)))) - -(defun helm-ls-git-log-kill-long-hash (_candidate) - (helm-ls-git-log-get-long-hash 'kill)) - -(defun helm-ls-git-log-get-long-hash (&optional kill) - (with-helm-buffer - (let* ((cand (helm-get-selection nil 'withprop)) - (short-hash (car (split-string cand))) - str) - (setq str - (replace-regexp-in-string - "\n" "" - (shell-command-to-string - (format "git rev-parse --default %s" short-hash)))) - (if kill (kill-new str) str)))) - -(defun helm-ls-git-log-format-patch (_candidate) - (helm-ls-git-log-format-patch-1)) - -(defun helm-ls-git-log-am (_candidate) - (helm-ls-git-log-format-patch-1 'am)) - -(defun helm-ls-git-log-format-patch-1 (&optional am) - (let ((commits (cl-loop for c in (helm-marked-candidates) - collect (car (split-string c)))) - range switches) - (cond ((= 2 (length commits)) - ;; Using "..." makes a range from top marked (included) to - ;; bottom marked (not included) e.g. when we have commit-2 - ;; marked and commit-5 marked the serie of patches will be - ;; 01-commit-4.patch, 02-commit-3.patch, 03-commit-2.patch, - ;; git taking care of numering the patch in reversed order - ;; for further apply. - (setq range (mapconcat 'identity (sort commits #'string-lessp) "...") - switches `("format-patch" ,range))) - ((not (cdr commits)) - (setq range (car commits) - switches `("format-patch" "-1" ,range))) - ((> (length commits) 2) - (error "Specify either a single commit or a range with only two marked commits"))) - (with-helm-default-directory (helm-ls-git-root-dir - (helm-default-directory)) - (if am - (with-current-buffer-window "*git am*" '(display-buffer-below-selected - (window-height . fit-window-to-buffer) - (preserve-size . (nil . t))) - nil - (process-file-shell-command - (format "git %s | git am -3 -k" - (mapconcat 'identity (helm-append-at-nth switches '("-k --stdout") 1) " ")) - nil t t)) - (apply #'process-file "git" nil "*git format-patch*" nil switches))))) - -(defun helm-ls-git-log-reset-1 (hard-or-soft) - (let ((rev (car (split-string (helm-get-selection nil 'withprop)))) - (arg (cl-case hard-or-soft - (hard "--hard") - (soft "--soft")))) - (with-helm-default-directory (helm-ls-git-root-dir - (helm-default-directory)) - (when (and (y-or-n-p (format "%s reset to <%s>?" - (capitalize (symbol-name hard-or-soft)) rev)) - (= (process-file "git" nil nil nil "reset" arg rev) 0)) - (message "Now at `%s'" (helm-ls-git-oneline-log - (helm-ls-git--branch))))))) - -(defun helm-ls-git-log-hard-reset (_candidate) - (helm-ls-git-log-reset-1 'hard)) - -(defun helm-ls-git-log-soft-reset (_candidate) - (helm-ls-git-log-reset-1 'soft)) - -(defun helm-ls-git-log-revert (_candidate) - (let ((rev (car (split-string (helm-get-selection nil 'withprop))))) - (helm-ls-git-with-editor "revert" rev))) - -(defun helm-ls-git-log-revert-continue (_candidate) - (helm-ls-git-with-editor "revert" "--continue")) - -(defun helm-ls-git-log-revert-abort (_candidate) - (with-helm-default-directory (helm-default-directory) - (process-file "git" nil nil nil "revert" "--abort"))) - -(defun helm-ls-git-log-show-commit (candidate) - (if (and (eq last-command 'helm-execute-persistent-action) - (get-buffer-window "*git log diff*" 'visible)) - (kill-buffer "*git log diff*") - (helm-ls-git-log-show-commit-1 candidate))) - -(defun helm-ls-git-log-find-file (_candidate) - (with-helm-default-directory (helm-default-directory) - (let* ((rev (car (split-string (helm-get-selection nil 'withprop)))) - (file (helm :sources (helm-build-in-buffer-source "Git cat-file" - :data (helm-ls-git-list-files)) - :buffer "*helm-ls-git cat-file*")) - (fname (concat rev ":" file)) - (path (expand-file-name fname)) - str status) - (setq str (with-output-to-string - (with-current-buffer standard-output - (setq status (process-file "git" nil t nil "cat-file" "-p" fname))))) - (if (zerop status) - (progn - (with-current-buffer (find-file-noselect path) - (insert str) - (save-buffer)) - (find-file path)) - (error "No such file %s at %s" file rev))))) - -(defun helm-ls-git-log-cherry-pick (_candidate) - (let* ((commits (cl-loop for c in (helm-marked-candidates) - collect (car (split-string c)) into revs - finally return (sort revs #'string-greaterp)))) - (with-helm-default-directory (helm-ls-git-root-dir - (helm-default-directory)) - (with-current-buffer-window "*git cherry-pick*" '(display-buffer-below-selected - (window-height . fit-window-to-buffer) - (preserve-size . (nil . t))) - nil - (apply #'process-file "git" nil "*git cherry-pick*" nil "cherry-pick" commits))))) - -(defun helm-ls-git-cherry-pick-abort (_candidate) - (with-helm-default-directory (helm-default-directory) - (process-file "git" nil nil nil "cherry-pick" "--abort"))) - -(defun helm-ls-git-rebase-abort (_candidate) - (with-helm-default-directory (helm-default-directory) - (process-file "git" nil nil nil "rebase" "--abort"))) - -(defun helm-ls-git-merge-abort (_candidate) - (with-helm-default-directory (helm-default-directory) - (process-file "git" nil nil nil "merge" "--abort"))) - -(defun helm-ls-git-rebase-continue (_candidate) - (helm-ls-git-with-editor "rebase" "--continue")) - -(defun helm-ls-git-cherry-pick-continue (_candidate) - (helm-ls-git-with-editor "cherry-pick" "--continue")) - -(defun helm-ls-git-am-continue (_candidate) - (helm-ls-git-with-editor "am" "--continue")) - -(defun helm-ls-git-merge-continue (_candidate) - (helm-ls-git-with-editor "merge" "--continue")) - -(defun helm-ls-git-rebase-running-p () - (with-helm-buffer - (with-helm-default-directory (helm-ls-git-root-dir) - (let ((git-dir (expand-file-name ".git" default-directory))) - (or (file-exists-p (expand-file-name "rebase-merge" git-dir)) - (file-exists-p (expand-file-name "rebase-apply/onto" git-dir))))))) - -(defun helm-ls-git-log-interactive-rebase (_candidate) - "Rebase interactively current branch from CANDIDATE. -Where CANDIDATE is a candidate from git log source and its commit -object will be passed git rebase i.e. git rebase -i ." - (if (helm-ls-git-rebase-running-p) - (if (y-or-n-p "A rebase is already running, continue ?") - (helm-ls-git-rebase-continue nil) - (helm-ls-git-rebase-abort nil)) - (let ((hash (helm-ls-git-log-get-long-hash))) - (helm-ls-git-with-editor "rebase" "-i" hash)))) - -(defun helm-ls-git-run-show-log () - (interactive) - (with-helm-alive-p - (helm-exit-and-execute-action #'helm-ls-git-show-log))) -(put 'helm-ls-git-run-show-log 'no-helm-mx t) - - -;;; Git branch basic management -;; -(defvar helm-ls-git-branches-show-all nil) - -(defun helm-ls-git-collect-branches (&optional arg) - (helm-aif (helm-ls-git-root-dir) - (with-helm-default-directory it - (with-output-to-string - (with-current-buffer standard-output - (cond ((null arg) - ;; Only local branches. - (apply #'process-file "git" nil t nil '("branch"))) - (t - (apply #'process-file "git" nil t nil '("branch" "-a"))))))) - "")) - -(defun helm-ls-git-branches-toggle-show-all () - (interactive) - (setq helm-ls-git-branches-show-all (not helm-ls-git-branches-show-all)) - (helm-force-update)) -(put 'helm-ls-git-branches-toggle-show-all 'no-helm-mx t) - -(defun helm-ls-git-checkout (candidate) - (let ((default-directory (helm-default-directory))) - (if (and helm-ls-git-auto-checkout - (helm-ls-git-modified-p t)) - (helm-ls-git-stash-1 "") - (cl-assert (not (helm-ls-git-modified-p t)) - nil "Please commit or stash your changes before proceeding")) - (with-helm-default-directory (helm-ls-git-root-dir) - (let* ((branch (replace-regexp-in-string "[ ]" "" candidate)) - (real (replace-regexp-in-string "\\`\\*" "" branch))) - (if (string-match "\\`[*]" candidate) - (message "Already on %s branch" real) - (let* ((switches (if (string-match "\\`[Rr]emotes" real) - `("checkout" "-b" - ,(car (last (split-string real "/" t))) - "-t" ,real) - `("checkout" ,real))) - (status (apply #'process-file "git" - nil nil nil - switches))) - (if (= status 0) - (progn (message "Switched to %s branch" real) - (helm-ls-git-revert-buffers-in-project)) - (error "Process exit with non zero status")))))))) - -(defun helm-ls-git-branches-create (candidate) - (with-helm-default-directory (helm-ls-git-root-dir) - (process-file "git" nil nil nil - "checkout" "-B" candidate "-t" (helm-ls-git--branch)))) - -(defun helm-ls-git-branches-delete (candidate) - (with-helm-default-directory (helm-ls-git-root-dir) - (let* ((branch (helm-ls-git-normalize-branch-name candidate)) - (remote (string-match "remotes/" candidate)) - (switches (if remote - `("-D" "-r" ,branch) - `("-D" ,branch)))) - (cl-assert (not (string-match "\\`[*]" candidate)) - nil "Can't delete current branch") - (if (= (apply #'process-file "git" nil nil nil "branch" switches) 0) - (progn - (when (and remote - (or helm-ls-git-delete-branch-on-remote - (y-or-n-p (format "Delete `%s' branch on remote as well ?" branch)))) - (let ((proc (start-file-process - "git" "*helm-ls-git branch delete*" - "git" "push" "origin" "--delete" - (car (last (split-string branch "/" t)))))) - (set-process-sentinel - proc - (lambda (_process event) - (if (string= event "finished\n") - (message "Remote branch %s deleted successfully" branch) - (message "Failed to delete remote branch %s" branch)))))) - (message "Local branch %s deleted successfully" branch)) - (message "failed to delete branch %s" branch))))) - -(defun helm-ls-git-normalize-branch-names (names) - (cl-loop for name in names collect - (helm-ls-git-normalize-branch-name name))) - -(defun helm-ls-git-normalize-branch-name (name) - (helm-aand name - (replace-regexp-in-string " " "" it) - (replace-regexp-in-string "[*]" "" it) - (replace-regexp-in-string "remotes/" "" it))) - -(defun helm-ls-git-delete-marked-branches (_candidate) - (let* ((branches (helm-marked-candidates)) - (bnames (helm-ls-git-normalize-branch-names branches)) - (display-buf "*helm-ls-git deleted branches*")) - (with-helm-display-marked-candidates - display-buf bnames - (when (y-or-n-p "Really delete branche(s) ?") - (cl-loop for b in branches - do (helm-ls-git-branches-delete b)))))) - -(defun helm-ls-git-modified-p (&optional ignore-untracked) - (with-helm-default-directory (helm-ls-git-root-dir) - (not (string= (helm-ls-git-status ignore-untracked) "")))) - -(defun helm-ls-git-branches-merge (candidate) - (with-helm-default-directory (helm-ls-git-root-dir) - (let ((branch (replace-regexp-in-string "[ ]" "" candidate)) - (current (helm-ls-git--branch))) - (when (y-or-n-p (format "Merge branch %s into %s?" branch current)) - (if (= (process-file "git" nil nil nil "merge" branch) 0) - (progn (message "Branch %s merged successfully into %s" branch current) - (helm-ls-git-revert-buffers-in-project)) - (message "failed to merge branch %s" branch)))))) - -(defvar helm-ls-git-create-branch-source - (helm-build-dummy-source "Create branch" - :filtered-candidate-transformer - (lambda (_candidates _source) - (list (or (and (not (string= helm-pattern "")) - helm-pattern) - "Enter new branch name"))) - :action 'helm-ls-git-branches-create)) - -(defun helm-ls-git-oneline-log (branch) - (let ((output (with-output-to-string - (with-current-buffer standard-output - (process-file - "git" nil t nil - "log" (car (split-string branch "->")) - "-n" "1" "--oneline"))))) - (replace-regexp-in-string "\n" "" output))) - -(defun helm-ls-git-branches-transformer (candidates) - (cl-loop for c in candidates - for maxlen = (cl-loop for i in candidates maximize (length i)) - for name = (replace-regexp-in-string "[ *]" "" c) - for log = (helm-ls-git-oneline-log name) - for disp = (if (string-match "\\`\\([*]\\)\\(.*\\)" c) - (format "%s%s: %s%s" - (propertize (match-string 1 c) - 'face 'helm-ls-git-branches-current) - (propertize (match-string 2 c) - 'face 'helm-ls-git-branches-name-current) - (make-string (- maxlen (length c)) ? ) - log) - (format "%s: %s%s" - (propertize c 'face 'helm-ls-git-branches-name) - (make-string (- maxlen (length c)) ? ) - log)) - collect (cons disp c))) - -(defun helm-ls-git-push (_candidate) - (with-helm-default-directory (helm-default-directory) - (let ((branch (helm-ls-git--branch)) - pr tm) - (when (y-or-n-p (format "Really push branch `%s' on remote ?" branch)) - (setq pr (make-progress-reporter - (format "Pushing branch `%s' on remote..." branch)) - tm (run-at-time 1 0.1 #'progress-reporter-update pr)) - (let ((proc (start-file-process - "git" "*helm-ls-git push*" "git" "push" "origin" "HEAD"))) - (set-process-sentinel - proc (lambda (_process event) - (if (string= event "finished\n") - (progress-reporter-done pr) - (message "Failed to push branch `%s' on remote" branch)) - (cancel-timer tm)))))))) - -(defun helm-ls-git-run-push () - (interactive) - (with-helm-alive-p - (helm-exit-and-execute-action #'helm-ls-git-push))) -(put 'helm-ls-git-run-push 'no-helm-mx t) - -(defun helm-ls-git-remotes () - (with-helm-default-directory (helm-default-directory) - (with-output-to-string - (with-current-buffer standard-output - (process-file "git" nil t nil "remote"))))) - -(defun helm-ls-git--pull-or-fetch (command &rest args) - (with-helm-default-directory (helm-default-directory) - (let* ((remote "origin") - (pcommand (capitalize command)) - (branch (helm-ls-git--branch)) - ;; A `C-g' in helm-comp-read will quit function as well. - (switches (if current-prefix-arg - (append (list command) - args - (list (setq remote - (helm-comp-read - (format "%s from: " pcommand) - (split-string - (helm-ls-git-remotes) - "\n") - :allow-nest t))) - (list branch)) - (append (list command) args))) - (pr (make-progress-reporter - (format "%sing from `%s/%s'..." pcommand remote branch))) - (tm (run-at-time 1 0.1 (lambda () (progress-reporter-update pr)))) - process-connection-type - proc) - (setq proc (apply #'helm-ls-git-with-editor switches)) - (with-current-buffer (process-buffer proc) (erase-buffer)) - (set-process-filter proc 'helm-ls-git--filter-process) - (save-selected-window - (display-buffer (process-buffer proc))) - (set-process-sentinel - proc (lambda (process event) - (let ((status (process-exit-status process))) - (if (string= event "finished\n") - (progn (progress-reporter-done pr) - (when helm-alive-p - (with-helm-window (helm-force-update "^\\*")))) - (message "Failed %sing from %s: Process exited with code %s" - command remote status)) - (and tm (cancel-timer tm)))))))) - -(defun helm-ls-git--filter-process (proc string) - (when (buffer-live-p (process-buffer proc)) - (with-current-buffer (process-buffer proc) - (let ((moving (= (point) (process-mark proc)))) - (save-excursion - ;; Insert the text, advancing the process marker. - (goto-char (process-mark proc)) - ;; Ignore git progress reporter lines. - (unless (string-match-p " \\'" string) - (insert string)) - (set-marker (process-mark proc) (point))) - (when moving - (goto-char (process-mark proc))))))) - -(defun helm-ls-git-pull (_candidate) - (helm-ls-git--pull-or-fetch "pull" "--stat")) - -(defun helm-ls-git-fetch (_candidate) - (helm-ls-git--pull-or-fetch "fetch")) - -(defun helm-ls-git-run-pull () - (interactive) - (with-helm-alive-p - (helm-set-attr 'pull 'helm-ls-git-pull) - (helm-execute-persistent-action 'pull))) -(put 'helm-ls-git-run-pull 'no-helm-mx t) - -(defun helm-ls-git-run-fetch () - (interactive) - (with-helm-alive-p - (helm-set-attr 'fetch '(helm-ls-git-fetch . never-split)) - (helm-execute-persistent-action 'fetch))) -(put 'helm-ls-git-run-fetch 'no-helm-mx t) - -(defun helm-ls-git-branch-rebase (candidate) - "Rebase CANDIDATE branch on current branch." - (if (helm-ls-git-rebase-running-p) - (if (y-or-n-p "A rebase is already running, continue ?") - (helm-ls-git-rebase-continue nil) - (helm-ls-git-rebase-abort nil)) - (let ((branch (helm-ls-git-normalize-branch-name candidate)) - (current (helm-ls-git--branch))) - (when (y-or-n-p (format "Rebase branch %s from %s?" current branch)) - (if (= (process-file "git" nil nil nil "rebase" branch) 0) - (progn (message "Branch %s rebased successfully from %s" current branch) - (helm-ls-git-revert-buffers-in-project)) - (message "failed to rebase from branch %s, try to abort rebasing or resolve conflicts" branch)))))) - -(defvar helm-ls-git-branches-source - (helm-build-in-buffer-source "Git branches" - :init (lambda () - (let ((data (helm-ls-git-collect-branches - helm-ls-git-branches-show-all))) - (helm-init-candidates-in-buffer 'global data))) - :candidate-transformer 'helm-ls-git-branches-transformer - :action-transformer (lambda (actions candidate) - (cond ((string-match "\\`[*] detached" candidate) - (append - actions - '(("Git rebase continue" . - helm-ls-git-rebase-continue) - ("Git cherry-pick continue" . - helm-ls-git-cherry-pick-continue) - ("Git AM continue" . - helm-ls-git-am-continue) - ("Git merge continue" . - helm-ls-git-merge-continue) - ("Git revert continue" . - helm-ls-git-log-revert-continue) - ("Git cherry-pick abort" . - helm-ls-git-cherry-pick-abort) - ("Git rebase abort" . - helm-ls-git-rebase-abort) - ("Git AM abort" . - helm-ls-git-am-abort) - ("Git merge abort" . - helm-ls-git-merge-abort) - ("Git revert abort" . - helm-ls-git-log-revert-abort)))) - ((not (string-match "\\`[*]" candidate)) - (append - '(("Checkout" . helm-ls-git-checkout) - ("Delete branche(s)" . helm-ls-git-delete-marked-branches) - ("Merge in current" . - helm-ls-git-branches-merge) - ("Rebase in current" . - helm-ls-git-branch-rebase)) - actions)) - (t (helm-append-at-nth - actions - '(("Git amend" . helm-ls-git-amend-commit) - ("Git push (C-c P)" . helm-ls-git-push)) - 2)))) - :help-message 'helm-ls-git-help-message - :cleanup (lambda () (setq helm-ls-git-branches-show-all nil)) - :persistent-help "Checkout" - :persistent-action (lambda (candidate) - (helm-ls-git-checkout candidate) - (helm-force-update "^\\*")) - :action '(("Git status" . (lambda (_candidate) - (funcall helm-ls-git-status-command - (helm-default-directory)))) - ("Git log (M-L)" . helm-ls-git-show-log) - ("Switch to shell" . helm-ls-git-switch-to-shell)) - :keymap 'helm-ls-git-branches-map - :group 'helm-ls-git)) - - -;;; Stashing -;; -(defun helm-ls-git-list-stashes () - (helm-aif (helm-ls-git-root-dir) - (with-helm-default-directory it - (with-output-to-string - (with-current-buffer standard-output - (apply #'process-file - "git" - nil (list t helm-ls-git-log-file) nil - (list "stash" "list"))))))) - -(defun helm-ls-git-get-stash-name (candidate) - (when (string-match "stash@[{][0-9]+[}]" candidate) - (match-string 0 candidate))) - -(defun helm-ls-git-stash-show (candidate) - (if (and (eq last-command 'helm-execute-persistent-action) - (get-buffer-window "*stash diff*" 'visible)) - (kill-buffer "*stash diff*") - (let ((stash (helm-ls-git-get-stash-name candidate))) - (with-current-buffer (get-buffer-create "*stash diff*") - (let ((inhibit-read-only t)) - (erase-buffer) - (insert (with-helm-default-directory (helm-ls-git-root-dir) - (with-output-to-string - (with-current-buffer standard-output - (process-file - "git" nil (list t helm-ls-git-log-file) nil - "stash" "show" "-p" stash))))) - (diff-mode)) - (display-buffer (current-buffer)))))) - -(defun helm-ls-git-stash-apply (candidate) - (let ((num (helm-ls-git-get-stash-name candidate))) - (if (eq (process-file "git" nil nil nil "stash" "apply" num) 0) - (progn - (helm-ls-git-revert-buffers-in-project) - (message "Stash <%s> applied" candidate)) - (error "Couldn't apply stash <%s>" candidate)))) - -(defun helm-ls-git-stash-pop (candidate) - (let ((num (helm-ls-git-get-stash-name candidate))) - (if (eq (process-file "git" nil nil nil "stash" "pop" num) 0) - (progn - (helm-ls-git-revert-buffers-in-project) - (message "Stashed pop <%s>" candidate)) - (error "Couldn't stash pop <%s>" candidate)))) - -(defun helm-ls-git-stash-1 (name) - (with-helm-default-directory (helm-ls-git-root-dir) - (apply #'process-file "git" nil nil nil `("stash" "push" "-m" ,name)) - (helm-ls-git-revert-buffers-in-project))) - -(defun helm-ls-git-stash (_candidate) - (let ((name (read-string "Stash name: "))) - (helm-ls-git-stash-1 name))) - -(defun helm-ls-git-run-stash () - (interactive) - (with-helm-alive-p - (helm-exit-and-execute-action 'helm-ls-git-stash))) -(put 'helm-ls-git-run-stash 'no-helm-mx t) - -(defun helm-ls-git-stash-snapshot (_candidate) - (vc-git-stash-snapshot)) - -(defun helm-ls-git-run-stash-snapshot () - (interactive) - (with-helm-alive-p - (helm-exit-and-execute-action 'helm-ls-git-stash-snapshot))) -(put 'helm-ls-git-run-stash-snapshot 'no-helm-mx t) - -(defun helm-ls-git-stash-drop (candidate) - (let ((num (helm-ls-git-get-stash-name candidate))) - (if (eq (process-file "git" nil nil nil "stash" "drop" num) 0) - (message "Stash <%s> deleted" candidate) - (error "Couldn't delete <%s>" candidate)))) - -(defun helm-ls-git-stash-drop-marked (_candidate) - (let ((mkd (helm-marked-candidates))) - (cl-loop with sorted = - (sort mkd (lambda (s1 s2) - (let ((n1 (and (string-match - "^stash@[{]\\([0-9]+\\)[}]" s1) - (match-string 1 s1))) - (n2 (and (string-match - "^stash@[{]\\([0-9]+\\)[}]" s2) - (match-string 1 s2)))) - (string-greaterp n1 n2)))) - for c in sorted do (helm-ls-git-stash-drop c)))) - -(defun helm-ls-git-apply-patch (_candidate) - (with-helm-default-directory (helm-default-directory) - (let ((patchs (helm-marked-candidates))) - (with-current-buffer-window "*git apply*" '(display-buffer-below-selected - (window-height . fit-window-to-buffer) - (preserve-size . (nil . t))) - nil - (apply #'process-file "git" nil t t "apply" patchs) - (helm-ls-git-revert-buffers-in-project))))) - -(defvar helm-ls-git-stashes-source - (helm-build-in-buffer-source "Stashes" - :data 'helm-ls-git-list-stashes - :persistent-action 'helm-ls-git-stash-show - :action '(("Apply stash" . helm-ls-git-stash-apply) - ("Pop stash" . helm-ls-git-stash-pop) - ("Drop stashe(s)" . helm-ls-git-stash-drop-marked)) - :group 'helm-ls-git)) - -;;; Git status -(defun helm-ls-git-status (&optional ignore-untracked) - (when (and helm-ls-git-log-file - (file-exists-p helm-ls-git-log-file)) - (delete-file helm-ls-git-log-file)) - (let ((process-environment - (cons "GIT_OPTIONAL_LOCKS=0" process-environment))) - (helm-aif (helm-ls-git-root-dir) - (with-helm-default-directory it - (with-output-to-string - (with-current-buffer standard-output - (apply #'process-file - "git" - nil (list t helm-ls-git-log-file) nil - (if ignore-untracked - (list "status" "-uno" "--porcelain") - (list "status" "--porcelain"))))))))) - -(defun helm-ls-git-status-transformer (candidates _source) - (cl-loop with root = (helm-ls-git-root-dir) - for i in candidates - collect - (cond ((string-match "^\\( M \\)\\(.*\\)" i) ; modified. - (cons (propertize i 'face 'helm-ls-git-modified-not-staged-face) - (expand-file-name (match-string 2 i) root))) - ((string-match "^\\(M+ *\\)\\(.*\\)" i) ; modified and staged. - (cons (propertize i 'face 'helm-ls-git-modified-and-staged-face) - (expand-file-name (match-string 2 i) root))) - ((string-match "^\\([?]\\{2\\} \\)\\(.*\\)" i) - (cons (propertize i 'face 'helm-ls-git-untracked-face) - (expand-file-name (match-string 2 i) root))) - ((string-match "^\\([AC] +\\)\\(.*\\)" i) - (cons (propertize i 'face 'helm-ls-git-added-copied-face) - (expand-file-name (match-string 2 i) root))) - ((string-match "^\\( [D] \\)\\(.*\\)" i) - (cons (propertize i 'face 'helm-ls-git-deleted-not-staged-face) - (expand-file-name (match-string 2 i) root))) - ((string-match "^\\(RM?\\).* -> \\(.*\\)" i) - (cons (propertize i 'face 'helm-ls-git-renamed-modified-face) - (expand-file-name (match-string 2 i) root))) - ((string-match "^\\([D] +\\)\\(.*\\)" i) - (cons (propertize i 'face 'helm-ls-git-deleted-and-staged-face) - (expand-file-name (match-string 2 i) root))) - ((string-match "^\\(UU \\)\\(.*\\)" i) - (cons (propertize i 'face 'helm-ls-git-conflict-face) - (expand-file-name (match-string 2 i) root))) - ((string-match "^\\(AM \\)\\(.*\\)" i) - (cons (propertize i 'face 'helm-ls-git-added-modified-face) - (expand-file-name (match-string 2 i) root))) - (t i)))) - -(defun helm-ls-git-status-action-transformer (actions _candidate) - (let ((disp (helm-get-selection nil t)) - (mofified-actions - (helm-make-actions "Diff file" 'helm-ls-git-diff - "Revert file(s)" - (lambda (_candidate) - (let ((marked (helm-marked-candidates))) - (cl-loop for f in marked do - (progn - (vc-git-revert f) - (helm-aif (get-file-buffer f) - (with-current-buffer it - (revert-buffer t t))))))) - "Copy file(s) `C-u to follow'" 'helm-find-files-copy - "Rename file(s) `C-u to follow'" 'helm-find-files-rename))) - ;; Unregistered files - (cond ((string-match "^[?]\\{2\\}" disp) - (append actions - (helm-make-actions "Add file(s)" - (lambda (candidate) - (let ((default-directory - (file-name-directory candidate)) - (marked (helm-marked-candidates))) - (vc-call-backend 'Git 'register marked))) - "Delete file(s)" - 'helm-ff-delete-files - (lambda () - (and (string-match "\\`[?]\\{2\\}.*\\.patch\\|diff" disp) - "Apply patch")) - 'helm-ls-git-apply-patch - (lambda () - (and (string-match "\\`[?]\\{2\\}.*\\.patch" disp) - "Git AM patches")) - 'helm-ls-git-am-files - "Copy bnames to .gitignore" - (lambda (candidate) - (let ((default-directory - (file-name-directory candidate)) - (marked (helm-marked-candidates))) - (with-current-buffer (find-file-noselect - (expand-file-name - ".gitignore" - (helm-ls-git-root-dir))) - (goto-char (point-max)) - (cl-loop with last-bname - for f in marked - for bname = (helm-basename f) - unless (string= bname last-bname) - do (insert (concat bname "\n")) - do (setq last-bname bname)) - (save-buffer))))))) - ((string-match "^A " disp) - (append actions '(("Commit staged file(s)" - . helm-ls-git-commit) - ("Extend commit" - . helm-ls-git-extend-commit) - ("Amend commit" - . helm-ls-git-amend-commit) - ("Unstage file(s)" - . helm-ls-git-unstage-files)))) - ;; Modified but not staged - ((string-match "^ M+ *" disp) - (append actions (helm-append-at-nth - mofified-actions - '(("Stage file(s) (C-c s)" - . helm-ls-git-stage-files) - ("Stage marked file(s) and commit (C-c c)" - . helm-ls-git-stage-marked-and-commit) - ("Stage marked file(s) and extend commit (C-c e)" - . helm-ls-git-stage-marked-and-extend-commit) - ("Stage marked file(s) and amend commit (C-c a)" - . helm-ls-git-stage-marked-and-amend-commit) - ("Stash (C-c z)" . helm-ls-git-stash) - ("Stash snapshot (C-c Z)" . helm-ls-git-stash-snapshot)) - 1))) - ;; Modified and staged - ((string-match "^M+ +" disp) - (append actions (helm-append-at-nth - mofified-actions - '(("Commit staged file(s)" - . helm-ls-git-commit) - ("Extend commit" - . helm-ls-git-extend-commit) - ("Amend commit" - . helm-ls-git-amend-commit) - ("Unstage file(s)" - . helm-ls-git-unstage-files) - ("Git rebase continue" . - helm-ls-git-rebase-continue) - ("Git cherry-pick continue" . - helm-ls-git-cherry-pick-continue) - ("Git AM continue" . - helm-ls-git-am-continue) - ("Git merge continue" . - helm-ls-git-merge-continue) - ("Git revert continue" . - helm-ls-git-log-revert-continue)) - 1))) - ;; Deleted - ((string-match "^ D " disp) - (append actions (list '("Git delete" . (lambda (_candidate) - (let ((mkd (helm-marked-candidates))) - (cl-loop for c in mkd - do (helm-ls-git-rm c))))) - '("Stage file(s)" - . helm-ls-git-stage-files)))) - ;; Deleted and staged - ((string-match "^D +" disp) - (append actions (list '("Commit staged file(s)" - . helm-ls-git-commit) - '("Stage marked file(s) and commit" - . helm-ls-git-stage-marked-and-commit)))) - ;; Conflict - ((string-match "^U+ +" disp) - (append actions (list '("Git cherry-pick abort" . helm-ls-git-cherry-pick-abort) - '("Git rebase abort" . helm-ls-git-rebase-abort) - '("Git AM abort" . helm-ls-git-am-abort) - '("Git merge abort" . helm-ls-git-merge-abort) - '("Git revert abort" . helm-ls-git-log-revert-abort)))) - (t actions)))) - -(defun helm-ls-git-am-files (_candidate) - (let ((files (helm-marked-candidates))) - (cl-assert (cl-loop for f in files - for ext = (file-name-extension f) - always (and ext (string= ext "patch")))) - (with-current-buffer-window "*git am*" '(display-buffer-below-selected - (window-height . fit-window-to-buffer) - (preserve-size . (nil . t))) - nil - (apply #'process-file "git" nil t nil "am" files)))) - -(defun helm-ls-git-am-abort (_candidate) - (with-helm-default-directory (helm-default-directory) - (process-file "git" nil nil nil "am" "--abort"))) - -(defun helm-ls-git-rm (_candidate) - (with-helm-default-directory (helm-default-directory) - (let ((files (helm-marked-candidates))) - (apply #'process-file "git" nil nil nil "rm" files)))) - -(defun helm-ls-git-switch-to-shell (_candidate) - (let ((helm-ff-default-directory - (helm-ls-git-root-dir))) - (helm-ff-switch-to-shell nil))) - -(defun helm-ls-git-run-switch-to-shell () - (interactive) - (with-helm-alive-p - (helm-exit-and-execute-action 'helm-ls-git-switch-to-shell))) -(put 'helm-ls-git-run-switch-to-shell 'no-helm-mx t) - - -;;; Stage and commit -;; -(defun helm-ls-git-stage-files (_candidate) - "Stage marked files." - (let* ((files (helm-marked-candidates)) - (default-directory (helm-default-directory))) - (apply #'process-file "git" nil nil nil "stage" files))) - -(defun helm-ls-git-run-stage-files (arg) - (interactive "P") - (with-helm-alive-p - (helm-exit-and-execute-action (if arg - 'helm-ls-git-unstage-files - 'helm-ls-git-stage-files)))) -(put 'helm-ls-git-run-stage-files 'no-helm-mx t) - -(defun helm-ls-git-unstage-files (_candidate) - "Unstage marked files." - (let* ((files (helm-marked-candidates)) - (default-directory (file-name-directory (car files)))) - (apply #'process-file "git" nil nil nil "reset" "HEAD" "--" files))) - -(defun helm-ls-git-stage-marked-and-commit (_candidate) - "Stage marked files and commit." - (helm-ls-git-stage-files nil) - (let ((proc (helm-ls-git-with-editor "commit" "-v"))) - (set-process-sentinel proc 'helm-ls-git-commit-sentinel))) - -(defun helm-ls-git-commit-sentinel (process event) - (let ((default-directory (with-current-buffer (process-buffer process) - default-directory))) - (when (string= event "finished\n") - (let ((commit (helm-ls-git-oneline-log (helm-ls-git--branch)))) - (when (string-match "\\`\\([^ ]+\\)+ +\\(.*\\)" commit) - (add-face-text-property 0 (match-end 1) - 'font-lock-type-face nil commit) - (add-face-text-property (1+ (match-end 1)) - (match-end 2) - 'font-lock-function-name-face nil commit)) - (message "Commit done, now at `%s'" commit))))) - -(defun helm-ls-git-run-stage-marked-and-commit () - (interactive) - (with-helm-alive-p - (condition-case _err - ;; Fail when helm-ls-git-stage-marked-and-commit is not in - ;; action list because file is already staged. - (helm-exit-and-execute-action 'helm-ls-git-stage-marked-and-commit) - (error (helm-exit-and-execute-action 'helm-ls-git-commit) nil)))) -(put 'helm-ls-git-run-stage-marked-and-commit 'no-helm-mx t) - -(defun helm-ls-git-stage-marked-and-extend-commit (candidate) - "Stage marked files and extend these changes to last commit" - (helm-ls-git-stage-files nil) - (helm-ls-git-extend-commit candidate)) - -(defun helm-ls-git-run-stage-marked-and-extend-commit () - (interactive) - (with-helm-alive-p - (helm-exit-and-execute-action 'helm-ls-git-stage-marked-and-extend-commit))) -(put 'helm-ls-git-run-stage-marked-and-extend-commit 'no-helm-mx t) - -(defun helm-ls-git-stage-marked-and-amend-commit (candidate) - "Stage marked files and amend last commit." - (helm-ls-git-stage-files nil) - (helm-ls-git-amend-commit candidate)) - -(defun helm-ls-git-run-stage-marked-and-amend-commit () - (interactive) - (with-helm-alive-p - (helm-exit-and-execute-action 'helm-ls-git-stage-marked-and-amend-commit))) -(put 'helm-ls-git-run-stage-marked-and-amend-commit 'no-helm-mx t) - -(defun helm-ls-git-extend-commit (candidate) - (let ((default-directory (file-name-directory candidate))) - (process-file "git" nil nil nil "commit" "--amend" "--no-edit"))) - -(defun helm-ls-git-amend-commit (_candidate) - "Amend last commit." - (let ((proc (helm-ls-git-with-editor "commit" "-v" "--amend"))) - (set-process-sentinel proc 'helm-ls-git-commit-sentinel))) - -(defun helm-ls-git-commit (_candidate) - "Commit already staged files." - (let ((proc (helm-ls-git-with-editor "commit" "-v"))) - (set-process-sentinel proc 'helm-ls-git-commit-sentinel))) - - -;;; Emacsclient as git editor -;; -;;;###autoload -(add-to-list 'auto-mode-alist '("/COMMIT_EDITMSG$" . helm-ls-git-commit-mode)) - -(defvar helm-ls-git-author-name-history nil) -(defvar helm-ls-git-author-email-history nil) - -(defun helm-ls-git-with-editor (&rest args) - "Binds GIT_EDITOR env var to emacsclient and run git with ARGS. -Bound `default-directory' to the root dir of project determining value -from the helm-buffer, so don't use this function outside of helm -context i.e. use it in helm actions." - (require 'server) - (let ((default-directory (expand-file-name - (helm-ls-git-root-dir - (helm-default-directory)))) - (process-environment process-environment) - (bname (format "*helm-ls-git %s*" (car args))) - (alt-auth (and helm-current-prefix-arg - (string= (car args) "commit") - (list (read-string "Author name: " - nil 'helm-ls-git-author-name-history) - (read-string "Author email: " - nil 'helm-ls-git-author-email-history))))) - ;; It seems git once it knows GIT_EDITOR reuse the same value - ;; along its whole process e.g. when squashing in a rebase - ;; process, so even if the env setting goes away after initial - ;; process, git should reuse same GIT_EDITOR in subsequent - ;; commits. - (when (get-buffer bname) (kill-buffer bname)) - (push "GIT_EDITOR=emacsclient $@" process-environment) - (when (and alt-auth (not (member "" alt-auth))) - (push (format "GIT_AUTHOR_NAME=%s" (car alt-auth)) process-environment) - (push (format "GIT_AUTHOR_EMAIL=%s" (cadr alt-auth)) process-environment)) - (unless (server-running-p) - (server-start)) - (apply #'start-file-process "git" bname "git" args))) - -(defun helm-ls-git-server-edit () - (interactive) - (cl-assert server-clients nil "No server editing buffers exist") - ;; Prevent server asking to save file when done. - (helm-aif buffer-file-name - (save-buffer it)) - (server-edit)) - -;; Same as `server-edit-abort' from emacs-28 but kill edit buffer as well. -(defun helm-ls-git-server-edit-abort () - "Abort editing the current client buffer." - (interactive) - (if server-clients - (progn - (mapc (lambda (proc) - (server-send-string - proc (concat "-error " - (server-quote-arg "Aborted by the user")))) - server-clients) - (kill-buffer)) - (message "This buffer has no clients"))) - -(defvar helm-ls-git-commit-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "C-c C-c") 'helm-ls-git-server-edit) - (define-key map (kbd "C-c C-k") 'helm-ls-git-server-edit-abort) - map)) - -;;;###autoload -(define-derived-mode helm-ls-git-commit-mode diff-mode "helm-ls-git-commit" - "Mode to edit COMMIT_EDITMSG files. - -Commands: -\\{helm-ls-git-commit-mode-map} -" - (helm-ls-git-with-editor-setup)) - -(defun helm-ls-git-with-editor-setup () - (setq fill-column 70) - ;; For some reasons, using (setq buffer-read-only nil) in emacs-29 - ;; doesn't work anymore. - (read-only-mode -1) - (set (make-local-variable 'comment-start) "#") - (set (make-local-variable 'comment-end) "") - (auto-fill-mode 1) - (run-at-time - 0.1 nil - (lambda () - (message - "When done with a buffer, type `C-c C-c', to abort type `C-c C-k'")))) - -;;; Git rebase -;; -;;;###autoload -(add-to-list 'auto-mode-alist '("/git-rebase-todo$" . helm-ls-git-rebase-todo-mode)) - -(defconst helm-ls-git-rebase-actions - '(("p" . "pick") - ("r" . "reword") - ("e" . "edit") - ("s" . "squash") - ("f" . "fixup") - ("x" . "exec") - ("d" . "drop"))) - -(defvar helm-ls-git-rebase-todo-font-lock-keywords - '(("^\\([a-z]+\\) \\([0-9a-f]+\\) \\(.*\\)$" - (1 'font-lock-keyword-face) - (2 'font-lock-function-name-face)) - ("^#.*$" . 'font-lock-comment-face)) - "Keywords in `helm-ls-git-rebase-todo' mode.") - -(defvar helm-ls-git-rebase-todo-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "M-n") 'helm-ls-git-rebase-todo-move-down) - (define-key map (kbd "M-p") 'helm-ls-git-rebase-todo-move-up) - (define-key map (kbd "C-c C-c") 'helm-ls-git-server-edit) - (define-key map (kbd "C-c C-k") 'helm-ls-git-server-edit-abort) - map) - "Keymap used in `helm-ls-git-rebase-todo-mode' buffers.") - -(defun helm-ls-git-rebase-todo-move-down () - "Move commit line one line down." - (interactive) - (beginning-of-line) - (let* ((next (+ 1 (line-end-position))) - (line (buffer-substring (point) next))) - (delete-region (point) next) - (forward-line 1) - (insert line) - (forward-line -1))) - -(defun helm-ls-git-rebase-todo-move-up () - "Move commit line on line up." - (interactive) - (beginning-of-line) - (let* ((next (+ 1 (line-end-position))) - (line (buffer-substring (point) next))) - (delete-region (point) next) - (forward-line -1) - (insert line) - (forward-line -1))) - -(defun helm-ls-git-rebase-action (action) - "Replace the current rebase command at bol by ACTION. -ACTION is the cdr entry of one of `helm-ls-git-rebase-actions'." - (let* ((assocs helm-ls-git-rebase-actions) - (regexp (cl-loop with len = (length assocs) - for (_k . v) in assocs - for count from 1 to len - concat (concat v (if (= count len) "" "\\|")) into str - finally return (concat "^\\(" str "\\) +"))) - (inhibit-read-only t)) - (goto-char (point-at-bol)) - (save-excursion - (when (re-search-forward regexp (point-at-eol) t) - (delete-region (point-at-bol) (match-end 1)))) - (insert (cdr (rassoc action assocs))) - (forward-line 1))) - -(cl-defun helm-ls-git-rebase-build-commands () - "build a function for each `helm-ls-git-rebase-actions' entry. -Bind it to the car of each entry of `helm-ls-git-rebase-actions'." - (cl-loop for (k . v) in helm-ls-git-rebase-actions - for sym = (intern (concat "helm-ls-git-rebase-" v)) - for doc = (format "Replace current rebase command at bol by `%s'." v) - do (progn - (defalias sym `(lambda () (interactive) - (helm-ls-git-rebase-action ,v)) - doc) - (define-key helm-ls-git-rebase-todo-mode-map (kbd k) sym)))) - -;;;###autoload -(define-derived-mode helm-ls-git-rebase-todo-mode fundamental-mode "helm-ls-git-rebase-todo" - "Major Mode to edit git-rebase-todo files when using git rebase -i. - -Commands: -\\{helm-ls-git-rebase-todo-mode-map} -" - (set (make-local-variable 'font-lock-defaults) - '(helm-ls-git-rebase-todo-font-lock-keywords t)) - (helm-ls-git-rebase-build-commands) - (set (make-local-variable 'comment-start) "#") - (set (make-local-variable 'comment-end) "") - (run-at-time - 0.1 nil - (lambda () - (message - "When done with a buffer, type `C-c C-c', to abort type `C-c C-k'")))) - - -;;; Build sources -;; -;; Overhide the actions of helm-type-buffer. -(cl-defmethod helm--setup-source :after ((source helm-source-buffers)) - (let ((name (slot-value source 'name))) - (when (string= name "Buffers in git project") - (setf (slot-value source 'action) - (helm-append-at-nth - helm-type-buffer-actions - (helm-make-actions "Git status" - (lambda (_candidate) - (funcall helm-ls-git-status-command - (helm-default-directory)))) - 1))))) - -(defun helm-ls-git-build-git-status-source () - "Build `helm-source-ls-git-status'. - -Do nothing when `helm-source-ls-git-status' is not member of -`helm-ls-git-default-sources'." - (and (memq 'helm-source-ls-git-status helm-ls-git-default-sources) - (helm-make-source "Git status" 'helm-ls-git-status-source - :fuzzy-match helm-ls-git-fuzzy-match - :group 'helm-ls-git))) - -(defun helm-ls-git-build-ls-git-source () - "Build `helm-source-ls-git'. - -Do nothing when `helm-source-ls-git' is not member of -`helm-ls-git-default-sources'." - (and (memq 'helm-source-ls-git helm-ls-git-default-sources) - (helm-make-source "Git files" 'helm-ls-git-source - :fuzzy-match helm-ls-git-fuzzy-match - :action (helm-ls-git-actions-list helm-type-file-actions) - :group 'helm-ls-git))) - -(defun helm-ls-git-build-buffers-source () - "Build `helm-source-ls-git-buffers'. - -Do nothing when `helm-source-ls-git-buffers' is not member of -`helm-ls-git-default-sources'." - (and (memq 'helm-source-ls-git-buffers helm-ls-git-default-sources) - (helm-make-source "Buffers in git project" 'helm-source-buffers - :header-name #'helm-ls-git-header-name - :buffer-list (lambda () (helm-browse-project-get-buffers - (helm-ls-git-root-dir))) - :keymap 'helm-ls-git-buffer-map))) - - -;;;###autoload -(defun helm-ls-git (&optional arg) - (interactive "p") - (let ((helm-ff-default-directory - (or helm-ff-default-directory - default-directory))) - (when (and arg (helm-ls-git-not-inside-git-repo)) - (error "Not inside a Git repository")) - (unless (cl-loop for s in helm-ls-git-default-sources - always (symbol-value s)) - (setq helm-source-ls-git-status - (helm-ls-git-build-git-status-source) - helm-source-ls-git - (helm-ls-git-build-ls-git-source) - helm-source-ls-git-buffers - (helm-ls-git-build-buffers-source))) - (helm-set-local-variable 'helm-ls-git--current-branch (helm-ls-git--branch)) - (helm :sources helm-ls-git-default-sources - :ff-transformer-show-only-basename nil - :truncate-lines helm-buffers-truncate-lines - :buffer "*helm lsgit*"))) - -(defalias 'helm-ls-git-ls 'helm-ls-git) -(make-obsolete 'helm-ls-git-ls 'helm-ls-git "1.9.2") -(put 'helm-ls-git-ls 'no-helm-mx t) - - -(provide 'helm-ls-git) - -;;; helm-ls-git.el ends here diff --git a/org/elpa/helm-ls-git-20220818.553/helm-ls-git-autoloads.el b/org/elpa/helm-ls-git-20220818.553/helm-ls-git-autoloads.el deleted file mode 100644 index b150c98..0000000 --- a/org/elpa/helm-ls-git-20220818.553/helm-ls-git-autoloads.el +++ /dev/null @@ -1,47 +0,0 @@ -;;; helm-ls-git-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "helm-ls-git" "helm-ls-git.el" (0 0 0 0)) -;;; Generated autoloads from helm-ls-git.el - -(add-to-list 'auto-mode-alist '("/COMMIT_EDITMSG$" . helm-ls-git-commit-mode)) - -(autoload 'helm-ls-git-commit-mode "helm-ls-git" "\ -Mode to edit COMMIT_EDITMSG files. - -Commands: -\\{helm-ls-git-commit-mode-map} - -\(fn)" t nil) - -(add-to-list 'auto-mode-alist '("/git-rebase-todo$" . helm-ls-git-rebase-todo-mode)) - -(autoload 'helm-ls-git-rebase-todo-mode "helm-ls-git" "\ -Major Mode to edit git-rebase-todo files when using git rebase -i. - -Commands: -\\{helm-ls-git-rebase-todo-mode-map} - -\(fn)" t nil) - -(autoload 'helm-ls-git "helm-ls-git" "\ - - -\(fn &optional ARG)" t nil) - -(register-definition-prefixes "helm-ls-git" '("helm-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; helm-ls-git-autoloads.el ends here diff --git a/org/elpa/helm-ls-git-20220818.553/helm-ls-git-pkg.el b/org/elpa/helm-ls-git-20220818.553/helm-ls-git-pkg.el deleted file mode 100644 index f9a17ec..0000000 --- a/org/elpa/helm-ls-git-20220818.553/helm-ls-git-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from helm-ls-git.el -*- no-byte-compile: t -*- -(define-package "helm-ls-git" "20220818.553" "list git files." '((helm "1.7.8")) :commit "fc44fc1015bbc75d16e7d7aa5d971ff1ad85e9e1") diff --git a/org/elpa/helm-ls-git-20220727.505/helm-ls-git-autoloads.el b/org/elpa/helm-ls-git-20220914.954/helm-ls-git-autoloads.el similarity index 100% rename from org/elpa/helm-ls-git-20220727.505/helm-ls-git-autoloads.el rename to org/elpa/helm-ls-git-20220914.954/helm-ls-git-autoloads.el diff --git a/org/elpa/helm-ls-git-20220914.954/helm-ls-git-pkg.el b/org/elpa/helm-ls-git-20220914.954/helm-ls-git-pkg.el new file mode 100644 index 0000000..1046aea --- /dev/null +++ b/org/elpa/helm-ls-git-20220914.954/helm-ls-git-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from helm-ls-git.el -*- no-byte-compile: t -*- +(define-package "helm-ls-git" "20220914.954" "list git files." '((helm "1.7.8")) :commit "a0dbaa0df28942a70f580dcbd73febe29b6c2167") diff --git a/org/elpa/helm-ls-git-20220818.553/helm-ls-git.el b/org/elpa/helm-ls-git-20220914.954/helm-ls-git.el similarity index 98% rename from org/elpa/helm-ls-git-20220818.553/helm-ls-git.el rename to org/elpa/helm-ls-git-20220914.954/helm-ls-git.el index b1c7f6c..22fbc84 100644 --- a/org/elpa/helm-ls-git-20220818.553/helm-ls-git.el +++ b/org/elpa/helm-ls-git-20220914.954/helm-ls-git.el @@ -3,8 +3,8 @@ ;; Copyright (C) 2012 ~ 2022 Thierry Volpiatto ;; Package-Requires: ((helm "1.7.8")) -;; Package-Version: 20220818.553 -;; Package-Commit: fc44fc1015bbc75d16e7d7aa5d971ff1ad85e9e1 +;; Package-Version: 20220914.954 +;; Package-Commit: a0dbaa0df28942a70f580dcbd73febe29b6c2167 ;; 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 @@ -148,11 +148,11 @@ When non nil this disable `helm-move-to-line-cycle-in-source'." "Files which are modified but not yet staged.") (defface helm-ls-git-modified-and-staged-face - '((t :foreground "Goldenrod")) + '((t :foreground "goldenrod")) "Files which are modified and already staged.") (defface helm-ls-git-renamed-modified-face - '((t :foreground "Goldenrod")) + '((t :foreground "goldenrod")) "Files which are renamed or renamed and modified.") (defface helm-ls-git-untracked-face @@ -164,11 +164,11 @@ When non nil this disable `helm-move-to-line-cycle-in-source'." "Files which are newly added or copied.") (defface helm-ls-git-added-modified-face - '((t :foreground "blue")) + '((t :foreground "LightSkyBlue")) "Files which are newly added and have unstaged modifications.") (defface helm-ls-git-deleted-not-staged-face - '((t :foreground "Darkgoldenrod3")) + '((t :foreground "DarkGoldenrod3")) "Files which are deleted but not staged.") (defface helm-ls-git-deleted-and-staged-face @@ -895,14 +895,16 @@ See docstring of `helm-ls-git-ls-switches'. (tip (unless (cdr marked) (helm-ls-git-oneline-log (helm-ls-git--branch)))) buf1 buf2 file) + (when tip + (cl-assert (not (string= (car (split-string tip)) + (car (split-string (car marked))))) + nil "Can't ediff a file at same revision")) (setq file (helm :sources (helm-build-in-buffer-source "Git cat-file" :data (helm-ls-git-list-files)) :buffer "*helm-ls-git cat-file*")) (setq buf1 (helm-ls-git-log-find-file-1 (or tip (car marked)) file :buffer-only) buf2 (helm-ls-git-log-find-file-1 (if tip (car marked) (cadr marked)) file :buffer-only)) - (cl-assert (not (eql buf1 buf2)) - nil (format "Can't ediff file `%s' at same revision" file)) (ediff-buffers buf1 buf2))) (defun helm-ls-git-log-cherry-pick (_candidate) @@ -1437,7 +1439,7 @@ object will be passed git rebase i.e. git rebase -i ." ((string-match "^\\([?]\\{2\\} \\)\\(.*\\)" i) (cons (propertize i 'face 'helm-ls-git-untracked-face) (expand-file-name (match-string 2 i) root))) - ((string-match "^\\([AC] +\\)\\(.*\\)" i) + ((string-match "^\\(AC? +\\)\\(.*\\)" i) (cons (propertize i 'face 'helm-ls-git-added-copied-face) (expand-file-name (match-string 2 i) root))) ((string-match "^\\( [D] \\)\\(.*\\)" i) @@ -1446,7 +1448,7 @@ object will be passed git rebase i.e. git rebase -i ." ((string-match "^\\(RM?\\).* -> \\(.*\\)" i) (cons (propertize i 'face 'helm-ls-git-renamed-modified-face) (expand-file-name (match-string 2 i) root))) - ((string-match "^\\([D] +\\)\\(.*\\)" i) + ((string-match "^\\(A?D +\\)\\(.*\\)" i) (cons (propertize i 'face 'helm-ls-git-deleted-and-staged-face) (expand-file-name (match-string 2 i) root))) ((string-match "^\\(UU \\)\\(.*\\)" i) @@ -1500,7 +1502,7 @@ object will be passed git rebase i.e. git rebase -i ." do (insert (concat bname "\n")) do (setq last-bname bname)) (save-buffer))))))) - ((string-match "^A " disp) + ((string-match "^AM? " disp) (append actions '(("Commit staged file(s)" . helm-ls-git-commit) ("Extend commit" @@ -1556,9 +1558,16 @@ object will be passed git rebase i.e. git rebase -i ." '("Stage file(s)" . helm-ls-git-stage-files)))) ;; Deleted and staged - ((string-match "^D +" disp) + ((string-match "^A?D +" disp) (append actions (list '("Commit staged file(s)" . helm-ls-git-commit) + '("Unstage file(s)" + . helm-ls-git-unstage-files) + '("Update index" + . (lambda (_candidate) + (let ((default-directory (helm-default-directory))) + (process-file "git" nil nil nil + "add" "-u")))) '("Stage marked file(s) and commit" . helm-ls-git-stage-marked-and-commit)))) ;; Conflict diff --git a/org/elpa/magit-20220912.331/AUTHORS.md b/org/elpa/magit-20220914.2356/AUTHORS.md similarity index 100% rename from org/elpa/magit-20220912.331/AUTHORS.md rename to org/elpa/magit-20220914.2356/AUTHORS.md diff --git a/org/elpa/magit-20220912.331/LICENSE b/org/elpa/magit-20220914.2356/LICENSE similarity index 100% rename from org/elpa/magit-20220912.331/LICENSE rename to org/elpa/magit-20220914.2356/LICENSE diff --git a/org/elpa/magit-20220912.331/dir b/org/elpa/magit-20220914.2356/dir similarity index 100% rename from org/elpa/magit-20220912.331/dir rename to org/elpa/magit-20220914.2356/dir diff --git a/org/elpa/magit-20220912.331/git-rebase.el b/org/elpa/magit-20220914.2356/git-rebase.el similarity index 98% rename from org/elpa/magit-20220912.331/git-rebase.el rename to org/elpa/magit-20220914.2356/git-rebase.el index 61cdf37..7ac3ab6 100644 --- a/org/elpa/magit-20220912.331/git-rebase.el +++ b/org/elpa/magit-20220914.2356/git-rebase.el @@ -806,14 +806,8 @@ By default, this is the same except for the \"pick\" command." (replace-match " " t t nil 2) (replace-match (string-pad - (mapconcat (lambda (key) - (save-match-data - (substitute-command-keys - (format "\\`%s'" (key-description key))))) - (cl-remove-if (lambda (key) (eq (elt key 0) 'menu-bar)) - (reverse (where-is-internal - cmd git-rebase-mode-map))) - ", ") + (save-match-data + (substitute-command-keys (format "\\[%s]" cmd))) 8) t t nil 3))))))))) diff --git a/org/elpa/magit-20220912.331/magit-apply.el b/org/elpa/magit-20220914.2356/magit-apply.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-apply.el rename to org/elpa/magit-20220914.2356/magit-apply.el diff --git a/org/elpa/magit-20220912.331/magit-autoloads.el b/org/elpa/magit-20220914.2356/magit-autoloads.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-autoloads.el rename to org/elpa/magit-20220914.2356/magit-autoloads.el diff --git a/org/elpa/magit-20220912.331/magit-autorevert.el b/org/elpa/magit-20220914.2356/magit-autorevert.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-autorevert.el rename to org/elpa/magit-20220914.2356/magit-autorevert.el diff --git a/org/elpa/magit-20220912.331/magit-base.el b/org/elpa/magit-20220914.2356/magit-base.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-base.el rename to org/elpa/magit-20220914.2356/magit-base.el diff --git a/org/elpa/magit-20220912.331/magit-bisect.el b/org/elpa/magit-20220914.2356/magit-bisect.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-bisect.el rename to org/elpa/magit-20220914.2356/magit-bisect.el diff --git a/org/elpa/magit-20220912.331/magit-blame.el b/org/elpa/magit-20220914.2356/magit-blame.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-blame.el rename to org/elpa/magit-20220914.2356/magit-blame.el diff --git a/org/elpa/magit-20220912.331/magit-bookmark.el b/org/elpa/magit-20220914.2356/magit-bookmark.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-bookmark.el rename to org/elpa/magit-20220914.2356/magit-bookmark.el diff --git a/org/elpa/magit-20220912.331/magit-branch.el b/org/elpa/magit-20220914.2356/magit-branch.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-branch.el rename to org/elpa/magit-20220914.2356/magit-branch.el diff --git a/org/elpa/magit-20220912.331/magit-bundle.el b/org/elpa/magit-20220914.2356/magit-bundle.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-bundle.el rename to org/elpa/magit-20220914.2356/magit-bundle.el diff --git a/org/elpa/magit-20220912.331/magit-clone.el b/org/elpa/magit-20220914.2356/magit-clone.el similarity index 99% rename from org/elpa/magit-20220912.331/magit-clone.el rename to org/elpa/magit-20220914.2356/magit-clone.el index 23abff7..2948872 100644 --- a/org/elpa/magit-20220912.331/magit-clone.el +++ b/org/elpa/magit-20220914.2356/magit-clone.el @@ -94,7 +94,7 @@ as the username itself." (string :tag "User name or git variable")))) (defcustom magit-clone-url-format - '(("git.sr.ht" . "git@%h:~%n") + '(("git.sr.ht" . "git@%h:%n") (t . "git@%h:%n.git")) "Format(s) used when turning repository names into urls. diff --git a/org/elpa/magit-20220912.331/magit-commit.el b/org/elpa/magit-20220914.2356/magit-commit.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-commit.el rename to org/elpa/magit-20220914.2356/magit-commit.el diff --git a/org/elpa/magit-20220912.331/magit-core.el b/org/elpa/magit-20220914.2356/magit-core.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-core.el rename to org/elpa/magit-20220914.2356/magit-core.el diff --git a/org/elpa/magit-20220912.331/magit-diff.el b/org/elpa/magit-20220914.2356/magit-diff.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-diff.el rename to org/elpa/magit-20220914.2356/magit-diff.el diff --git a/org/elpa/magit-20220912.331/magit-ediff.el b/org/elpa/magit-20220914.2356/magit-ediff.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-ediff.el rename to org/elpa/magit-20220914.2356/magit-ediff.el diff --git a/org/elpa/magit-20220912.331/magit-extras.el b/org/elpa/magit-20220914.2356/magit-extras.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-extras.el rename to org/elpa/magit-20220914.2356/magit-extras.el diff --git a/org/elpa/magit-20220912.331/magit-fetch.el b/org/elpa/magit-20220914.2356/magit-fetch.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-fetch.el rename to org/elpa/magit-20220914.2356/magit-fetch.el diff --git a/org/elpa/magit-20220912.331/magit-files.el b/org/elpa/magit-20220914.2356/magit-files.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-files.el rename to org/elpa/magit-20220914.2356/magit-files.el diff --git a/org/elpa/magit-20220912.331/magit-git.el b/org/elpa/magit-20220914.2356/magit-git.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-git.el rename to org/elpa/magit-20220914.2356/magit-git.el diff --git a/org/elpa/magit-20220912.331/magit-gitignore.el b/org/elpa/magit-20220914.2356/magit-gitignore.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-gitignore.el rename to org/elpa/magit-20220914.2356/magit-gitignore.el diff --git a/org/elpa/magit-20220912.331/magit-log.el b/org/elpa/magit-20220914.2356/magit-log.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-log.el rename to org/elpa/magit-20220914.2356/magit-log.el diff --git a/org/elpa/magit-20220912.331/magit-margin.el b/org/elpa/magit-20220914.2356/magit-margin.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-margin.el rename to org/elpa/magit-20220914.2356/magit-margin.el diff --git a/org/elpa/magit-20220912.331/magit-merge.el b/org/elpa/magit-20220914.2356/magit-merge.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-merge.el rename to org/elpa/magit-20220914.2356/magit-merge.el diff --git a/org/elpa/magit-20220912.331/magit-mode.el b/org/elpa/magit-20220914.2356/magit-mode.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-mode.el rename to org/elpa/magit-20220914.2356/magit-mode.el diff --git a/org/elpa/magit-20220912.331/magit-notes.el b/org/elpa/magit-20220914.2356/magit-notes.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-notes.el rename to org/elpa/magit-20220914.2356/magit-notes.el diff --git a/org/elpa/magit-20220912.331/magit-obsolete.el b/org/elpa/magit-20220914.2356/magit-obsolete.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-obsolete.el rename to org/elpa/magit-20220914.2356/magit-obsolete.el diff --git a/org/elpa/magit-20220912.331/magit-patch.el b/org/elpa/magit-20220914.2356/magit-patch.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-patch.el rename to org/elpa/magit-20220914.2356/magit-patch.el diff --git a/org/elpa/magit-20220912.331/magit-pkg.el b/org/elpa/magit-20220914.2356/magit-pkg.el similarity index 77% rename from org/elpa/magit-20220912.331/magit-pkg.el rename to org/elpa/magit-20220914.2356/magit-pkg.el index ba9a054..b883d04 100644 --- a/org/elpa/magit-20220912.331/magit-pkg.el +++ b/org/elpa/magit-20220914.2356/magit-pkg.el @@ -1,4 +1,4 @@ -(define-package "magit" "20220912.331" "A Git porcelain inside Emacs." +(define-package "magit" "20220914.2356" "A Git porcelain inside Emacs." '((emacs "25.1") (compat "28.1.1.2") (dash "20210826") @@ -6,7 +6,7 @@ (magit-section "20220325") (transient "20220325") (with-editor "20220318")) - :commit "564cff8a40c2d7c8d4e679f1c7c2974c97f5f149" :authors + :commit "75647d08a097157231c598648e2f632279ff3a41" :authors '(("Marius Vollmer" . "marius.vollmer@gmail.com") ("Jonas Bernoulli" . "jonas@bernoul.li")) :maintainer diff --git a/org/elpa/magit-20220912.331/magit-process.el b/org/elpa/magit-20220914.2356/magit-process.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-process.el rename to org/elpa/magit-20220914.2356/magit-process.el diff --git a/org/elpa/magit-20220912.331/magit-pull.el b/org/elpa/magit-20220914.2356/magit-pull.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-pull.el rename to org/elpa/magit-20220914.2356/magit-pull.el diff --git a/org/elpa/magit-20220912.331/magit-push.el b/org/elpa/magit-20220914.2356/magit-push.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-push.el rename to org/elpa/magit-20220914.2356/magit-push.el diff --git a/org/elpa/magit-20220912.331/magit-reflog.el b/org/elpa/magit-20220914.2356/magit-reflog.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-reflog.el rename to org/elpa/magit-20220914.2356/magit-reflog.el diff --git a/org/elpa/magit-20220912.331/magit-refs.el b/org/elpa/magit-20220914.2356/magit-refs.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-refs.el rename to org/elpa/magit-20220914.2356/magit-refs.el diff --git a/org/elpa/magit-20220912.331/magit-remote.el b/org/elpa/magit-20220914.2356/magit-remote.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-remote.el rename to org/elpa/magit-20220914.2356/magit-remote.el diff --git a/org/elpa/magit-20220912.331/magit-repos.el b/org/elpa/magit-20220914.2356/magit-repos.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-repos.el rename to org/elpa/magit-20220914.2356/magit-repos.el diff --git a/org/elpa/magit-20220912.331/magit-reset.el b/org/elpa/magit-20220914.2356/magit-reset.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-reset.el rename to org/elpa/magit-20220914.2356/magit-reset.el diff --git a/org/elpa/magit-20220912.331/magit-sequence.el b/org/elpa/magit-20220914.2356/magit-sequence.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-sequence.el rename to org/elpa/magit-20220914.2356/magit-sequence.el diff --git a/org/elpa/magit-20220912.331/magit-sparse-checkout.el b/org/elpa/magit-20220914.2356/magit-sparse-checkout.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-sparse-checkout.el rename to org/elpa/magit-20220914.2356/magit-sparse-checkout.el diff --git a/org/elpa/magit-20220912.331/magit-stash.el b/org/elpa/magit-20220914.2356/magit-stash.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-stash.el rename to org/elpa/magit-20220914.2356/magit-stash.el diff --git a/org/elpa/magit-20220912.331/magit-status.el b/org/elpa/magit-20220914.2356/magit-status.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-status.el rename to org/elpa/magit-20220914.2356/magit-status.el diff --git a/org/elpa/magit-20220912.331/magit-submodule.el b/org/elpa/magit-20220914.2356/magit-submodule.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-submodule.el rename to org/elpa/magit-20220914.2356/magit-submodule.el diff --git a/org/elpa/magit-20220912.331/magit-subtree.el b/org/elpa/magit-20220914.2356/magit-subtree.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-subtree.el rename to org/elpa/magit-20220914.2356/magit-subtree.el diff --git a/org/elpa/magit-20220912.331/magit-tag.el b/org/elpa/magit-20220914.2356/magit-tag.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-tag.el rename to org/elpa/magit-20220914.2356/magit-tag.el diff --git a/org/elpa/magit-20220912.331/magit-transient.el b/org/elpa/magit-20220914.2356/magit-transient.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-transient.el rename to org/elpa/magit-20220914.2356/magit-transient.el diff --git a/org/elpa/magit-20220912.331/magit-wip.el b/org/elpa/magit-20220914.2356/magit-wip.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-wip.el rename to org/elpa/magit-20220914.2356/magit-wip.el diff --git a/org/elpa/magit-20220912.331/magit-worktree.el b/org/elpa/magit-20220914.2356/magit-worktree.el similarity index 100% rename from org/elpa/magit-20220912.331/magit-worktree.el rename to org/elpa/magit-20220914.2356/magit-worktree.el diff --git a/org/elpa/magit-20220912.331/magit.el b/org/elpa/magit-20220914.2356/magit.el similarity index 100% rename from org/elpa/magit-20220912.331/magit.el rename to org/elpa/magit-20220914.2356/magit.el diff --git a/org/elpa/magit-20220912.331/magit.info b/org/elpa/magit-20220914.2356/magit.info similarity index 100% rename from org/elpa/magit-20220912.331/magit.info rename to org/elpa/magit-20220914.2356/magit.info diff --git a/org/elpa/transient-20220803.1000/dir b/org/elpa/transient-20220803.1000/dir deleted file mode 100644 index 4d6ad7f..0000000 --- a/org/elpa/transient-20220803.1000/dir +++ /dev/null @@ -1,18 +0,0 @@ -This is the file .../info/dir, which contains the -topmost node of the Info hierarchy, called (dir)Top. -The first time you invoke Info you start off looking at this node. - -File: dir, Node: Top This is the top of the INFO tree - - This (the Directory node) gives a menu of major topics. - Typing "q" exits, "H" lists all Info commands, "d" returns here, - "h" gives a primer for first-timers, - "mEmacs" visits the Emacs manual, etc. - - In Emacs, you can click mouse button 2 on a menu item or cross reference - to select it. - -* Menu: - -Emacs -* Transient: (transient). Transient Commands. diff --git a/org/elpa/transient-20220803.1000/transient-autoloads.el b/org/elpa/transient-20220803.1000/transient-autoloads.el deleted file mode 100644 index 182f8b2..0000000 --- a/org/elpa/transient-20220803.1000/transient-autoloads.el +++ /dev/null @@ -1,84 +0,0 @@ -;;; transient-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 "transient" "transient.el" (0 0 0 0)) -;;; Generated autoloads from transient.el - -(autoload 'transient-insert-suffix "transient" "\ -Insert a SUFFIX into PREFIX before LOC. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `transient-define-prefix'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -Remove a conflicting binding unless optional KEEP-OTHER is - non-nil. -See info node `(transient)Modifying Existing Transients'. - -\(fn PREFIX LOC SUFFIX &optional KEEP-OTHER)" nil nil) - -(function-put 'transient-insert-suffix 'lisp-indent-function 'defun) - -(autoload 'transient-append-suffix "transient" "\ -Insert a SUFFIX into PREFIX after LOC. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `transient-define-prefix'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -Remove a conflicting binding unless optional KEEP-OTHER is - non-nil. -See info node `(transient)Modifying Existing Transients'. - -\(fn PREFIX LOC SUFFIX &optional KEEP-OTHER)" nil nil) - -(function-put 'transient-append-suffix 'lisp-indent-function 'defun) - -(autoload 'transient-replace-suffix "transient" "\ -Replace the suffix at LOC in PREFIX with SUFFIX. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `transient-define-prefix'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'. - -\(fn PREFIX LOC SUFFIX)" nil nil) - -(function-put 'transient-replace-suffix 'lisp-indent-function 'defun) - -(autoload 'transient-remove-suffix "transient" "\ -Remove the suffix or group at LOC in PREFIX. -PREFIX is a prefix command, a symbol. -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'. - -\(fn PREFIX LOC)" nil nil) - -(function-put 'transient-remove-suffix 'lisp-indent-function 'defun) - -(register-definition-prefixes "transient" '("magit--fit-window-to-buffer" "transient")) - -;;;*** - -;;;### (autoloads nil nil ("transient-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; transient-autoloads.el ends here diff --git a/org/elpa/transient-20220803.1000/transient.el b/org/elpa/transient-20220803.1000/transient.el deleted file mode 100644 index e823d9b..0000000 --- a/org/elpa/transient-20220803.1000/transient.el +++ /dev/null @@ -1,4092 +0,0 @@ -;;; transient.el --- Transient commands -*- lexical-binding:t -*- - -;; Copyright (C) 2018-2022 Free Software Foundation, Inc. - -;; Author: Jonas Bernoulli -;; Homepage: https://github.com/magit/transient -;; Keywords: extensions - -;; Package-Version: 0.3.7-git -;; Package-Requires: ((emacs "25.1") (compat "28.1.1.0")) - -;; SPDX-License-Identifier: GPL-3.0-or-later - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published -;; by the Free Software Foundation, either version 3 of the License, -;; or (at your option) any later version. -;; -;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see . - -;;; Commentary: - -;; Taking inspiration from prefix keys and prefix arguments, Transient -;; implements a similar abstraction involving a prefix command, infix -;; arguments and suffix commands. We could call this abstraction a -;; "transient command", but because it always involves at least two -;; commands (a prefix and a suffix) we prefer to call it just a -;; "transient". - -;; When the user calls a transient prefix command, then a transient -;; (temporary) keymap is activated, which binds the transient's infix -;; and suffix commands, and functions that control the transient state -;; are added to `pre-command-hook' and `post-command-hook'. The -;; available suffix and infix commands and their state are shown in -;; the echo area until the transient is exited by invoking a suffix -;; command. - -;; Calling an infix command causes its value to be changed, possibly -;; by reading a new value in the minibuffer. - -;; Calling a suffix command usually causes the transient to be exited -;; but suffix commands can also be configured to not exit the -;; transient state. - -;;; Code: - -(require 'cl-lib) -(require 'compat) -(require 'eieio) -(require 'edmacro) -(require 'format-spec) -(require 'seq) - -(eval-when-compile (require 'subr-x)) - -(declare-function info "info" (&optional file-or-node buffer)) -(declare-function Man-find-section "man" (section)) -(declare-function Man-next-section "man" (n)) -(declare-function Man-getpage-in-background "man" (topic)) - -(defvar display-line-numbers) ; since Emacs 26.1 -(defvar Man-notify-method) - -(define-obsolete-function-alias 'define-transient-command - 'transient-define-prefix "Transient 0.3.0") -(define-obsolete-function-alias 'define-suffix-command - 'transient-define-suffix "Transient 0.3.0") -(define-obsolete-function-alias 'define-infix-command - 'transient-define-infix "Transient 0.3.0") -(define-obsolete-function-alias 'define-infix-argument - #'transient-define-argument "Transient 0.3.0") - -(define-obsolete-variable-alias 'transient--source-buffer - 'transient--original-buffer "Transient 0.2.0") -(define-obsolete-variable-alias 'current-transient-prefix - 'transient-current-prefix "Transient 0.3.0") -(define-obsolete-variable-alias 'current-transient-command - 'transient-current-command "Transient 0.3.0") -(define-obsolete-variable-alias 'current-transient-suffixes - 'transient-current-suffixes "Transient 0.3.0") -(define-obsolete-variable-alias 'post-transient-hook - 'transient-exit-hook "Transient 0.3.0") - -(defmacro transient--with-emergency-exit (&rest body) - (declare (indent defun)) - `(condition-case err - (let ((debugger #'transient--exit-and-debug)) - ,(macroexp-progn body)) - ((debug error) - (transient--emergency-exit) - (signal (car err) (cdr err))))) - -(defun transient--exit-and-debug (&rest args) - (transient--emergency-exit) - (apply #'debug args)) - -;;; Options - -(defgroup transient nil - "Transient commands." - :group 'extensions) - -(defcustom transient-show-popup t - "Whether to show the current transient in a popup buffer. -\\ -- If t, then show the popup as soon as a transient prefix command - is invoked. - -- If nil, then do not show the popup unless the user explicitly - requests it, by pressing \\[transient-show] or a prefix key. - -- If a number, then delay displaying the popup and instead show - a brief one-line summary. If zero or negative, then suppress - even showing that summary and display the pressed key only. - - Show the popup when the user explicitly requests it by pressing - \\[transient-show] or a prefix key. Unless zero, then also show the popup - after that many seconds of inactivity (using the absolute value)." - :package-version '(transient . "0.1.0") - :group 'transient - :type '(choice (const :tag "instantly" t) - (const :tag "on demand" nil) - (const :tag "on demand (no summary)" 0) - (number :tag "after delay" 1))) - -(defcustom transient-enable-popup-navigation t - "Whether navigation commands are enabled in the transient popup. - -While a transient is active the transient popup buffer is not the -current buffer, making it necessary to use dedicated commands to -act on that buffer itself. If this is non-nil, then the following -bindings are available: - -\\\ -- \\[transient-backward-button] moves the cursor to the previous suffix. -- \\[transient-forward-button] moves the cursor to the next suffix. -- \\[transient-push-button] invokes the suffix the cursor is on. -\\\ -- \\`' and \\`' invoke the clicked on suffix. -\\\ -- \\[transient-isearch-backward]\ - and \\[transient-isearch-forward] start isearch in the popup buffer. - -\\`' and \\`' are bound in `transient-push-button'. -All other bindings are in `transient-popup-navigation-map'. - -By default \\`M-RET' is bound to `transient-push-button', instead of -\\`RET', because if a transient allows the invocation of non-suffixes -then it is likely that you would want \\`RET' to do what it would do -if no transient were active." - :package-version '(transient . "0.4.0") - :group 'transient - :type 'boolean) - -(defcustom transient-display-buffer-action - '(display-buffer-in-side-window - (side . bottom) - (dedicated . t) - (inhibit-same-window . t) - (window-parameters (no-other-window . t))) - "The action used to display the transient popup buffer. - -The transient popup buffer is displayed in a window using - - (display-buffer BUFFER transient-display-buffer-action) - -The value of this option has the form (FUNCTION . ALIST), -where FUNCTION is a function or a list of functions. Each such -function should accept two arguments: a buffer to display and an -alist of the same form as ALIST. See info node `(elisp)Choosing -Window' for details. - -The default is: - - (display-buffer-in-side-window - (side . bottom) - (dedicated . t) - (inhibit-same-window . t) - (window-parameters (no-other-window . t))) - -This displays the window at the bottom of the selected frame. -Another useful FUNCTION is `display-buffer-below-selected', which -is what `magit-popup' used by default. For more alternatives see -info node `(elisp)Display Action Functions' and info node -`(elisp)Buffer Display Action Alists'. - -Note that the buffer that was current before the transient buffer -is shown should remain the current buffer. Many suffix commands -act on the thing at point, if appropriate, and if the transient -buffer became the current buffer, then that would change what is -at point. To that effect `inhibit-same-window' ensures that the -selected window is not used to show the transient buffer. - -It may be possible to display the window in another frame, but -whether that works in practice depends on the window-manager. -If the window manager selects the new window (Emacs frame), -then that unfortunately changes which buffer is current. - -If you change the value of this option, then you might also -want to change the value of `transient-mode-line-format'." - :package-version '(transient . "0.3.0") - :group 'transient - :type '(cons (choice function (repeat :tag "Functions" function)) - alist)) - -(defcustom transient-mode-line-format 'line - "The mode-line format for the transient popup buffer. - -If nil, then the buffer has no mode-line. If the buffer is not -displayed right above the echo area, then this probably is not -a good value. - -If `line' (the default), then the buffer also has no mode-line, -but a thin line is drawn instead, using the background color of -the face `transient-separator'. Termcap frames cannot display -thin lines and therefore fallback to treating `line' like nil. - -Otherwise this can be any mode-line format. -See `mode-line-format' for details." - :package-version '(transient . "0.2.0") - :group 'transient - :type '(choice (const :tag "hide mode-line" nil) - (const :tag "substitute thin line" line) - (const :tag "name of prefix command" - ("%e" mode-line-front-space - mode-line-buffer-identification)) - (sexp :tag "custom mode-line format"))) - -(defcustom transient-show-common-commands nil - "Whether to show common transient suffixes in the popup buffer. - -These commands are always shown after typing the prefix key -\"C-x\" when a transient command is active. To toggle the value -of this variable use \"C-x t\" when a transient is active." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'boolean) - -(defcustom transient-read-with-initial-input nil - "Whether to use the last history element as initial minibuffer input." - :package-version '(transient . "0.2.0") - :group 'transient - :type 'boolean) - -(defcustom transient-highlight-mismatched-keys nil - "Whether to highlight keys that do not match their argument. - -This only affects infix arguments that represent command-line -arguments. When this option is non-nil, then the key binding -for infix argument are highlighted when only a long argument -\(e.g. \"--verbose\") is specified but no shor-thand (e.g \"-v\"). -In the rare case that a short-hand is specified but does not -match the key binding, then it is highlighted differently. - -The highlighting is done using `transient-mismatched-key' -and `transient-nonstandard-key'." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'boolean) - -(defcustom transient-highlight-higher-levels nil - "Whether to highlight suffixes on higher levels. - -This is primarily intended for package authors. - -When non-nil then highlight the description of suffixes whose -level is above 4, the default of `transient-default-level'. -Assuming you have set that variable to 7, this highlights all -suffixes that won't be available to users without them making -the same customization." - :package-version '(transient . "0.3.6") - :group 'transient - :type 'boolean) - -(defcustom transient-substitute-key-function nil - "Function used to modify key bindings. - -This function is called with one argument, the prefix object, -and must return a key binding description, either the existing -key description it finds in the `key' slot, or a substitution. - -This is intended to let users replace certain prefix keys. It -could also be used to make other substitutions, but that is -discouraged. - -For example, \"=\" is hard to reach using my custom keyboard -layout, so I substitute \"(\" for that, which is easy to reach -using a layout optimized for Lisp. - - (setq transient-substitute-key-function - (lambda (obj) - (let ((key (oref obj key))) - (if (string-match \"\\\\`\\\\(=\\\\)[a-zA-Z]\" key) - (replace-match \"(\" t t key 1) - key)))))" - :package-version '(transient . "0.1.0") - :group 'transient - :type '(choice (const :tag "Transform no keys (nil)" nil) function)) - -(defcustom transient-semantic-coloring nil - "Whether to color prefixes and suffixes in Hydra-like fashion. -This feature is experimental. - -If non-nil, then the key binding of each suffix is colorized to -indicate whether it exits the transient state or not. The color -of the prefix is indicated using the line that is drawn when the -value of `transient-mode-line-format' is `line'. - -For more information about how Hydra uses colors see -https://github.com/abo-abo/hydra#color and -https://oremacs.com/2015/02/19/hydra-colors-reloaded." - :package-version '(transient . "0.3.0") - :group 'transient - :type 'boolean) - -(defcustom transient-detect-key-conflicts nil - "Whether to detect key binding conflicts. - -Conflicts are detected when a transient prefix command is invoked -and results in an error, which prevents the transient from being -used." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'boolean) - -(defcustom transient-align-variable-pitch nil - "Whether to align columns pixel-wise in the popup buffer. - -If this is non-nil, then columns are aligned pixel-wise to -support variable-pitch fonts. Keys are not aligned, so you -should use a fixed-pitch font for the `transient-key' face. -Other key faces inherit from that face unless a theme is -used that breaks that relationship. - -This option is intended for users who use a variable-pitch -font for the `default' face. - -Also see `transient-force-fixed-pitch'." - :package-version '(transient . "0.4.0") - :group 'transient - :type 'boolean) - -(defcustom transient-force-fixed-pitch nil - "Whether to force use of monospaced font in the popup buffer. - -Even if you use a proportional font for the `default' face, -you might still want to use a monospaced font in transient's -popup buffer. Setting this option to t causes `default' to -be remapped to `fixed-pitch' in that buffer. - -Also see `transient-align-variable-pitch'." - :package-version '(transient . "0.2.0") - :group 'transient - :type 'boolean) - -(defcustom transient-force-single-column nil - "Whether to force use of a single column to display suffixes. - -This might be useful for users with low vision who use large -text and might otherwise have to scroll in two dimensions." - :package-version '(transient . "0.3.6") - :group 'transient - :type 'boolean) - -(defcustom transient-hide-during-minibuffer-read nil - "Whether to hide the transient buffer while reading in the minibuffer." - :package-version '(transient . "0.4.0") - :group 'transient - :type 'boolean) - -(defconst transient--default-child-level 1) - -(defconst transient--default-prefix-level 4) - -(defcustom transient-default-level transient--default-prefix-level - "Control what suffix levels are made available by default. - -Each suffix command is placed on a level and each prefix command -has a level, which controls which suffix commands are available. -Integers between 1 and 7 (inclusive) are valid levels. - -The levels of individual transients and/or their individual -suffixes can be changed individually, by invoking the prefix and -then pressing \"C-x l\". - -The default level for both transients and their suffixes is 4. -This option only controls the default for transients. The default -suffix level is always 4. The author of a transient should place -certain suffixes on a higher level if they expect that it won't be -of use to most users, and they should place very important suffixes -on a lower level so that they remain available even if the user -lowers the transient level. - -\(Magit currently places nearly all suffixes on level 4 and lower -levels are not used at all yet. So for the time being you should -not set a lower level here and using a higher level might not -give you as many additional suffixes as you hoped.)" - :package-version '(transient . "0.1.0") - :group 'transient - :type '(choice (const :tag "1 - fewest suffixes" 1) - (const 2) - (const 3) - (const :tag "4 - default" 4) - (const 5) - (const 6) - (const :tag "7 - most suffixes" 7))) - -(defcustom transient-levels-file - (locate-user-emacs-file "transient/levels.el") - "File used to save levels of transients and their suffixes." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'file) - -(defcustom transient-values-file - (locate-user-emacs-file "transient/values.el") - "File used to save values of transients." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'file) - -(defcustom transient-history-file - (locate-user-emacs-file "transient/history.el") - "File used to save history of transients and their infixes." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'file) - -(defcustom transient-history-limit 10 - "Number of history elements to keep when saving to file." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'integer) - -(defcustom transient-save-history t - "Whether to save history of transient commands when exiting Emacs." - :package-version '(transient . "0.1.0") - :group 'transient - :type 'boolean) - -;;; Faces - -(defgroup transient-faces nil - "Faces used by Transient." - :group 'transient) - -(defface transient-heading '((t :inherit font-lock-keyword-face)) - "Face used for headings." - :group 'transient-faces) - -(defface transient-key '((t :inherit font-lock-builtin-face)) - "Face used for keys." - :group 'transient-faces) - -(defface transient-argument '((t :inherit font-lock-warning-face)) - "Face used for enabled arguments." - :group 'transient-faces) - -(defface transient-value '((t :inherit font-lock-string-face)) - "Face used for values." - :group 'transient-faces) - -(defface transient-inactive-argument '((t :inherit shadow)) - "Face used for inactive arguments." - :group 'transient-faces) - -(defface transient-inactive-value '((t :inherit shadow)) - "Face used for inactive values." - :group 'transient-faces) - -(defface transient-unreachable '((t :inherit shadow)) - "Face used for suffixes unreachable from the current prefix sequence." - :group 'transient-faces) - -(defface transient-active-infix '((t :inherit secondary-selection)) - "Face used for the infix for which the value is being read." - :group 'transient-faces) - -(defface transient-unreachable-key '((t :inherit (transient-key shadow))) - "Face used for keys unreachable from the current prefix sequence." - :group 'transient-faces) - -(defface transient-nonstandard-key '((t :underline t)) - "Face optionally used to highlight keys conflicting with short-argument. -Also see option `transient-highlight-mismatched-keys'." - :group 'transient-faces) - -(defface transient-mismatched-key '((t :underline t)) - "Face optionally used to highlight keys without a short-argument. -Also see option `transient-highlight-mismatched-keys'." - :group 'transient-faces) - -(defface transient-inapt-suffix '((t :inherit shadow :italic t)) - "Face used for suffixes that are inapt at this time." - :group 'transient-faces) - -(defface transient-enabled-suffix - '((t :background "green" :foreground "black" :weight bold)) - "Face used for enabled levels while editing suffix levels. -See info node `(transient)Enabling and Disabling Suffixes'." - :group 'transient-faces) - -(defface transient-disabled-suffix - '((t :background "red" :foreground "black" :weight bold)) - "Face used for disabled levels while editing suffix levels. -See info node `(transient)Enabling and Disabling Suffixes'." - :group 'transient-faces) - -(defface transient-higher-level '((t :underline t)) - "Face optionally used to highlight suffixes on higher levels. -Also see option `transient-highlight-higher-levels'." - :group 'transient-faces) - -(defface transient-separator - `((((class color) (background light)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey80") - (((class color) (background dark)) - ,@(and (>= emacs-major-version 27) '(:extend t)) - :background "grey30")) - "Face used to draw line below transient popup window. -This is only used if `transient-mode-line-format' is `line'. -Only the background color is significant." - :group 'transient-faces) - -(defgroup transient-color-faces - '((transient-semantic-coloring custom-variable)) - "Faces used by Transient for Hydra-like command coloring. -These faces are only used if `transient-semantic-coloring' -\(which see) is non-nil." - :group 'transient-faces) - -(defface transient-red - '((t :inherit transient-key :foreground "red")) - "Face used for red prefixes and suffixes." - :group 'transient-color-faces) - -(defface transient-blue - '((t :inherit transient-key :foreground "blue")) - "Face used for blue prefixes and suffixes." - :group 'transient-color-faces) - -(defface transient-amaranth - '((t :inherit transient-key :foreground "#E52B50")) - "Face used for amaranth prefixes." - :group 'transient-color-faces) - -(defface transient-pink - '((t :inherit transient-key :foreground "#FF6EB4")) - "Face used for pink prefixes." - :group 'transient-color-faces) - -(defface transient-teal - '((t :inherit transient-key :foreground "#367588")) - "Face used for teal prefixes." - :group 'transient-color-faces) - -(defface transient-purple - '((t :inherit transient-key :foreground "#a020f0")) - "Face used for purple prefixes. - -This is an addition to the colors supported by Hydra. It is -used by suffixes that quit the current prefix but return to -the previous prefix." - :group 'transient-color-faces) - -;;; Persistence - -(defun transient--read-file-contents (file) - (with-demoted-errors "Transient error: %S" - (and (file-exists-p file) - (with-temp-buffer - (insert-file-contents file) - (read (current-buffer)))))) - -(defun transient--pp-to-file (list file) - (make-directory (file-name-directory file) t) - (setq list (cl-sort (copy-sequence list) #'string< :key #'car)) - (with-temp-file file - (let ((print-level nil) - (print-length nil)) - (pp list (current-buffer))))) - -(defvar transient-values - (transient--read-file-contents transient-values-file) - "Values of transient commands. -The value of this variable persists between Emacs sessions -and you usually should not change it manually.") - -(defun transient-save-values () - (transient--pp-to-file transient-values transient-values-file)) - -(defvar transient-levels - (transient--read-file-contents transient-levels-file) - "Levels of transient commands. -The value of this variable persists between Emacs sessions -and you usually should not change it manually.") - -(defun transient-save-levels () - (transient--pp-to-file transient-levels transient-levels-file)) - -(defvar transient-history - (transient--read-file-contents transient-history-file) - "History of transient commands and infix arguments. -The value of this variable persists between Emacs sessions -\(unless `transient-save-history' is nil) and you usually -should not change it manually.") - -(defun transient-save-history () - (setq transient-history - (cl-sort (mapcar (pcase-lambda (`(,key . ,val)) - (cons key (seq-take (delete-dups val) - transient-history-limit))) - transient-history) - #'string< :key #'car)) - (transient--pp-to-file transient-history transient-history-file)) - -(defun transient-maybe-save-history () - "Save the value of `transient-history'. -If `transient-save-history' is nil, then do nothing." - (when transient-save-history - (transient-save-history))) - -(unless noninteractive - (add-hook 'kill-emacs-hook #'transient-maybe-save-history)) - -;;; Classes -;;;; Prefix - -(defclass transient-prefix () - ((prototype :initarg :prototype) - (command :initarg :command) - (level :initarg :level) - (variable :initarg :variable :initform nil) - (init-value :initarg :init-value) - (value) (default-value :initarg :value) - (scope :initarg :scope :initform nil) - (history :initarg :history :initform nil) - (history-pos :initarg :history-pos :initform 0) - (history-key :initarg :history-key :initform nil) - (show-help :initarg :show-help :initform nil) - (info-manual :initarg :info-manual :initform nil) - (man-page :initarg :man-page :initform nil) - (transient-suffix :initarg :transient-suffix :initform nil) - (transient-non-suffix :initarg :transient-non-suffix :initform nil) - (incompatible :initarg :incompatible :initform nil) - (suffix-description :initarg :suffix-description) - (variable-pitch :initarg :variable-pitch :initform nil)) - "Transient prefix command. - -Each transient prefix command consists of a command, which is -stored in a symbol's function slot and an object, which is -stored in the `transient--prefix' property of the same symbol. - -When a transient prefix command is invoked, then a clone of that -object is stored in the global variable `transient--prefix' and -the prototype is stored in the clone's `prototype' slot.") - -;;;; Suffix - -(defclass transient-child () - ((level - :initarg :level - :initform (symbol-value 'transient--default-child-level) - :documentation "Enable if level of prefix is equal or greater.") - (if - :initarg :if - :initform nil - :documentation "Enable if predicate returns non-nil.") - (if-not - :initarg :if-not - :initform nil - :documentation "Enable if predicate returns nil.") - (if-non-nil - :initarg :if-non-nil - :initform nil - :documentation "Enable if variable's value is non-nil.") - (if-nil - :initarg :if-nil - :initform nil - :documentation "Enable if variable's value is nil.") - (if-mode - :initarg :if-mode - :initform nil - :documentation "Enable if major-mode matches value.") - (if-not-mode - :initarg :if-not-mode - :initform nil - :documentation "Enable if major-mode does not match value.") - (if-derived - :initarg :if-derived - :initform nil - :documentation "Enable if major-mode derives from value.") - (if-not-derived - :initarg :if-not-derived - :initform nil - :documentation "Enable if major-mode does not derive from value.")) - "Abstract superclass for group and suffix classes. - -It is undefined what happens if more than one `if*' predicate -slot is non-nil." - :abstract t) - -(defclass transient-suffix (transient-child) - ((key :initarg :key) - (command :initarg :command) - (transient :initarg :transient) - (format :initarg :format :initform " %k %d") - (description :initarg :description :initform nil) - (show-help :initarg :show-help :initform nil) - (inapt :initform nil) - (inapt-if - :initarg :inapt-if - :initform nil - :documentation "Inapt if predicate returns non-nil.") - (inapt-if-not - :initarg :inapt-if-not - :initform nil - :documentation "Inapt if predicate returns nil.") - (inapt-if-non-nil - :initarg :inapt-if-non-nil - :initform nil - :documentation "Inapt if variable's value is non-nil.") - (inapt-if-nil - :initarg :inapt-if-nil - :initform nil - :documentation "Inapt if variable's value is nil.") - (inapt-if-mode - :initarg :inapt-if-mode - :initform nil - :documentation "Inapt if major-mode matches value.") - (inapt-if-not-mode - :initarg :inapt-if-not-mode - :initform nil - :documentation "Inapt if major-mode does not match value.") - (inapt-if-derived - :initarg :inapt-if-derived - :initform nil - :documentation "Inapt if major-mode derives from value.") - (inapt-if-not-derived - :initarg :inapt-if-not-derived - :initform nil - :documentation "Inapt if major-mode does not derive from value.")) - "Superclass for suffix command.") - -(defclass transient-infix (transient-suffix) - ((transient :initform t) - (argument :initarg :argument) - (shortarg :initarg :shortarg) - (value :initform nil) - (init-value :initarg :init-value) - (unsavable :initarg :unsavable :initform nil) - (multi-value :initarg :multi-value :initform nil) - (always-read :initarg :always-read :initform nil) - (allow-empty :initarg :allow-empty :initform nil) - (history-key :initarg :history-key :initform nil) - (reader :initarg :reader :initform nil) - (prompt :initarg :prompt :initform nil) - (choices :initarg :choices :initform nil) - (format :initform " %k %d (%v)")) - "Transient infix command." - :abstract t) - -(defclass transient-argument (transient-infix) () - "Abstract superclass for infix arguments." - :abstract t) - -(defclass transient-switch (transient-argument) () - "Class used for command-line argument that can be turned on and off.") - -(defclass transient-option (transient-argument) () - "Class used for command-line argument that can take a value.") - -(defclass transient-variable (transient-infix) - ((variable :initarg :variable) - (format :initform " %k %d %v")) - "Abstract superclass for infix commands that set a variable." - :abstract t) - -(defclass transient-switches (transient-argument) - ((argument-format :initarg :argument-format) - (argument-regexp :initarg :argument-regexp)) - "Class used for sets of mutually exclusive command-line switches.") - -(defclass transient-files (transient-option) () - ((key :initform "--") - (argument :initform "--") - (multi-value :initform rest) - (reader :initform transient-read-files)) - "Class used for the \"--\" argument or similar. -All remaining arguments are treated as files. -They become the value of this argument.") - -;;;; Group - -(defclass transient-group (transient-child) - ((suffixes :initarg :suffixes :initform nil) - (hide :initarg :hide :initform nil) - (description :initarg :description :initform nil) - (setup-children :initarg :setup-children) - (pad-keys :initarg :pad-keys)) - "Abstract superclass of all group classes." - :abstract t) - -(defclass transient-column (transient-group) () - "Group class that displays each element on a separate line.") - -(defclass transient-row (transient-group) () - "Group class that displays all elements on a single line.") - -(defclass transient-columns (transient-group) () - "Group class that displays elements organized in columns. -Direct elements have to be groups whose elements have to be -commands or string. Each subgroup represents a column. This -class takes care of inserting the subgroups' elements.") - -(defclass transient-subgroups (transient-group) () - "Group class that wraps other groups. - -Direct elements have to be groups whose elements have to be -commands or strings. This group inserts an empty line between -subgroups. The subgroups are responsible for displaying their -elements themselves.") - -;;; Define - -(defmacro transient-define-prefix (name arglist &rest args) - "Define NAME as a transient prefix command. - -ARGLIST are the arguments that command takes. -DOCSTRING is the documentation string and is optional. - -These arguments can optionally be followed by key-value pairs. -Each key has to be a keyword symbol, either `:class' or a keyword -argument supported by the constructor of that class. The -`transient-prefix' class is used if the class is not specified -explicitly. - -GROUPs add key bindings for infix and suffix commands and specify -how these bindings are presented in the popup buffer. At least -one GROUP has to be specified. See info node `(transient)Binding -Suffix and Infix Commands'. - -The BODY is optional. If it is omitted, then ARGLIST is also -ignored and the function definition becomes: - - (lambda () - (interactive) - (transient-setup \\='NAME)) - -If BODY is specified, then it must begin with an `interactive' -form that matches ARGLIST, and it must call `transient-setup'. -It may however call that function only when some condition is -satisfied; that is one of the reason why you might want to use -an explicit BODY. - -All transients have a (possibly nil) value, which is exported -when suffix commands are called, so that they can consume that -value. For some transients it might be necessary to have a sort -of secondary value, called a scope. Such a scope would usually -be set in the commands `interactive' form and has to be passed -to the setup function: - - (transient-setup \\='NAME nil nil :scope SCOPE) - -\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... GROUP... [BODY...])" - (declare (debug ( &define name lambda-list - [&optional lambda-doc] - [&rest keywordp sexp] - [&rest vectorp] - [&optional ("interactive" interactive) def-body])) - (indent defun) - (doc-string 3)) - (pcase-let ((`(,class ,slots ,suffixes ,docstr ,body) - (transient--expand-define-args args))) - `(progn - (defalias ',name - ,(if body - `(lambda ,arglist ,@body) - `(lambda () - (interactive) - (transient-setup ',name)))) - (put ',name 'interactive-only t) - (put ',name 'function-documentation ,docstr) - (put ',name 'transient--prefix - (,(or class 'transient-prefix) :command ',name ,@slots)) - (put ',name 'transient--layout - ',(cl-mapcan (lambda (s) (transient--parse-child name s)) - suffixes))))) - -(defmacro transient-define-suffix (name arglist &rest args) - "Define NAME as a transient suffix command. - -ARGLIST are the arguments that the command takes. -DOCSTRING is the documentation string and is optional. - -These arguments can optionally be followed by key-value pairs. -Each key has to be a keyword symbol, either `:class' or a -keyword argument supported by the constructor of that class. -The `transient-suffix' class is used if the class is not -specified explicitly. - -The BODY must begin with an `interactive' form that matches -ARGLIST. The infix arguments are usually accessed by using -`transient-args' inside `interactive'. - -\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]... BODY...)" - (declare (debug ( &define name lambda-list - [&optional lambda-doc] - [&rest keywordp sexp] - ("interactive" interactive) - def-body)) - (indent defun) - (doc-string 3)) - (pcase-let ((`(,class ,slots ,_ ,docstr ,body) - (transient--expand-define-args args))) - `(progn - (defalias ',name (lambda ,arglist ,@body)) - (put ',name 'interactive-only t) - (put ',name 'function-documentation ,docstr) - (put ',name 'transient--suffix - (,(or class 'transient-suffix) :command ',name ,@slots))))) - -(defmacro transient-define-infix (name _arglist &rest args) - "Define NAME as a transient infix command. - -ARGLIST is always ignored and reserved for future use. -DOCSTRING is the documentation string and is optional. - -The key-value pairs are mandatory. All transient infix commands -are equal to each other (but not eq), so it is meaningless to -define an infix command without also setting at least `:class' -and one other keyword (which it is depends on the used class, -usually `:argument' or `:variable'). - -Each key has to be a keyword symbol, either `:class' or a keyword -argument supported by the constructor of that class. The -`transient-switch' class is used if the class is not specified -explicitly. - -The function definitions is always: - - (lambda () - (interactive) - (let ((obj (transient-suffix-object))) - (transient-infix-set obj (transient-infix-read obj))) - (transient--show)) - -`transient-infix-read' and `transient-infix-set' are generic -functions. Different infix commands behave differently because -the concrete methods are different for different infix command -classes. In rare case the above command function might not be -suitable, even if you define your own infix command class. In -that case you have to use `transient-define-suffix' to define -the infix command and use t as the value of the `:transient' -keyword. - -\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]...)" - (declare (debug ( &define name lambda-list - [&optional lambda-doc] - [&rest keywordp sexp])) - (indent defun) - (doc-string 3)) - (pcase-let ((`(,class ,slots ,_ ,docstr ,_) - (transient--expand-define-args args))) - `(progn - (defalias ',name ,(transient--default-infix-command)) - (put ',name 'interactive-only t) - (put ',name 'command-modes (list 'not-a-mode)) - (put ',name 'function-documentation ,docstr) - (put ',name 'transient--suffix - (,(or class 'transient-switch) :command ',name ,@slots))))) - -(defalias 'transient-define-argument #'transient-define-infix - "Define NAME as a transient infix command. - -Only use this alias to define an infix command that actually -sets an infix argument. To define a infix command that, for -example, sets a variable use `transient-define-infix' instead. - -\(fn NAME ARGLIST [DOCSTRING] [KEYWORD VALUE]...)") - -(defun transient--expand-define-args (args) - (let (class keys suffixes docstr) - (when (stringp (car args)) - (setq docstr (pop args))) - (while (keywordp (car args)) - (let ((k (pop args)) - (v (pop args))) - (if (eq k :class) - (setq class v) - (push k keys) - (push v keys)))) - (while (let ((arg (car args))) - (if (vectorp arg) - (setcar args (eval (cdr (backquote-process arg)))) - (and arg (symbolp arg)))) - (push (pop args) suffixes)) - (list (if (eq (car-safe class) 'quote) - (cadr class) - class) - (nreverse keys) - (nreverse suffixes) - docstr - args))) - -(defun transient--parse-child (prefix spec) - (cl-etypecase spec - (symbol (let ((value (symbol-value spec))) - (if (and (listp value) - (or (listp (car value)) - (vectorp (car value)))) - (cl-mapcan (lambda (s) (transient--parse-child prefix s)) value) - (transient--parse-child prefix value)))) - (vector (and-let* ((c (transient--parse-group prefix spec))) (list c))) - (list (and-let* ((c (transient--parse-suffix prefix spec))) (list c))) - (string (list spec)))) - -(defun transient--parse-group (prefix spec) - (setq spec (append spec nil)) - (cl-symbol-macrolet - ((car (car spec)) - (pop (pop spec))) - (let (level class args) - (when (integerp car) - (setq level pop)) - (when (stringp car) - (setq args (plist-put args :description pop))) - (while (keywordp car) - (let ((k pop)) - (if (eq k :class) - (setq class pop) - (setq args (plist-put args k pop))))) - (vector (or level transient--default-child-level) - (or class - (if (vectorp car) - 'transient-columns - 'transient-column)) - args - (cl-mapcan (lambda (s) (transient--parse-child prefix s)) spec))))) - -(defun transient--parse-suffix (prefix spec) - (let (level class args) - (cl-symbol-macrolet - ((car (car spec)) - (pop (pop spec))) - (when (integerp car) - (setq level pop)) - (when (or (stringp car) - (vectorp car)) - (setq args (plist-put args :key pop))) - (when (or (stringp car) - (eq (car-safe car) 'lambda) - (and (symbolp car) - (not (commandp car)) - (commandp (cadr spec)))) - (setq args (plist-put args :description pop))) - (cond - ((keywordp car) - (error "Need command, got %S" car)) - ((symbolp car) - (setq args (plist-put args :command pop))) - ((and (commandp car) - (not (stringp car))) - (let ((cmd pop) - (sym (intern (format "transient:%s:%s" - prefix - (or (plist-get args :description) - (plist-get args :key)))))) - (defalias sym cmd) - (setq args (plist-put args :command sym)))) - ((or (stringp car) - (and car (listp car))) - (let ((arg pop)) - (cl-typecase arg - (list - (setq args (plist-put args :shortarg (car arg))) - (setq args (plist-put args :argument (cadr arg))) - (setq arg (cadr arg))) - (string - (when-let ((shortarg (transient--derive-shortarg arg))) - (setq args (plist-put args :shortarg shortarg))) - (setq args (plist-put args :argument arg)))) - (setq args (plist-put args :command - (intern (format "transient:%s:%s" - prefix arg)))) - (cond ((and car (not (keywordp car))) - (setq class 'transient-option) - (setq args (plist-put args :reader pop))) - ((not (string-suffix-p "=" arg)) - (setq class 'transient-switch)) - (t - (setq class 'transient-option))))) - (t - (error "Needed command or argument, got %S" car))) - (while (keywordp car) - (let ((k pop)) - (cl-case k - (:class (setq class pop)) - (:level (setq level pop)) - (t (setq args (plist-put args k pop))))))) - (unless (plist-get args :key) - (when-let ((shortarg (plist-get args :shortarg))) - (setq args (plist-put args :key shortarg)))) - (list (or level transient--default-child-level) - (or class 'transient-suffix) - args))) - -(defun transient--default-infix-command () - (cons 'lambda - '(() - (interactive) - (let ((obj (transient-suffix-object))) - (transient-infix-set obj (transient-infix-read obj))) - (transient--show)))) - -(defun transient--ensure-infix-command (obj) - (let ((cmd (oref obj command))) - (unless (or (commandp cmd) - (get cmd 'transient--infix-command)) - (if (or (cl-typep obj 'transient-switch) - (cl-typep obj 'transient-option)) - (put cmd 'transient--infix-command - (transient--default-infix-command)) - ;; This is not an anonymous infix argument. - (when (transient--use-suffix-p obj) - (error "Suffix %s is not defined or autoloaded as a command" cmd)))))) - -(defun transient--derive-shortarg (arg) - (save-match-data - (and (string-match "\\`\\(-[a-zA-Z]\\)\\(\\'\\|=\\)" arg) - (match-string 1 arg)))) - -;;; Edit - -(defun transient--insert-suffix (prefix loc suffix action &optional keep-other) - (let* ((suf (cl-etypecase suffix - (vector (transient--parse-group prefix suffix)) - (list (transient--parse-suffix prefix suffix)) - (string suffix))) - (mem (transient--layout-member loc prefix)) - (elt (car mem))) - (cond - ((not mem) - (message "Cannot insert %S into %s; %s not found" - suffix prefix loc)) - ((or (and (vectorp suffix) (not (vectorp elt))) - (and (listp suffix) (vectorp elt)) - (and (stringp suffix) (vectorp elt))) - (message "Cannot place %S into %s at %s; %s" - suffix prefix loc - "suffixes and groups cannot be siblings")) - (t - (when-let* ((bindingp (listp suf)) - (key (transient--spec-key suf)) - (conflict (car (transient--layout-member key prefix))) - (conflictp - (and (not (and (eq action 'replace) - (eq conflict elt))) - (or (not keep-other) - (eq (plist-get (nth 2 suf) :command) - (plist-get (nth 2 conflict) :command))) - (equal (transient--suffix-predicate suf) - (transient--suffix-predicate conflict))))) - (transient-remove-suffix prefix key)) - (cl-ecase action - (insert (setcdr mem (cons elt (cdr mem))) - (setcar mem suf)) - (append (setcdr mem (cons suf (cdr mem)))) - (replace (setcar mem suf))))))) - -;;;###autoload -(defun transient-insert-suffix (prefix loc suffix &optional keep-other) - "Insert a SUFFIX into PREFIX before LOC. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `transient-define-prefix'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -Remove a conflicting binding unless optional KEEP-OTHER is - non-nil. -See info node `(transient)Modifying Existing Transients'." - (declare (indent defun)) - (transient--insert-suffix prefix loc suffix 'insert keep-other)) - -;;;###autoload -(defun transient-append-suffix (prefix loc suffix &optional keep-other) - "Insert a SUFFIX into PREFIX after LOC. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `transient-define-prefix'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -Remove a conflicting binding unless optional KEEP-OTHER is - non-nil. -See info node `(transient)Modifying Existing Transients'." - (declare (indent defun)) - (transient--insert-suffix prefix loc suffix 'append keep-other)) - -;;;###autoload -(defun transient-replace-suffix (prefix loc suffix) - "Replace the suffix at LOC in PREFIX with SUFFIX. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `transient-define-prefix'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'." - (declare (indent defun)) - (transient--insert-suffix prefix loc suffix 'replace)) - -;;;###autoload -(defun transient-remove-suffix (prefix loc) - "Remove the suffix or group at LOC in PREFIX. -PREFIX is a prefix command, a symbol. -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'." - (declare (indent defun)) - (transient--layout-member loc prefix 'remove)) - -(defun transient-get-suffix (prefix loc) - "Return the suffix or group at LOC in PREFIX. -PREFIX is a prefix command, a symbol. -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'." - (if-let ((mem (transient--layout-member loc prefix))) - (car mem) - (error "%s not found in %s" loc prefix))) - -(defun transient-suffix-put (prefix loc prop value) - "Edit the suffix at LOC in PREFIX, setting PROP to VALUE. -PREFIX is a prefix command, a symbol. -SUFFIX is a suffix command or a group specification (of - the same forms as expected by `transient-define-prefix'). -LOC is a command, a key vector, a key description (a string - as returned by `key-description'), or a coordination list - (whose last element may also be a command or key). -See info node `(transient)Modifying Existing Transients'." - (let ((suf (transient-get-suffix prefix loc))) - (setf (elt suf 2) - (plist-put (elt suf 2) prop value)))) - -(defun transient--layout-member (loc prefix &optional remove) - (let ((val (or (get prefix 'transient--layout) - (error "%s is not a transient command" prefix)))) - (when (listp loc) - (while (integerp (car loc)) - (let* ((children (if (vectorp val) (aref val 3) val)) - (mem (transient--nthcdr (pop loc) children))) - (if (and remove (not loc)) - (let ((rest (delq (car mem) children))) - (if (vectorp val) - (aset val 3 rest) - (put prefix 'transient--layout rest)) - (setq val nil)) - (setq val (if loc (car mem) mem))))) - (setq loc (car loc))) - (if loc - (transient--layout-member-1 (transient--kbd loc) val remove) - val))) - -(defun transient--layout-member-1 (loc layout remove) - (cond ((listp layout) - (seq-some (lambda (elt) (transient--layout-member-1 loc elt remove)) - layout)) - ((vectorp (car (aref layout 3))) - (seq-some (lambda (elt) (transient--layout-member-1 loc elt remove)) - (aref layout 3))) - (remove - (aset layout 3 - (delq (car (transient--group-member loc layout)) - (aref layout 3))) - nil) - (t (transient--group-member loc layout)))) - -(defun transient--group-member (loc group) - (cl-member-if (lambda (suffix) - (and (listp suffix) - (let* ((def (nth 2 suffix)) - (cmd (plist-get def :command))) - (if (symbolp loc) - (eq cmd loc) - (equal (transient--kbd - (or (plist-get def :key) - (transient--command-key cmd))) - loc))))) - (aref group 3))) - -(defun transient--kbd (keys) - (when (vectorp keys) - (setq keys (key-description keys))) - (when (stringp keys) - (setq keys (kbd keys))) - keys) - -(defun transient--spec-key (spec) - (let ((plist (nth 2 spec))) - (or (plist-get plist :key) - (transient--command-key - (plist-get plist :command))))) - -(defun transient--command-key (cmd) - (and-let* ((obj (get cmd 'transient--suffix))) - (cond ((slot-boundp obj 'key) - (oref obj key)) - ((slot-exists-p obj 'shortarg) - (if (slot-boundp obj 'shortarg) - (oref obj shortarg) - (transient--derive-shortarg (oref obj argument))))))) - -(defun transient--nthcdr (n list) - (nthcdr (if (< n 0) (- (length list) (abs n)) n) list)) - -;;; Variables - -(defvar transient-current-prefix nil - "The transient from which this suffix command was invoked. -This is an object representing that transient, use -`transient-current-command' to get the respective command.") - -(defvar transient-current-command nil - "The transient from which this suffix command was invoked. -This is a symbol representing that transient, use -`transient-current-prefix' to get the respective object.") - -(defvar transient-current-suffixes nil - "The suffixes of the transient from which this suffix command was invoked. -This is a list of objects. Usually it is sufficient to instead -use the function `transient-args', which returns a list of -values. In complex cases it might be necessary to use this -variable instead.") - -(defvar transient-exit-hook nil - "Hook run after exiting a transient.") - -(defvar transient--prefix nil) -(defvar transient--layout nil) -(defvar transient--suffixes nil) - -(defconst transient--stay t "Do not exit the transient.") -(defconst transient--exit nil "Do exit the transient.") - -(defvar transient--exitp nil "Whether to exit the transient.") -(defvar transient--showp nil "Whether the transient is show in a popup buffer.") -(defvar transient--helpp nil "Whether help-mode is active.") -(defvar transient--editp nil "Whether edit-mode is active.") - -(defvar transient--active-infix nil "The active infix awaiting user input.") - -(defvar transient--timer nil) - -(defvar transient--stack nil) - -(defvar transient--minibuffer-depth 0) - -(defvar transient--buffer-name " *transient*" - "Name of the transient buffer.") - -(defvar transient--window nil - "The window used to display the transient popup.") - -(defvar transient--original-window nil - "The window that was selected before the transient was invoked. -Usually it remains selected while the transient is active.") - -(defvar transient--original-buffer nil - "The buffer that was current before the transient was invoked. -Usually it remains current while the transient is active.") - -(defvar transient--debug nil "Whether put debug information into *Messages*.") - -(defvar transient--history nil) - -(defvar transient--abort-commands - '(abort-minibuffers ; (minibuffer-quit-recursive-edit) - abort-recursive-edit ; (throw 'exit t) - exit-recursive-edit ; (throw 'exit nil) - keyboard-escape-quit ; dwim - keyboard-quit ; (signal 'quit nil) - minibuffer-keyboard-quit ; (abort-minibuffers) - minibuffer-quit-recursive-edit ; (throw 'exit (lambda () - ; (signal 'minibuffer-quit nil))) - top-level)) ; (throw 'top-level nil) - -(defvar transient--scroll-commands - '(transient-scroll-up - transient-scroll-down - mwheel-scroll - scroll-bar-toolkit-scroll)) - -;;; Identities - -(defun transient-suffix-object (&optional command) - "Return the object associated with the current suffix command. - -Each suffix commands is associated with an object, which holds -additional information about the suffix, such as its value (in -the case of an infix command, which is a kind of suffix command). - -This function is intended to be called by infix commands, whose -command definition usually (at least when defined using -`transient-define-infix') is this: - - (lambda () - (interactive) - (let ((obj (transient-suffix-object))) - (transient-infix-set obj (transient-infix-read obj))) - (transient--show)) - -\(User input is read outside of `interactive' to prevent the -command from being added to `command-history'. See #23.) - -Such commands need to be able to access their associated object -to guide how `transient-infix-read' reads the new value and to -store the read value. Other suffix commands (including non-infix -commands) may also need the object to guide their behavior. - -This function attempts to return the object associated with the -current suffix command even if the suffix command was not invoked -from a transient. (For some suffix command that is a valid thing -to do, for others it is not.) In that case nil may be returned -if the command was not defined using one of the macros intended -to define such commands. - -The optional argument COMMAND is intended for internal use. If -you are contemplating using it in your own code, then you should -probably use this instead: - - (get COMMAND \\='transient--suffix)" - (when command - (cl-check-type command command)) - (if (or transient--prefix - transient-current-prefix) - (cl-find-if (lambda (obj) - (eq (transient--suffix-command obj) - (or command this-command))) - (or transient--suffixes - transient-current-suffixes)) - (when-let* ((obj (get (or command this-command) 'transient--suffix)) - (obj (clone obj))) - ;; Cannot use and-let* because of debbugs#31840. - (transient-init-scope obj) - (transient-init-value obj) - obj))) - -(defun transient--suffix-command (object) - "Return the command represented by OBJECT. - -If the value of OBJECT's `command' slot is a command, then return -that. Otherwise it is a symbol whose `transient--infix-command' -property holds an anonymous command, which is returned instead." - (cl-check-type object transient-suffix) - (let ((sym (oref object command))) - (if (commandp sym) - sym - (get sym 'transient--infix-command)))) - -(defun transient--suffix-symbol (arg) - "Return a symbol representing ARG. - -ARG must be a command and/or a symbol. If it is a symbol, -then just return it. Otherwise return the symbol whose -`transient--infix-command' property's value is ARG." - (or (cl-typep arg 'command) - (cl-typep arg 'symbol) - (signal 'wrong-type-argument `((command symbol) ,arg))) - (if (symbolp arg) - arg - (let* ((obj (transient-suffix-object)) - (sym (oref obj command))) - (if (eq (get sym 'transient--infix-command) arg) - sym - (catch 'found - (mapatoms (lambda (sym) - (when (eq (get sym 'transient--infix-command) arg) - (throw 'found sym))))))))) - -;;; Keymaps - -(defvar transient-base-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "ESC ESC ESC") #'transient-quit-all) - (define-key map (kbd "C-g") #'transient-quit-one) - (define-key map (kbd "C-q") #'transient-quit-all) - (define-key map (kbd "C-z") #'transient-suspend) - (define-key map (kbd "C-v") #'transient-scroll-up) - (define-key map (kbd "C-M-v") #'transient-scroll-down) - (define-key map [next] #'transient-scroll-up) - (define-key map [prior] #'transient-scroll-down) - map) - "Parent of other keymaps used by Transient. - -This is the parent keymap of all the keymaps that are used in -all transients: `transient-map' (which in turn is the parent -of the transient-specific keymaps), `transient-edit-map' and -`transient-sticky-map'. - -If you change a binding here, then you might also have to edit -`transient-sticky-map' and `transient-common-commands'. While -the latter isn't a proper transient prefix command, it can be -edited using the same functions as used for transients. - -If you add a new command here, then you must also add a binding -to `transient-predicate-map'.") - -(defvar transient-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map transient-base-map) - (define-key map (kbd "C-u") #'universal-argument) - (define-key map (kbd "C--") #'negative-argument) - (define-key map (kbd "C-t") #'transient-show) - (define-key map (kbd "?") #'transient-help) - (define-key map (kbd "C-h") #'transient-help) - ;; Also bound to "C-x p" and "C-x n" in transient-common-commands. - (define-key map (kbd "C-M-p") #'transient-history-prev) - (define-key map (kbd "C-M-n") #'transient-history-next) - map) - "Top-level keymap used by all transients. - -If you add a new command here, then you must also add a binding -to `transient-predicate-map'. Also see `transient-base-map'.") - -(defvar transient-edit-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map transient-base-map) - (define-key map (kbd "?") #'transient-help) - (define-key map (kbd "C-h") #'transient-help) - (define-key map (kbd "C-x l") #'transient-set-level) - map) - "Keymap that is active while a transient in is in \"edit mode\".") - -(defvar transient-sticky-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map transient-base-map) - (define-key map (kbd "C-g") #'transient-quit-seq) - map) - "Keymap that is active while an incomplete key sequence is active.") - -(defvar transient--common-command-prefixes '(?\C-x)) - -(put 'transient-common-commands - 'transient--layout - (cl-mapcan - (lambda (s) (transient--parse-child 'transient-common-commands s)) - `([:hide ,(lambda () - (and (not (memq (car (bound-and-true-p - transient--redisplay-key)) - transient--common-command-prefixes)) - (not transient-show-common-commands))) - ["Value commands" - ("C-x s " "Set" transient-set) - ("C-x C-s" "Save" transient-save) - ("C-x C-k" "Reset" transient-reset) - ("C-x p " "Previous value" transient-history-prev) - ("C-x n " "Next value" transient-history-next)] - ["Sticky commands" - ;; Like `transient-sticky-map' except that - ;; "C-g" has to be bound to a different command. - ("C-g" "Quit prefix or transient" transient-quit-one) - ("C-q" "Quit transient stack" transient-quit-all) - ("C-z" "Suspend transient stack" transient-suspend)] - ["Customize" - ("C-x t" transient-toggle-common - :description ,(lambda () - (if transient-show-common-commands - "Hide common commands" - "Show common permanently"))) - ("C-x l" "Show/hide suffixes" transient-set-level)]]))) - -(defvar transient-popup-navigation-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "") #'transient-noop) - (define-key map (kbd "") #'transient-backward-button) - (define-key map (kbd "") #'transient-forward-button) - (define-key map (kbd "C-r") #'transient-isearch-backward) - (define-key map (kbd "C-s") #'transient-isearch-forward) - (define-key map (kbd "M-RET") #'transient-push-button) - map) - "One of the keymaps used when popup navigation is enabled. -See `transient-enable-popup-navigation'.") - -(defvar transient-button-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "") #'transient-push-button) - (define-key map (kbd "") #'transient-push-button) - map) - "One of the keymaps used when popup navigation is enabled. -See `transient-enable-popup-navigation'.") - -(defvar transient-predicate-map - (let ((map (make-sparse-keymap))) - (define-key map [transient-suspend] #'transient--do-suspend) - (define-key map [transient-help] #'transient--do-stay) - (define-key map [transient-set-level] #'transient--do-stay) - (define-key map [transient-history-prev] #'transient--do-stay) - (define-key map [transient-history-next] #'transient--do-stay) - (define-key map [universal-argument] #'transient--do-stay) - (define-key map [negative-argument] #'transient--do-minus) - (define-key map [digit-argument] #'transient--do-stay) - (define-key map [transient-quit-all] #'transient--do-quit-all) - (define-key map [transient-quit-one] #'transient--do-quit-one) - (define-key map [transient-quit-seq] #'transient--do-stay) - (define-key map [transient-show] #'transient--do-stay) - (define-key map [transient-update] #'transient--do-stay) - (define-key map [transient-toggle-common] #'transient--do-stay) - (define-key map [transient-set] #'transient--do-call) - (define-key map [transient-save] #'transient--do-call) - (define-key map [transient-reset] #'transient--do-call) - (define-key map [describe-key-briefly] #'transient--do-stay) - (define-key map [describe-key] #'transient--do-stay) - (define-key map [transient-scroll-up] #'transient--do-stay) - (define-key map [transient-scroll-down] #'transient--do-stay) - (define-key map [mwheel-scroll] #'transient--do-stay) - (define-key map [scroll-bar-toolkit-scroll] #'transient--do-stay) - (define-key map [transient-noop] #'transient--do-noop) - (define-key map [transient-mouse-push-button] #'transient--do-move) - (define-key map [transient-push-button] #'transient--do-push-button) - (define-key map [transient-backward-button] #'transient--do-move) - (define-key map [transient-forward-button] #'transient--do-move) - (define-key map [transient-isearch-backward] #'transient--do-move) - (define-key map [transient-isearch-forward] #'transient--do-move) - ;; If a valid but incomplete prefix sequence is followed by - ;; an unbound key, then Emacs calls the `undefined' command - ;; but does not set `this-command', `this-original-command' - ;; or `real-this-command' accordingly. Instead they are nil. - (define-key map [nil] #'transient--do-warn) - map) - "Base keymap used to map common commands to their transient behavior. - -The \"transient behavior\" of a command controls, among other -things, whether invoking the command causes the transient to be -exited or not and whether infix arguments are exported before -doing so. - -Each \"key\" is a command that is common to all transients and -that is bound in `transient-map', `transient-edit-map', -`transient-sticky-map' and/or `transient-common-command'. - -Each binding is a \"pre-command\", a function that controls the -transient behavior of the respective command. - -For transient commands that are bound in individual transients, -the transient behavior is specified using the `:transient' slot -of the corresponding object.") - -(defvar transient--transient-map nil) -(defvar transient--predicate-map nil) -(defvar transient--redisplay-map nil) -(defvar transient--redisplay-key nil) - -(defun transient--push-keymap (var) - (let ((map (symbol-value var))) - (transient--debug " push %s%s" var (if map "" " VOID")) - (when map - (with-demoted-errors "transient--push-keymap: %S" - (internal-push-keymap map 'overriding-terminal-local-map))))) - -(defun transient--pop-keymap (var) - (let ((map (symbol-value var))) - (transient--debug " pop %s%s" var (if map "" " VOID")) - (when map - (with-demoted-errors "transient--pop-keymap: %S" - (internal-pop-keymap map 'overriding-terminal-local-map))))) - -(defun transient--make-transient-map () - (let ((map (make-sparse-keymap))) - (set-keymap-parent map (if transient--editp - transient-edit-map - transient-map)) - (dolist (obj transient--suffixes) - (let ((key (oref obj key))) - (when (vectorp key) - (setq key (key-description key)) - (oset obj key key)) - (when transient-substitute-key-function - (setq key (save-match-data - (funcall transient-substitute-key-function obj))) - (oset obj key key)) - (let ((kbd (kbd key)) - (cmd (transient--suffix-command obj))) - (when-let ((conflict (and transient-detect-key-conflicts - (transient--lookup-key map kbd)))) - (unless (eq cmd conflict) - (error "Cannot bind %S to %s and also %s" - (string-trim key) - cmd conflict))) - (define-key map kbd cmd)))) - (when-let ((b (lookup-key map "-"))) (define-key map [kp-subtract] b)) - (when-let ((b (lookup-key map "="))) (define-key map [kp-equal] b)) - (when-let ((b (lookup-key map "+"))) (define-key map [kp-add] b)) - (when transient-enable-popup-navigation - ;; `transient--make-redisplay-map' maps only over bindings that are - ;; directly in the base keymap, so that cannot be a composed keymap. - (set-keymap-parent - map (make-composed-keymap - (keymap-parent map) - transient-popup-navigation-map))) - map)) - -(defun transient--make-predicate-map () - (let ((map (make-sparse-keymap))) - (set-keymap-parent map transient-predicate-map) - (when (memq (oref transient--prefix transient-non-suffix) - '(nil transient--do-warn transient--do-noop)) - (define-key map [handle-switch-frame] #'transient--do-suspend)) - (dolist (obj transient--suffixes) - (let* ((cmd (oref obj command)) - (sub-prefix (and (symbolp cmd) (get cmd 'transient--prefix) t)) - (sym (transient--suffix-symbol cmd))) - (cond - ((oref obj inapt) - (define-key map (vector sym) #'transient--do-warn-inapt)) - ((slot-boundp obj 'transient) - (define-key map (vector sym) - (let ((do (oref obj transient))) - (pcase (list do sub-prefix) - ('(t t) #'transient--do-recurse) - ('(t nil) (if (cl-typep obj 'transient-infix) - #'transient--do-stay - #'transient--do-call)) - ('(nil t) #'transient--do-replace) - ('(nil nil) #'transient--do-exit) - (_ do))))) - ((not (lookup-key transient-predicate-map (vector sym))) - (define-key map (vector sym) - (if sub-prefix - #'transient--do-replace - (or (oref transient--prefix transient-suffix) - #'transient--do-exit))))))) - map)) - -(defun transient--make-redisplay-map () - (setq transient--redisplay-key - (cl-case this-command - (transient-update - (setq transient--showp t) - (setq unread-command-events - (listify-key-sequence (this-single-command-raw-keys)))) - (transient-quit-seq - (setq unread-command-events - (butlast (listify-key-sequence - (this-single-command-raw-keys)) - 2)) - (butlast transient--redisplay-key)) - (t nil))) - (let ((topmap (make-sparse-keymap)) - (submap (make-sparse-keymap))) - (when transient--redisplay-key - (define-key topmap (vconcat transient--redisplay-key) submap) - (set-keymap-parent submap transient-sticky-map)) - (map-keymap-internal - (lambda (key def) - (when (and (not (eq key ?\e)) - (listp def) - (keymapp def)) - (define-key topmap (vconcat transient--redisplay-key (list key)) - #'transient-update))) - (if transient--redisplay-key - (let ((key (vconcat transient--redisplay-key))) - (or (lookup-key transient--transient-map key) - (and-let* ((regular (lookup-key local-function-key-map key))) - (lookup-key transient--transient-map (vconcat regular))))) - transient--transient-map)) - topmap)) - -;;; Setup - -(defun transient-setup (&optional name layout edit &rest params) - "Setup the transient specified by NAME. - -This function is called by transient prefix commands to setup the -transient. In that case NAME is mandatory, LAYOUT and EDIT must -be nil and PARAMS may be (but usually is not) used to set e.g. the -\"scope\" of the transient (see `transient-define-prefix'). - -This function is also called internally in which case LAYOUT and -EDIT may be non-nil." - (transient--debug 'setup) - (transient--with-emergency-exit - (cond - ((not name) - ;; Switching between regular and edit mode. - (transient--pop-keymap 'transient--transient-map) - (transient--pop-keymap 'transient--redisplay-map) - (setq name (oref transient--prefix command)) - (setq params (list :scope (oref transient--prefix scope)))) - (transient--prefix - ;; Invoked as a ":transient-non-suffix 'transient--do-{stay,call}" - ;; of an outer prefix. Unlike the usual `transient--do-replace', - ;; these predicates fail to clean up after the outer prefix. - (transient--pop-keymap 'transient--transient-map) - (transient--pop-keymap 'transient--redisplay-map)) - ((not (or layout ; resuming parent/suspended prefix - transient-current-command)) ; entering child prefix - (transient--stack-zap)) ; replace suspended prefix, if any - (edit - ;; Returning from help to edit. - (setq transient--editp t))) - (transient--init-objects name layout params) - (transient--history-init transient--prefix) - (setq transient--predicate-map (transient--make-predicate-map)) - (setq transient--transient-map (transient--make-transient-map)) - (setq transient--redisplay-map (transient--make-redisplay-map)) - (setq transient--original-window (selected-window)) - (setq transient--original-buffer (current-buffer)) - (setq transient--minibuffer-depth (minibuffer-depth)) - (transient--redisplay) - (transient--init-transient) - (transient--suspend-which-key-mode))) - -(cl-defgeneric transient-setup-children (group children) - "Setup the CHILDREN of GROUP. -If the value of the `setup-children' slot is non-nil, then call -that function with CHILDREN as the only argument and return the -value. Otherwise return CHILDREN as is." - (if (slot-boundp group 'setup-children) - (funcall (oref group setup-children) children) - children)) - -(defun transient--init-objects (name layout params) - (setq transient--prefix (transient--init-prefix name params)) - (setq transient--layout (or layout (transient--init-suffixes name))) - (setq transient--suffixes (transient--flatten-suffixes transient--layout))) - -(defun transient--init-prefix (name &optional params) - (let ((obj (let ((proto (get name 'transient--prefix))) - (apply #'clone proto - :prototype proto - :level (or (alist-get t (alist-get name transient-levels)) - transient-default-level) - params)))) - (transient--setup-recursion obj) - (transient-init-value obj) - obj)) - -(defun transient--init-suffixes (name) - (let ((levels (alist-get name transient-levels))) - (cl-mapcan (lambda (c) (transient--init-child levels c)) - (append (get name 'transient--layout) - (and (not transient--editp) - (get 'transient-common-commands - 'transient--layout)))))) - -(defun transient--flatten-suffixes (layout) - (cl-labels ((s (def) - (cond - ((stringp def) nil) - ((listp def) (cl-mapcan #'s def)) - ((transient-group--eieio-childp def) - (cl-mapcan #'s (oref def suffixes))) - ((transient-suffix--eieio-childp def) - (list def))))) - (cl-mapcan #'s layout))) - -(defun transient--init-child (levels spec) - (cl-etypecase spec - (vector (transient--init-group levels spec)) - (list (transient--init-suffix levels spec)) - (string (list spec)))) - -(defun transient--init-group (levels spec) - (pcase-let ((`(,level ,class ,args ,children) (append spec nil))) - (when-let* ((- (transient--use-level-p level)) - (obj (apply class :level level args)) - (- (transient--use-suffix-p obj)) - (suffixes (cl-mapcan (lambda (c) (transient--init-child levels c)) - (transient-setup-children obj children)))) - ;; Cannot use and-let* because of debbugs#31840. - (oset obj suffixes suffixes) - (list obj)))) - -(defun transient--init-suffix (levels spec) - (pcase-let* ((`(,level ,class ,args) spec) - (cmd (plist-get args :command)) - (level (or (alist-get (transient--suffix-symbol cmd) levels) - level))) - (let ((fn (and (symbolp cmd) - (symbol-function cmd)))) - (when (autoloadp fn) - (transient--debug " autoload %s" cmd) - (autoload-do-load fn))) - (when (transient--use-level-p level) - (let ((obj (if-let ((proto (and cmd - (symbolp cmd) - (get cmd 'transient--suffix)))) - (apply #'clone proto :level level args) - (apply class :level level args)))) - (transient--init-suffix-key obj) - (transient--ensure-infix-command obj) - (when (transient--use-suffix-p obj) - (if (transient--inapt-suffix-p obj) - (oset obj inapt t) - (transient-init-scope obj) - (transient-init-value obj)) - (list obj)))))) - -(cl-defmethod transient--init-suffix-key ((obj transient-suffix)) - (unless (slot-boundp obj 'key) - (error "No key for %s" (oref obj command)))) - -(cl-defmethod transient--init-suffix-key ((obj transient-argument)) - (if (transient-switches--eieio-childp obj) - (cl-call-next-method obj) - (unless (slot-boundp obj 'shortarg) - (when-let ((shortarg (transient--derive-shortarg (oref obj argument)))) - (oset obj shortarg shortarg))) - (unless (slot-boundp obj 'key) - (if (slot-boundp obj 'shortarg) - (oset obj key (oref obj shortarg)) - (error "No key for %s" (oref obj command)))))) - -(defun transient--use-level-p (level &optional edit) - (or (and transient--editp (not edit)) - (and (>= level 1) - (<= level (oref transient--prefix level))))) - -(defun transient--use-suffix-p (obj) - (transient--do-suffix-p - (oref obj if) - (oref obj if-not) - (oref obj if-nil) - (oref obj if-non-nil) - (oref obj if-mode) - (oref obj if-not-mode) - (oref obj if-derived) - (oref obj if-not-derived) - t)) - -(defun transient--inapt-suffix-p (obj) - (transient--do-suffix-p - (oref obj inapt-if) - (oref obj inapt-if-not) - (oref obj inapt-if-nil) - (oref obj inapt-if-non-nil) - (oref obj inapt-if-mode) - (oref obj inapt-if-not-mode) - (oref obj inapt-if-derived) - (oref obj inapt-if-not-derived) - nil)) - -(defun transient--do-suffix-p - (if if-not if-nil if-non-nil if-mode if-not-mode if-derived if-not-derived - default) - (cond - (if (funcall if)) - (if-not (not (funcall if-not))) - (if-non-nil (symbol-value if-non-nil)) - (if-nil (not (symbol-value if-nil))) - (if-mode (if (atom if-mode) - (eq major-mode if-mode) - (memq major-mode if-mode))) - (if-not-mode (not (if (atom if-not-mode) - (eq major-mode if-not-mode) - (memq major-mode if-not-mode)))) - (if-derived (if (atom if-derived) - (derived-mode-p if-derived) - (apply #'derived-mode-p if-derived))) - (if-not-derived (not (if (atom if-not-derived) - (derived-mode-p if-not-derived) - (apply #'derived-mode-p if-not-derived)))) - (t default))) - -(defun transient--suffix-predicate (spec) - (let ((plist (nth 2 spec))) - (seq-some (lambda (prop) - (and-let* ((pred (plist-get plist prop))) - (list prop pred))) - '( :if :if-not - :if-nil :if-non-nil - :if-mode :if-not-mode - :if-derived :if-not-derived - :inapt-if :inapt-if-not - :inapt-if-nil :inapt-if-non-nil - :inapt-if-mode :inapt-if-not-mode - :inapt-if-derived :inapt-if-not-derived)))) - -;;; Flow-Control - -(defun transient--init-transient () - (transient--debug 'init-transient) - (transient--push-keymap 'transient--transient-map) - (transient--push-keymap 'transient--redisplay-map) - (add-hook 'pre-command-hook #'transient--pre-command) - (add-hook 'post-command-hook #'transient--post-command) - (when transient--exitp - ;; This prefix command was invoked as the suffix of another. - ;; Prevent `transient--post-command' from removing the hooks - ;; that we just added. - (setq transient--exitp 'replace))) - -(defun transient--pre-command () - (transient--debug 'pre-command) - (transient--with-emergency-exit - ;; The use of `overriding-terminal-local-map' does not prevent the - ;; lookup of command remappings in the overridden maps, which can - ;; lead to a suffix being remapped to a non-suffix. We have to undo - ;; the remapping in that case. However, remapping a non-suffix to - ;; another should remain possible. - (when (and (transient--get-predicate-for this-original-command 'suffix) - (not (transient--get-predicate-for this-command 'suffix))) - (setq this-command this-original-command)) - (cond - ((memq this-command '(transient-update transient-quit-seq)) - (transient--pop-keymap 'transient--redisplay-map)) - ((and transient--helpp - (not (memq this-command '(transient-quit-one - transient-quit-all)))) - (cond - ((transient-help) - (transient--do-suspend) - (setq this-command 'transient-suspend) - (transient--pre-exit)) - ((not (transient--edebug-command-p)) - (setq this-command 'transient-undefined)))) - ((and transient--editp - (transient-suffix-object) - (not (memq this-command '(transient-quit-one - transient-quit-all - transient-help)))) - (setq this-command 'transient-set-level)) - (t - (setq transient--exitp nil) - (when (eq (transient--do-pre-command) transient--exit) - (transient--pre-exit)))))) - -(defun transient--do-pre-command () - (if-let ((fn (transient--get-predicate-for this-command))) - (let ((action (funcall fn))) - (when (eq action transient--exit) - (setq transient--exitp (or transient--exitp t))) - action) - (if (let ((keys (this-command-keys-vector))) - (eq (aref keys (1- (length keys))) ?\C-g)) - (setq this-command 'transient-noop) - (unless (transient--edebug-command-p) - (setq this-command 'transient-undefined))) - transient--stay)) - -(defun transient--get-predicate-for (cmd &optional suffix-only) - (or (ignore-errors - (lookup-key transient--predicate-map - (vector (transient--suffix-symbol cmd)))) - (and (not suffix-only) - (let ((pred (oref transient--prefix transient-non-suffix))) - (pcase pred - ('t #'transient--do-stay) - ('nil #'transient--do-warn) - (_ pred)))))) - -(defun transient--pre-exit () - (transient--debug 'pre-exit) - (transient--delete-window) - (transient--timer-cancel) - (transient--pop-keymap 'transient--transient-map) - (transient--pop-keymap 'transient--redisplay-map) - (unless transient--showp - (let ((message-log-max nil)) - (message ""))) - (setq transient--transient-map nil) - (setq transient--predicate-map nil) - (setq transient--redisplay-map nil) - (setq transient--redisplay-key nil) - (setq transient--helpp nil) - (setq transient--editp nil) - (setq transient--prefix nil) - (setq transient--layout nil) - (setq transient--suffixes nil) - (setq transient--original-window nil) - (setq transient--original-buffer nil) - (setq transient--window nil)) - -(defun transient--delete-window () - (when (window-live-p transient--window) - (let ((remain-in-minibuffer-window - (and (minibuffer-selected-window) - (selected-window))) - (buf (window-buffer transient--window))) - ;; Only delete the window if it never showed another buffer. - (unless (eq (car (window-parameter transient--window 'quit-restore)) 'other) - (with-demoted-errors "Error while exiting transient: %S" - (delete-window transient--window))) - (kill-buffer buf) - (when remain-in-minibuffer-window - (select-window remain-in-minibuffer-window))))) - -(defun transient--export () - (setq transient-current-prefix transient--prefix) - (setq transient-current-command (oref transient--prefix command)) - (setq transient-current-suffixes transient--suffixes) - (transient--history-push transient--prefix)) - -(defun transient--suspend-override (&optional nohide) - (transient--debug 'suspend-override) - (transient--timer-cancel) - (cond ((and (not nohide) transient-hide-during-minibuffer-read) - (transient--delete-window)) - ((and transient--prefix transient--redisplay-key) - (setq transient--redisplay-key nil) - (when transient--showp - (transient--show)))) - (transient--pop-keymap 'transient--transient-map) - (transient--pop-keymap 'transient--redisplay-map) - (remove-hook 'pre-command-hook #'transient--pre-command) - (remove-hook 'post-command-hook #'transient--post-command)) - -(defun transient--resume-override () - (transient--debug 'resume-override) - (when (and transient--showp transient-hide-during-minibuffer-read) - (transient--show)) - (transient--push-keymap 'transient--transient-map) - (transient--push-keymap 'transient--redisplay-map) - (add-hook 'pre-command-hook #'transient--pre-command) - (add-hook 'post-command-hook #'transient--post-command)) - -(defmacro transient--with-suspended-override (&rest body) - (let ((depth (make-symbol "depth")) - (setup (make-symbol "setup")) - (exit (make-symbol "exit"))) - `(if (and transient--transient-map - (memq transient--transient-map - overriding-terminal-local-map)) - (let ((,depth (1+ (minibuffer-depth))) ,setup ,exit) - (setq ,setup - (lambda () "@transient--with-suspended-override" - (transient--debug 'minibuffer-setup) - (remove-hook 'minibuffer-setup-hook ,setup) - (transient--suspend-override))) - (setq ,exit - (lambda () "@transient--with-suspended-override" - (transient--debug 'minibuffer-exit) - (when (= (minibuffer-depth) ,depth) - (transient--resume-override)))) - (unwind-protect - (progn - (add-hook 'minibuffer-setup-hook ,setup) - (add-hook 'minibuffer-exit-hook ,exit) - ,@body) - (remove-hook 'minibuffer-setup-hook ,setup) - (remove-hook 'minibuffer-exit-hook ,exit))) - ,@body))) - -(defun transient--post-command-hook () - (run-hooks 'transient--post-command-hook)) - -(add-hook 'post-command-hook #'transient--post-command-hook) - -(defun transient--delay-post-command (&optional abort-only) - (transient--debug 'delay-post-command) - (let ((depth (minibuffer-depth)) - (command this-command) - (delayed (if transient--exitp - (apply-partially #'transient--post-exit this-command) - #'transient--resume-override)) - post-command abort-minibuffer) - (unless abort-only - (setq post-command - (lambda () "@transient--delay-post-command" - (let ((act (and (not (eq (this-command-keys-vector) [])) - (or (eq this-command command) - ;; `execute-extended-command' was - ;; used to call another command - ;; that also uses the minibuffer. - (equal - (string-to-multibyte (this-command-keys)) - (format "\M-x%s\r" this-command)))))) - (transient--debug 'post-command-hook "act: %s" act) - (when act - (remove-hook 'transient--post-command-hook post-command) - (remove-hook 'minibuffer-exit-hook abort-minibuffer) - (funcall delayed))))) - (add-hook 'transient--post-command-hook post-command)) - (setq abort-minibuffer - (lambda () "@transient--delay-post-command" - (let ((act (and (or (memq this-command transient--abort-commands) - (equal (this-command-keys) "")) - (= (minibuffer-depth) depth)))) - (transient--debug - 'abort-minibuffer - "mini: %s|%s, act %s" (minibuffer-depth) depth act) - (when act - (remove-hook 'transient--post-command-hook post-command) - (remove-hook 'minibuffer-exit-hook abort-minibuffer) - (funcall delayed))))) - (add-hook 'minibuffer-exit-hook abort-minibuffer))) - -(defun transient--post-command () - (transient--debug 'post-command) - (transient--with-emergency-exit - (cond - ((and (eq (this-command-keys-vector) []) - (= (minibuffer-depth) - (1+ transient--minibuffer-depth))) - (transient--suspend-override) - (transient--delay-post-command (eq transient--exitp 'replace))) - (transient--exitp - (transient--post-exit)) - ((eq this-command (oref transient--prefix command))) - (t - (let ((old transient--redisplay-map) - (new (transient--make-redisplay-map))) - (unless (equal old new) - (transient--pop-keymap 'transient--redisplay-map) - (setq transient--redisplay-map new) - (transient--push-keymap 'transient--redisplay-map))) - (transient--redisplay))))) - -(defun transient--post-exit (&optional command) - (transient--debug 'post-exit) - (unless (and (eq transient--exitp 'replace) - (or transient--prefix - ;; The current command could act as a prefix, - ;; but decided not to call `transient-setup', - ;; or it is prevented from doing so because it - ;; uses the minibuffer and the user aborted - ;; that. - (prog1 nil - (if (let ((obj (transient-suffix-object command))) - (and (slot-boundp obj 'transient) - (oref obj transient))) - ;; This sub-prefix is a transient suffix; - ;; go back to outer prefix, by calling - ;; `transient--stack-pop' further down. - (setq transient--exitp nil) - (transient--stack-zap))))) - (remove-hook 'pre-command-hook #'transient--pre-command) - (remove-hook 'post-command-hook #'transient--post-command)) - (setq transient-current-prefix nil) - (setq transient-current-command nil) - (setq transient-current-suffixes nil) - (let ((resume (and transient--stack - (not (memq transient--exitp '(replace suspend)))))) - (unless (or resume (eq transient--exitp 'replace)) - (setq transient--showp nil)) - (setq transient--exitp nil) - (setq transient--helpp nil) - (setq transient--editp nil) - (setq transient--minibuffer-depth 0) - (run-hooks 'transient-exit-hook) - (when resume - (transient--stack-pop)))) - -(defun transient--stack-push () - (transient--debug 'stack-push) - (push (list (oref transient--prefix command) - transient--layout - transient--editp - :scope (oref transient--prefix scope)) - transient--stack)) - -(defun transient--stack-pop () - (transient--debug 'stack-pop) - (and transient--stack - (prog1 t (apply #'transient-setup (pop transient--stack))))) - -(defun transient--stack-zap () - (transient--debug 'stack-zap) - (setq transient--stack nil)) - -(defun transient--redisplay () - (if (or (eq transient-show-popup t) - transient--showp) - (unless - (or (memq this-command transient--scroll-commands) - (and (or (memq this-command '(mouse-drag-region - mouse-set-region)) - (equal (key-description (this-command-keys-vector)) - "")) - (and (eq (current-buffer) - (get-buffer transient--buffer-name))))) - (transient--show)) - (when (and (numberp transient-show-popup) - (not (zerop transient-show-popup)) - (not transient--timer)) - (transient--timer-start)) - (transient--show-brief))) - -(defun transient--timer-start () - (setq transient--timer - (run-at-time (abs transient-show-popup) nil - (lambda () - (transient--timer-cancel) - (transient--show) - (let ((message-log-max nil)) - (message "")))))) - -(defun transient--timer-cancel () - (when transient--timer - (cancel-timer transient--timer) - (setq transient--timer nil))) - -(defun transient--debug (arg &rest args) - (when transient--debug - (let ((inhibit-message (not (eq transient--debug 'message)))) - (if (symbolp arg) - (message "-- %-18s (cmd: %s, event: %S, exit: %s%s)" - arg - (or (ignore-errors (transient--suffix-symbol this-command)) - (if (byte-code-function-p this-command) - "#[...]" - this-command)) - (key-description (this-command-keys-vector)) - transient--exitp - (cond ((stringp (car args)) - (concat ", " (apply #'format args))) - (args - (concat ", " (apply (car args) (cdr args)))) - (t ""))) - (apply #'message arg args))))) - -(defun transient--emergency-exit () - "Exit the current transient command after an error occurred. -When no transient is active (i.e. when `transient--prefix' is -nil) then do nothing." - (transient--debug 'emergency-exit) - (when transient--prefix - (setq transient--stack nil) - (setq transient--exitp t) - (transient--pre-exit) - (transient--post-exit))) - -;;; Pre-Commands - -(defun transient--do-stay () - "Call the command without exporting variables and stay transient." - transient--stay) - -(defun transient--do-noop () - "Call `transient-noop' and stay transient." - (setq this-command 'transient-noop) - transient--stay) - -(defun transient--do-warn () - "Call `transient-undefined' and stay transient." - (setq this-command 'transient-undefined) - transient--stay) - -(defun transient--do-warn-inapt () - "Call `transient-inapt' and stay transient." - (setq this-command 'transient-inapt) - transient--stay) - -(defun transient--do-call () - "Call the command after exporting variables and stay transient." - (transient--export) - transient--stay) - -(defun transient--do-return () - "Call the command after exporting variables and return to parent prefix. -If there is no parent prefix, then behave like `transient--do-exit'." - (if (not transient--stack) - (transient--do-exit) - (transient--export) - transient--exit)) - -(defun transient--do-exit () - "Call the command after exporting variables and exit the transient." - (transient--export) - (transient--stack-zap) - transient--exit) - -(defun transient--do-push-button () - "Call the command represented by the activated button. -Use that command's pre-command to determine transient behavior." - (if (and (mouse-event-p last-command-event) - (not (eq (posn-window (event-start last-command-event)) - transient--window))) - transient--stay - (setq this-command - (with-selected-window transient--window - (get-text-property (if (mouse-event-p last-command-event) - (posn-point (event-start last-command-event)) - (point)) - 'command))) - (transient--do-pre-command))) - -(defun transient--do-recurse () - "Call the transient prefix command, preparing for return to active transient. -If there is no parent prefix, then just call the command." - (transient--do-replace)) - -(defun transient--setup-recursion (prefix-obj) - (when transient--stack - (let ((command (oref prefix-obj command))) - (when-let ((suffix-obj (transient-suffix-object command))) - (when (and (slot-boundp suffix-obj 'transient) - (memq (oref suffix-obj transient) - (list t #'transient--do-recurse))) - (oset prefix-obj transient-suffix 'transient--do-return)))))) - -(defun transient--do-replace () - "Call the transient prefix command, replacing the active transient." - (transient--export) - (transient--stack-push) - (setq transient--exitp 'replace) - transient--exit) - -(defun transient--do-suspend () - "Suspend the active transient, saving the transient stack." - (transient--stack-push) - (setq transient--exitp 'suspend) - transient--exit) - -(defun transient--do-quit-one () - "If active, quit help or edit mode, else exit the active transient." - (cond (transient--helpp - (setq transient--helpp nil) - transient--stay) - (transient--editp - (setq transient--editp nil) - (transient-setup) - transient--stay) - (t transient--exit))) - -(defun transient--do-quit-all () - "Exit all transients without saving the transient stack." - (transient--stack-zap) - transient--exit) - -(defun transient--do-move () - "Call the command if `transient-enable-popup-navigation' is non-nil. -In that case behave like `transient--do-stay', otherwise similar -to `transient--do-warn'." - (unless transient-enable-popup-navigation - (setq this-command 'transient-popup-navigation-help)) - transient--stay) - -(defun transient--do-minus () - "Call `negative-argument' or pivot to `transient-update'. -If `negative-argument' is invoked using \"-\" then preserve the -prefix argument and pivot to `transient-update'." - (when (equal (this-command-keys) "-") - (setq this-command 'transient-update)) - transient--stay) - -(put 'transient--do-stay 'transient-color 'transient-red) -(put 'transient--do-noop 'transient-color 'transient-red) -(put 'transient--do-warn 'transient-color 'transient-red) -(put 'transient--do-warn-inapt 'transient-color 'transient-red) -(put 'transient--do-call 'transient-color 'transient-red) -(put 'transient--do-return 'transient-color 'transient-purple) -(put 'transient--do-exit 'transient-color 'transient-blue) -(put 'transient--do-recurse 'transient-color 'transient-red) -(put 'transient--do-replace 'transient-color 'transient-blue) -(put 'transient--do-suspend 'transient-color 'transient-blue) -(put 'transient--do-quit-one 'transient-color 'transient-blue) -(put 'transient--do-quit-all 'transient-color 'transient-blue) -(put 'transient--do-move 'transient-color 'transient-red) -(put 'transient--do-minus 'transient-color 'transient-red) - -;;; Commands - -(defun transient-noop () - "Do nothing at all." - (interactive)) - -(defun transient-undefined () - "Warn the user that the pressed key is not bound to any suffix." - (interactive) - (transient--invalid "Unbound suffix")) - -(defun transient-inapt () - "Warn the user that the invoked command is inapt." - (interactive) - (transient--invalid "Inapt command")) - -(defun transient--invalid (msg) - (ding) - (message "%s: `%s' (Use `%s' to abort, `%s' for help) [%s]" - msg - (propertize (key-description (this-single-command-keys)) - 'face 'font-lock-warning-face) - (propertize "C-g" 'face 'transient-key) - (propertize "?" 'face 'transient-key) - ;; `this-command' is `transient--undefined' or similar at this - ;; point. Show the command the user actually tried to invoke. - (propertize (symbol-name (transient--suffix-symbol - this-original-command)) - 'face 'font-lock-warning-face)) - (unless (and transient--transient-map - (memq transient--transient-map overriding-terminal-local-map)) - (let ((transient--prefix (or transient--prefix 'sic))) - (transient--emergency-exit)) - (view-lossage) - (other-window 1) - (display-warning 'transient "Inconsistent transient state detected. -This should never happen. -Please open an issue and post the shown command log. -This is a heisenbug, so any additional details might help. -Thanks!" :error))) - -(defun transient-toggle-common () - "Toggle whether common commands are always shown." - (interactive) - (setq transient-show-common-commands (not transient-show-common-commands))) - -(defun transient-suspend () - "Suspend the current transient. -It can later be resumed using `transient-resume' while no other -transient is active." - (interactive)) - -(defun transient-quit-all () - "Exit all transients without saving the transient stack." - (interactive)) - -(defun transient-quit-one () - "Exit the current transients, possibly returning to the previous." - (interactive)) - -(defun transient-quit-seq () - "Abort the current incomplete key sequence." - (interactive)) - -(defun transient-update () - "Redraw the transient's state in the popup buffer." - (interactive) - (when (equal this-original-command 'negative-argument) - (setq prefix-arg current-prefix-arg))) - -(defun transient-show () - "Show the transient's state in the popup buffer." - (interactive) - (setq transient--showp t)) - -(defvar-local transient--restore-winconf nil) - -(defvar transient-resume-mode) - -(defun transient-help () - "Show help for the active transient or one of its suffixes." - (interactive) - (if (called-interactively-p 'any) - (setq transient--helpp t) - (with-demoted-errors "transient-help: %S" - (when (lookup-key transient--transient-map - (this-single-command-raw-keys)) - (setq transient--helpp nil) - (let ((winconf (current-window-configuration))) - (transient-show-help - (if (eq this-original-command 'transient-help) - transient--prefix - (or (transient-suffix-object) - this-original-command))) - (setq transient--restore-winconf winconf)) - (fit-window-to-buffer nil (frame-height) (window-height)) - (transient-resume-mode) - (message "Type \"q\" to resume transient command.") - t)))) - -(defun transient-set-level (&optional command level) - "Set the level of the transient or one of its suffix commands." - (interactive - (let ((command this-original-command) - (prefix (oref transient--prefix command))) - (and (or (not (eq command 'transient-set-level)) - (and transient--editp - (setq command prefix))) - (list command - (let ((keys (this-single-command-raw-keys))) - (and (lookup-key transient--transient-map keys) - (string-to-number - (let ((transient--active-infix - (transient-suffix-object command))) - (transient--show) - (transient--read-number-N - (format "Set level for `%s': " - (transient--suffix-symbol command)) - nil nil (not (eq command prefix))))))))))) - (cond - ((not command) - (setq transient--editp t) - (transient-setup)) - (level - (let* ((prefix (oref transient--prefix command)) - (alist (alist-get prefix transient-levels)) - (sym (transient--suffix-symbol command))) - (if (eq command prefix) - (progn (oset transient--prefix level level) - (setq sym t)) - (oset (transient-suffix-object command) level level)) - (setf (alist-get sym alist) level) - (setf (alist-get prefix transient-levels) alist)) - (transient-save-levels) - (transient--show)) - (t - (transient-undefined)))) - -(defun transient-set () - "Save the value of the active transient for this Emacs session." - (interactive) - (transient-set-value (or transient--prefix transient-current-prefix))) - -(defun transient-save () - "Save the value of the active transient persistenly across Emacs sessions." - (interactive) - (transient-save-value (or transient--prefix transient-current-prefix))) - -(defun transient-reset () - "Clear the set and saved values of the active transient." - (interactive) - (transient-reset-value (or transient--prefix transient-current-prefix))) - -(defun transient-history-next () - "Switch to the next value used for the active transient." - (interactive) - (let* ((obj transient--prefix) - (pos (1- (oref obj history-pos))) - (hst (oref obj history))) - (if (< pos 0) - (user-error "End of history") - (oset obj history-pos pos) - (oset obj value (nth pos hst)) - (mapc #'transient-init-value transient--suffixes)))) - -(defun transient-history-prev () - "Switch to the previous value used for the active transient." - (interactive) - (let* ((obj transient--prefix) - (pos (1+ (oref obj history-pos))) - (hst (oref obj history)) - (len (length hst))) - (if (> pos (1- len)) - (user-error "End of history") - (oset obj history-pos pos) - (oset obj value (nth pos hst)) - (mapc #'transient-init-value transient--suffixes)))) - -(defun transient-scroll-up (&optional arg) - "Scroll text of transient popup window upward ARG lines. -If ARG is nil scroll near full screen. This is a wrapper -around `scroll-up-command' (which see)." - (interactive "^P") - (with-selected-window transient--window - (scroll-up-command arg))) - -(defun transient-scroll-down (&optional arg) - "Scroll text of transient popup window down ARG lines. -If ARG is nil scroll near full screen. This is a wrapper -around `scroll-down-command' (which see)." - (interactive "^P") - (with-selected-window transient--window - (scroll-down-command arg))) - -(defun transient-push-button () - "Invoke the suffix command represented by this button." - (interactive)) - -(defun transient-resume () - "Resume a previously suspended stack of transients." - (interactive) - (cond (transient--stack - (let ((winconf transient--restore-winconf)) - (kill-local-variable 'transient--restore-winconf) - (when transient-resume-mode - (transient-resume-mode -1) - (quit-window)) - (when winconf - (set-window-configuration winconf))) - (transient--stack-pop)) - (transient-resume-mode - (kill-local-variable 'transient--restore-winconf) - (transient-resume-mode -1) - (quit-window)) - (t - (message "No suspended transient command")))) - -;;; Value -;;;; Init - -(cl-defgeneric transient-init-scope (obj) - "Set the scope of the suffix object OBJ. - -The scope is actually a property of the transient prefix, not of -individual suffixes. However it is possible to invoke a suffix -command directly instead of from a transient. In that case, if -the suffix expects a scope, then it has to determine that itself -and store it in its `scope' slot. - -This function is called for all suffix commands, but unless a -concrete method is implemented this falls through to the default -implementation, which is a noop.") - -(cl-defmethod transient-init-scope ((_ transient-suffix)) - "Noop." nil) - -(cl-defgeneric transient-init-value (_) - "Set the initial value of the object OBJ. - -This function is called for all prefix and suffix commands. - -For suffix commands (including infix argument commands) the -default implementation is a noop. Classes derived from the -abstract `transient-infix' class must implement this function. -Non-infix suffix commands usually don't have a value." - nil) - -(cl-defmethod transient-init-value :around ((obj transient-prefix)) - "If bound, then call OBJ's `init-value' function. -Otherwise call the primary method according to object's class." - (if (slot-boundp obj 'init-value) - (funcall (oref obj init-value) obj) - (cl-call-next-method obj))) - -(cl-defmethod transient-init-value :around ((obj transient-infix)) - "If bound, then call OBJ's `init-value' function. -Otherwise call the primary method according to object's class." - (if (slot-boundp obj 'init-value) - (funcall (oref obj init-value) obj) - (cl-call-next-method obj))) - -(cl-defmethod transient-init-value ((obj transient-prefix)) - (if (slot-boundp obj 'value) - (oref obj value) - (oset obj value - (if-let ((saved (assq (oref obj command) transient-values))) - (cdr saved) - (transient-default-value obj))))) - -(cl-defmethod transient-init-value ((obj transient-argument)) - (oset obj value - (let ((value (oref transient--prefix value)) - (argument (and (slot-boundp obj 'argument) - (oref obj argument))) - (multi-value (oref obj multi-value)) - (case-fold-search nil) - (regexp (if (slot-exists-p obj 'argument-regexp) - (oref obj argument-regexp) - (format "\\`%s\\(.*\\)" (oref obj argument))))) - (if (memq multi-value '(t rest)) - (cdr (assoc argument value)) - (let ((match (lambda (v) - (and (stringp v) - (string-match regexp v) - (match-string 1 v))))) - (if multi-value - (delq nil (mapcar match value)) - (cl-some match value))))))) - -(cl-defmethod transient-init-value ((obj transient-switch)) - (oset obj value - (car (member (oref obj argument) - (oref transient--prefix value))))) - -;;;; Default - -(cl-defgeneric transient-default-value (_) - "Return the default value." - nil) - -(cl-defmethod transient-default-value ((obj transient-prefix)) - (if-let ((default (and (slot-boundp obj 'default-value) - (oref obj default-value)))) - (if (functionp default) - (funcall default) - default) - nil)) - -;;;; Read - -(cl-defgeneric transient-infix-read (obj) - "Determine the new value of the infix object OBJ. - -This function merely determines the value; `transient-infix-set' -is used to actually store the new value in the object. - -For most infix classes this is done by reading a value from the -user using the reader specified by the `reader' slot (using the -`transient-infix' method described below). - -For some infix classes the value is changed without reading -anything in the minibuffer, i.e. the mere act of invoking the -infix command determines what the new value should be, based -on the previous value.") - -(cl-defmethod transient-infix-read :around ((obj transient-infix)) - "Highlight the infix in the popup buffer. - -This also wraps the call to `cl-call-next-method' with two -macros. - -`transient--with-suspended-override' is necessary to allow -reading user input using the minibuffer. - -`transient--with-emergency-exit' arranges for the transient to -be exited in case of an error because otherwise Emacs would get -stuck in an inconsistent state, which might make it necessary to -kill it from the outside. - -If you replace this method, then you must make sure to always use -the latter macro and most likely also the former." - (let ((transient--active-infix obj)) - (transient--show)) - (transient--with-emergency-exit - (transient--with-suspended-override - (cl-call-next-method obj)))) - -(cl-defmethod transient-infix-read ((obj transient-infix)) - "Read a value while taking care of history. - -This method is suitable for a wide variety of infix commands, -including but not limited to inline arguments and variables. - -If you do not use this method for your own infix class, then -you should likely replicate a lot of the behavior of this -method. If you fail to do so, then users might not appreciate -the lack of history, for example. - -Only for very simple classes that toggle or cycle through a very -limited number of possible values should you replace this with a -simple method that does not handle history. (E.g. for a command -line switch the only possible values are \"use it\" and \"don't use -it\", in which case it is pointless to preserve history.)" - (with-slots (value multi-value always-read allow-empty choices) obj - (if (and value - (not multi-value) - (not always-read) - transient--prefix) - (oset obj value nil) - (let* ((enable-recursive-minibuffers t) - (reader (oref obj reader)) - (prompt (transient-prompt obj)) - (value (if multi-value (mapconcat #'identity value ",") value)) - (history-key (or (oref obj history-key) - (oref obj command))) - (transient--history (alist-get history-key transient-history)) - (transient--history (if (or (null value) - (eq value (car transient--history))) - transient--history - (cons value transient--history))) - (initial-input (and transient-read-with-initial-input - (car transient--history))) - (history (if initial-input - (cons 'transient--history 1) - 'transient--history)) - (value - (cond - (reader (funcall reader prompt initial-input history)) - (multi-value - (completing-read-multiple prompt choices nil nil - initial-input history)) - (choices - (completing-read prompt choices nil t initial-input history)) - (t (read-string prompt initial-input history))))) - (cond ((and (equal value "") (not allow-empty)) - (setq value nil)) - ((and (equal value "\"\"") allow-empty) - (setq value ""))) - (when value - (when (and (bound-and-true-p ivy-mode) - (stringp (car transient--history))) - (set-text-properties 0 (length (car transient--history)) nil - (car transient--history))) - (setf (alist-get history-key transient-history) - (delete-dups transient--history))) - value)))) - -(cl-defmethod transient-infix-read ((obj transient-switch)) - "Toggle the switch on or off." - (if (oref obj value) nil (oref obj argument))) - -(cl-defmethod transient-infix-read ((obj transient-switches)) - "Cycle through the mutually exclusive switches. -The last value is \"don't use any of these switches\"." - (let ((choices (mapcar (apply-partially #'format (oref obj argument-format)) - (oref obj choices)))) - (if-let ((value (oref obj value))) - (cadr (member value choices)) - (car choices)))) - -(cl-defmethod transient-infix-read ((command symbol)) - "Elsewhere use the reader of the infix command COMMAND. -Use this if you want to share an infix's history with a regular -stand-alone command." - (cl-letf (((symbol-function #'transient--show) #'ignore)) - (transient-infix-read (get command 'transient--suffix)))) - -;;;; Readers - -(defun transient-read-file (prompt _initial-input _history) - "Read a file." - (file-local-name (expand-file-name (read-file-name prompt)))) - -(defun transient-read-existing-file (prompt _initial-input _history) - "Read an existing file." - (file-local-name (expand-file-name (read-file-name prompt nil nil t)))) - -(defun transient-read-directory (prompt _initial-input _history) - "Read a directory." - (file-local-name (expand-file-name (read-directory-name prompt)))) - -(defun transient-read-existing-directory (prompt _initial-input _history) - "Read an existing directory." - (file-local-name (expand-file-name (read-directory-name prompt nil nil t)))) - -(defun transient-read-number-N0 (prompt initial-input history) - "Read a natural number (including zero) and return it as a string." - (transient--read-number-N prompt initial-input history t)) - -(defun transient-read-number-N+ (prompt initial-input history) - "Read a natural number (excluding zero) and return it as a string." - (transient--read-number-N prompt initial-input history nil)) - -(defun transient--read-number-N (prompt initial-input history include-zero) - (save-match-data - (cl-block nil - (while t - (let ((str (read-from-minibuffer prompt initial-input nil nil history))) - (when (or (string-equal str "") - (string-match-p (if include-zero - "\\`\\(0\\|[1-9][0-9]*\\)\\'" - "\\`[1-9][0-9]*\\'") - str)) - (cl-return str))) - (message "Please enter a natural number (%s zero)." - (if include-zero "including" "excluding")) - (sit-for 1))))) - -(defun transient-read-date (prompt default-time _history) - "Read a date using `org-read-date' (which see)." - (require 'org) - (when (fboundp 'org-read-date) - (org-read-date 'with-time nil nil prompt default-time))) - -;;;; Prompt - -(cl-defgeneric transient-prompt (obj) - "Return the prompt to be used to read infix object OBJ's value.") - -(cl-defmethod transient-prompt ((obj transient-infix)) - "Return the prompt to be used to read infix object OBJ's value. - -This implementation should be suitable for almost all infix -commands. - -If the value of OBJ's `prompt' slot is non-nil, then it must be -a string or a function. If it is a string, then use that. If -it is a function, then call that with OBJ as the only argument. -That function must return a string, which is then used as the -prompt. - -Otherwise, if the value of either the `argument' or `variable' -slot of OBJ is a string, then base the prompt on that (preferring -the former), appending either \"=\" (if it appears to be a -command-line option) or \": \". - -Finally fall through to using \"(BUG: no prompt): \" as the -prompt." - (if-let ((prompt (oref obj prompt))) - (let ((prompt (if (functionp prompt) - (funcall prompt obj) - prompt))) - (if (stringp prompt) - prompt - "(BUG: no prompt): ")) - (or (and-let* ((arg (and (slot-boundp obj 'argument) (oref obj argument)))) - (if (and (stringp arg) (string-suffix-p "=" arg)) - arg - (concat arg ": "))) - (and-let* ((var (and (slot-boundp obj 'variable) (oref obj variable)))) - (and (stringp var) - (concat var ": "))) - "(BUG: no prompt): "))) - -;;;; Set - -(defvar transient--unset-incompatible t) - -(cl-defgeneric transient-infix-set (obj value) - "Set the value of infix object OBJ to value.") - -(cl-defmethod transient-infix-set ((obj transient-infix) value) - "Set the value of infix object OBJ to value." - (oset obj value value)) - -(cl-defmethod transient-infix-set :around ((obj transient-argument) value) - "Unset incompatible infix arguments." - (let ((arg (if (slot-boundp obj 'argument) - (oref obj argument) - (oref obj argument-regexp)))) - (if-let ((sic (and value arg transient--unset-incompatible)) - (spec (oref transient--prefix incompatible)) - (incomp (cl-mapcan (lambda (rule) - (and (member arg rule) - (remove arg rule))) - spec))) - (progn - (cl-call-next-method obj value) - (dolist (arg incomp) - (when-let ((obj (cl-find-if (lambda (obj) - (and (slot-boundp obj 'argument) - (equal (oref obj argument) arg))) - transient--suffixes))) - (let ((transient--unset-incompatible nil)) - (transient-infix-set obj nil))))) - (cl-call-next-method obj value)))) - -(cl-defgeneric transient-set-value (obj) - "Set the value of the transient prefix OBJ.") - -(cl-defmethod transient-set-value ((obj transient-prefix)) - (oset (oref obj prototype) value (transient-get-value)) - (transient--history-push obj)) - -;;;; Save - -(cl-defgeneric transient-save-value (obj) - "Save the value of the transient prefix OBJ.") - -(cl-defmethod transient-save-value ((obj transient-prefix)) - (let ((value (transient-get-value))) - (oset (oref obj prototype) value value) - (setf (alist-get (oref obj command) transient-values) value) - (transient-save-values)) - (transient--history-push obj)) - -;;;; Reset - -(cl-defgeneric transient-reset-value (obj) - "Clear the set and saved values of the transient prefix OBJ.") - -(cl-defmethod transient-reset-value ((obj transient-prefix)) - (let ((value (transient-default-value obj))) - (oset obj value value) - (oset (oref obj prototype) value value) - (setf (alist-get (oref obj command) transient-values nil 'remove) nil) - (transient-save-values)) - (transient--history-push obj) - (mapc #'transient-init-value transient--suffixes)) - -;;;; Get - -(defun transient-args (prefix) - "Return the value of the transient prefix command PREFIX. -If the current command was invoked from the transient prefix -command PREFIX, then return the active infix arguments. If -the current command was not invoked from PREFIX, then return -the set, saved or default value for PREFIX." - (cl-mapcan #'transient--get-wrapped-value (transient-suffixes prefix))) - -(defun transient-suffixes (prefix) - "Return the suffix objects of the transient prefix command PREFIX." - (if (eq transient-current-command prefix) - transient-current-suffixes - (let ((transient--prefix (transient--init-prefix prefix))) - (transient--flatten-suffixes - (transient--init-suffixes prefix))))) - -(defun transient-get-value () - (transient--with-emergency-exit - (cl-mapcan (lambda (obj) - (and (or (not (slot-exists-p obj 'unsavable)) - (not (oref obj unsavable))) - (transient--get-wrapped-value obj))) - transient-current-suffixes))) - -(defun transient--get-wrapped-value (obj) - (and-let* ((value (transient-infix-value obj))) - (cl-ecase (and (slot-exists-p obj 'multi-value) - (oref obj multi-value)) - ((nil) (list value)) - ((t rest) (list value)) - (repeat value)))) - -(cl-defgeneric transient-infix-value (obj) - "Return the value of the suffix object OBJ. - -This function is called by `transient-args' (which see), meaning -this function is how the value of a transient is determined so -that the invoked suffix command can use it. - -Currently most values are strings, but that is not set in stone. -Nil is not a value, it means \"no value\". - -Usually only infixes have a value, but see the method for -`transient-suffix'.") - -(cl-defmethod transient-infix-value ((_ transient-suffix)) - "Return nil, which means \"no value\". - -Infix arguments contribute the transient's value while suffix -commands consume it. This function is called for suffixes anyway -because a command that both contributes to the transient's value -and also consumes it is not completely unconceivable. - -If you define such a command, then you must define a derived -class and implement this function because this default method -does nothing." nil) - -(cl-defmethod transient-infix-value ((obj transient-infix)) - "Return the value of OBJ's `value' slot." - (oref obj value)) - -(cl-defmethod transient-infix-value ((obj transient-option)) - "Return ARGUMENT and VALUE as a unit or nil if the latter is nil." - (and-let* ((value (oref obj value))) - (let ((arg (oref obj argument))) - (cl-ecase (oref obj multi-value) - ((nil) (concat arg value)) - ((t rest) (cons arg value)) - (repeat (mapcar (lambda (v) (concat arg v)) value)))))) - -(cl-defmethod transient-infix-value ((_ transient-variable)) - "Return nil, which means \"no value\". - -Setting the value of a variable is done by, well, setting the -value of the variable. I.e. this is a side-effect and does not -contribute to the value of the transient." - nil) - -;;;; Utilities - -(defun transient-arg-value (arg args) - "Return the value of ARG as it appears in ARGS. - -For a switch return a boolean. For an option return the value as -a string, using the empty string for the empty value, or nil if -the option does not appear in ARGS." - (if (string-suffix-p "=" arg) - (save-match-data - (and-let* ((match (let ((case-fold-search nil) - (re (format "\\`%s\\(?:=\\(.+\\)\\)?\\'" - (substring arg 0 -1)))) - (cl-find-if (lambda (a) - (and (stringp a) - (string-match re a))) - args)))) - (or (match-string 1 match) ""))) - (and (member arg args) t))) - -;;; History - -(cl-defgeneric transient--history-key (obj) - "Return OBJ's history key. -If the value of the `history-key' slot is non-nil, then return -that. Otherwise return the value of the `command' slot." - (or (oref obj history-key) - (oref obj command))) - -(cl-defgeneric transient--history-push (obj) - "Push the current value of OBJ to its entry in `transient-history'." - (let ((key (transient--history-key obj))) - (setf (alist-get key transient-history) - (let ((args (transient-get-value))) - (cons args (delete args (alist-get key transient-history))))))) - -(cl-defgeneric transient--history-init (obj) - "Initialize OBJ's `history' slot. -This is the transient-wide history; many individual infixes also -have a history of their own.") - -(cl-defmethod transient--history-init ((obj transient-prefix)) - "Initialize OBJ's `history' slot from the variable `transient-history'." - (let ((val (oref obj value))) - (oset obj history - (cons val (delete val (alist-get (transient--history-key obj) - transient-history)))))) - -;;; Draw - -(defun transient--show-brief () - (let ((message-log-max nil)) - (if (and transient-show-popup (<= transient-show-popup 0)) - (message "%s-" (key-description (this-command-keys))) - (message - "%s- [%s] %s" - (key-description (this-command-keys)) - (oref transient--prefix command) - (mapconcat - #'identity - (sort - (cl-mapcan - (lambda (suffix) - (let ((key (kbd (oref suffix key)))) - ;; Don't list any common commands. - (and (not (memq (oref suffix command) - `(,(lookup-key transient-map key) - ,(lookup-key transient-sticky-map key) - ;; From transient-common-commands: - transient-set - transient-save - transient-history-prev - transient-history-next - transient-quit-one - transient-toggle-common - transient-set-level))) - (list (propertize (oref suffix key) 'face 'transient-key))))) - transient--suffixes) - #'string<) - (propertize "|" 'face 'transient-unreachable-key)))))) - -(defun transient--show () - (transient--timer-cancel) - (setq transient--showp t) - (let ((buf (get-buffer-create transient--buffer-name)) - (focus nil)) - (with-current-buffer buf - (when transient-enable-popup-navigation - (setq focus (or (button-get (point) 'command) - (transient--heading-at-point)))) - (erase-buffer) - (setq window-size-fixed t) - (when (bound-and-true-p tab-line-format) - (setq tab-line-format nil)) - (setq header-line-format nil) - (setq mode-line-format (if (eq transient-mode-line-format 'line) - nil - transient-mode-line-format)) - (setq mode-line-buffer-identification - (symbol-name (oref transient--prefix command))) - (if transient-enable-popup-navigation - (setq-local cursor-in-non-selected-windows 'box) - (setq cursor-type nil)) - (setq display-line-numbers nil) - (setq show-trailing-whitespace nil) - (transient--insert-groups) - (when (or transient--helpp transient--editp) - (transient--insert-help)) - (when (and (eq transient-mode-line-format 'line) - window-system) - (let ((face - (if-let ((f (and (transient--semantic-coloring-p) - (transient--prefix-color transient--prefix)))) - `(,@(and (>= emacs-major-version 27) '(:extend t)) - :background ,(face-foreground f)) - 'transient-separator))) - (insert (propertize "__" 'face face 'display '(space :height (1)))) - (insert (propertize "\n" 'face face 'line-height t)))) - (when transient-force-fixed-pitch - (transient--force-fixed-pitch))) - (unless (window-live-p transient--window) - (setq transient--window - (display-buffer buf transient-display-buffer-action))) - (when (window-live-p transient--window) - (with-selected-window transient--window - (goto-char (point-min)) - (when transient-enable-popup-navigation - (transient--goto-button focus)) - (magit--fit-window-to-buffer transient--window))))) - -(defun magit--fit-window-to-buffer (window) - (let ((window-resize-pixelwise t) - (window-size-fixed nil)) - (if (eq (car (window-parameter window 'quit-restore)) 'other) - ;; Grow but never shrink window that previously displayed - ;; another buffer and is going to display that again. - (fit-window-to-buffer window nil (window-height window)) - (fit-window-to-buffer window nil 1)))) - -(defun transient--insert-groups () - (let ((groups (cl-mapcan (lambda (group) - (let ((hide (oref group hide))) - (and (not (and (functionp hide) - (funcall hide))) - (list group)))) - transient--layout)) - group) - (while (setq group (pop groups)) - (transient--insert-group group) - (when groups - (insert ?\n))))) - -(defvar transient--max-group-level 1) - -(cl-defgeneric transient--insert-group (group) - "Format GROUP and its elements and insert the result.") - -(cl-defmethod transient--insert-group :around ((group transient-group)) - "Insert GROUP's description, if any." - (when-let ((desc (transient-format-description group))) - (insert desc ?\n)) - (let ((transient--max-group-level - (max (oref group level) transient--max-group-level))) - (cl-call-next-method group))) - -(cl-defmethod transient--insert-group ((group transient-row)) - (transient--maybe-pad-keys group) - (dolist (suffix (oref group suffixes)) - (insert (transient-format suffix)) - (insert " ")) - (insert ?\n)) - -(cl-defmethod transient--insert-group ((group transient-column)) - (transient--maybe-pad-keys group) - (dolist (suffix (oref group suffixes)) - (let ((str (transient-format suffix))) - (insert str) - (unless (string-match-p ".\n\\'" str) - (insert ?\n))))) - -(cl-defmethod transient--insert-group ((group transient-columns)) - (let* ((columns - (mapcar - (lambda (column) - (transient--maybe-pad-keys column group) - (let ((rows (mapcar #'transient-format (oref column suffixes)))) - (when-let ((desc (transient-format-description column))) - (push desc rows)) - (flatten-tree rows))) - (oref group suffixes))) - (vp (or (oref transient--prefix variable-pitch) - transient-align-variable-pitch)) - (rs (apply #'max (mapcar #'length columns))) - (cs (length columns)) - (cw (mapcar (lambda (col) - (apply #'max - (mapcar (if vp #'transient--pixel-width #'length) - col))) - columns)) - (cc (transient--seq-reductions-from - (apply-partially #'+ (* 3 (if vp (transient--pixel-width " ") 1))) - cw 0))) - (if transient-force-single-column - (dotimes (c cs) - (dotimes (r rs) - (when-let ((cell (nth r (nth c columns)))) - (unless (equal cell "") - (insert cell ?\n)))) - (unless (= c (1- cs)) - (insert ?\n))) - (dotimes (r rs) - (dotimes (c cs) - (if vp - (progn - (when-let ((cell (nth r (nth c columns)))) - (insert cell)) - (if (= c (1- cs)) - (insert ?\n) - (insert (propertize " " 'display - `(space :align-to (,(nth (1+ c) cc))))))) - (insert (make-string (- (nth c cc) (current-column)) ?\s)) - (when-let ((cell (nth r (nth c columns)))) - (insert cell)) - (when (= c (1- cs)) - (insert ?\n)))))))) - -(defun transient--pixel-width (string) - (save-window-excursion - (with-temp-buffer - (insert string) - (set-window-dedicated-p nil nil) - (set-window-buffer nil (current-buffer)) - (car (window-text-pixel-size - nil (line-beginning-position) (point)))))) - -(cl-defmethod transient--insert-group ((group transient-subgroups)) - (let* ((subgroups (oref group suffixes)) - (n (length subgroups))) - (dotimes (s n) - (let ((subgroup (nth s subgroups))) - (transient--maybe-pad-keys subgroup group) - (transient--insert-group subgroup) - (when (< s (1- n)) - (insert ?\n)))))) - -(cl-defgeneric transient-format (obj) - "Format and return OBJ for display. - -When this function is called, then the current buffer is some -temporary buffer. If you need the buffer from which the prefix -command was invoked to be current, then do so by temporarily -making `transient--original-buffer' current.") - -(cl-defmethod transient-format ((arg string)) - "Return the string ARG after applying the `transient-heading' face." - (propertize arg 'face 'transient-heading)) - -(cl-defmethod transient-format ((_ null)) - "Return a string containing just the newline character." - "\n") - -(cl-defmethod transient-format ((arg integer)) - "Return a string containing just the ARG character." - (char-to-string arg)) - -(cl-defmethod transient-format :around ((obj transient-infix)) - "When reading user input for this infix, then highlight it." - (let ((str (cl-call-next-method obj))) - (when (eq obj transient--active-infix) - (setq str (concat str "\n")) - (add-face-text-property - (if (eq this-command 'transient-set-level) 3 0) - (length str) - 'transient-active-infix nil str)) - str)) - -(cl-defmethod transient-format :around ((obj transient-suffix)) - "When edit-mode is enabled, then prepend the level information. -Optional support for popup buttons is also implemented here." - (let ((str (concat - (and transient--editp - (let ((level (oref obj level))) - (propertize (format " %s " level) - 'face (if (transient--use-level-p level t) - 'transient-enabled-suffix - 'transient-disabled-suffix)))) - (cl-call-next-method obj)))) - (when (oref obj inapt) - (add-face-text-property 0 (length str) 'transient-inapt-suffix nil str)) - (if transient-enable-popup-navigation - (make-text-button str nil - 'type 'transient - 'command (transient--suffix-command obj)) - str))) - -(cl-defmethod transient-format ((obj transient-infix)) - "Return a string generated using OBJ's `format'. -%k is formatted using `transient-format-key'. -%d is formatted using `transient-format-description'. -%v is formatted using `transient-format-value'." - (format-spec (oref obj format) - `((?k . ,(transient-format-key obj)) - (?d . ,(transient-format-description obj)) - (?v . ,(transient-format-value obj))))) - -(cl-defmethod transient-format ((obj transient-suffix)) - "Return a string generated using OBJ's `format'. -%k is formatted using `transient-format-key'. -%d is formatted using `transient-format-description'." - (format-spec (oref obj format) - `((?k . ,(transient-format-key obj)) - (?d . ,(transient-format-description obj))))) - -(cl-defgeneric transient-format-key (obj) - "Format OBJ's `key' for display and return the result.") - -(cl-defmethod transient-format-key ((obj transient-suffix)) - "Format OBJ's `key' for display and return the result." - (let ((key (oref obj key)) - (cmd (oref obj command))) - (if transient--redisplay-key - (let ((len (length transient--redisplay-key)) - (seq (cl-coerce (edmacro-parse-keys key t) 'list))) - (cond - ((member (seq-take seq len) - (list transient--redisplay-key - (thread-last transient--redisplay-key - (cl-substitute ?- 'kp-subtract) - (cl-substitute ?= 'kp-equal) - (cl-substitute ?+ 'kp-add)))) - (let ((pre (key-description (vconcat (seq-take seq len)))) - (suf (key-description (vconcat (seq-drop seq len))))) - (setq pre (string-replace "RET" "C-m" pre)) - (setq pre (string-replace "TAB" "C-i" pre)) - (setq suf (string-replace "RET" "C-m" suf)) - (setq suf (string-replace "TAB" "C-i" suf)) - ;; We use e.g. "-k" instead of the more correct "- k", - ;; because the former is prettier. If we did that in - ;; the definition, then we want to drop the space that - ;; is reinserted above. False-positives are possible - ;; for silly bindings like "-C-c C-c". - (unless (string-search " " key) - (setq pre (string-replace " " "" pre)) - (setq suf (string-replace " " "" suf))) - (concat (propertize pre 'face 'transient-unreachable-key) - (and (string-prefix-p (concat pre " ") key) " ") - (transient--colorize-key suf cmd) - (save-excursion - (and (string-match " +\\'" key) - (propertize (match-string 0 key) - 'face 'fixed-pitch)))))) - ((transient--lookup-key transient-sticky-map (kbd key)) - (transient--colorize-key key cmd)) - (t - (propertize key 'face 'transient-unreachable-key)))) - (transient--colorize-key key cmd)))) - -(defun transient--colorize-key (key command) - (propertize key 'face - (or (and (transient--semantic-coloring-p) - (transient--suffix-color command)) - 'transient-key))) - -(cl-defmethod transient-format-key :around ((obj transient-argument)) - (let ((key (cl-call-next-method obj))) - (cond ((not transient-highlight-mismatched-keys)) - ((not (slot-boundp obj 'shortarg)) - (add-face-text-property - 0 (length key) 'transient-nonstandard-key nil key)) - ((not (string-equal key (oref obj shortarg))) - (add-face-text-property - 0 (length key) 'transient-mismatched-key nil key))) - key)) - -(cl-defgeneric transient-format-description (obj) - "Format OBJ's `description' for display and return the result.") - -(cl-defmethod transient-format-description ((obj transient-child)) - "The `description' slot may be a function, in which case that is -called inside the correct buffer (see `transient-insert-group') -and its value is returned to the caller." - (and-let* ((desc (oref obj description))) - (if (functionp desc) - (with-current-buffer transient--original-buffer - (funcall desc)) - desc))) - -(cl-defmethod transient-format-description ((obj transient-group)) - "Format the description by calling the next method. If the result -doesn't use the `face' property at all, then apply the face -`transient-heading' to the complete string." - (and-let* ((desc (cl-call-next-method obj))) - (if (text-property-not-all 0 (length desc) 'face nil desc) - desc - (propertize desc 'face 'transient-heading)))) - -(cl-defmethod transient-format-description :around ((obj transient-suffix)) - "Format the description by calling the next method. If the result -is nil, then use \"(BUG: no description)\" as the description. -If the OBJ's `key' is currently unreachable, then apply the face -`transient-unreachable' to the complete string." - (let ((desc (or (cl-call-next-method obj) - (and (slot-boundp transient--prefix 'suffix-description) - (funcall (oref transient--prefix suffix-description) - obj)) - (propertize "(BUG: no description)" 'face 'error)))) - (cond ((transient--key-unreachable-p obj) - (propertize desc 'face 'transient-unreachable)) - ((and transient-highlight-higher-levels - (> (max (oref obj level) transient--max-group-level) - transient--default-prefix-level)) - (add-face-text-property - 0 (length desc) 'transient-higher-level nil desc) - desc) - (t - desc)))) - -(cl-defgeneric transient-format-value (obj) - "Format OBJ's value for display and return the result.") - -(cl-defmethod transient-format-value ((obj transient-suffix)) - (propertize (oref obj argument) - 'face (if (oref obj value) - 'transient-argument - 'transient-inactive-argument))) - -(cl-defmethod transient-format-value ((obj transient-option)) - (let ((argument (oref obj argument))) - (if-let ((value (oref obj value))) - (propertize - (cl-ecase (oref obj multi-value) - ((nil) (concat argument value)) - ((t rest) (concat argument - (and (not (string-suffix-p " " argument)) " ") - (mapconcat #'prin1-to-string value " "))) - (repeat (mapconcat (lambda (v) (concat argument v)) value " "))) - 'face 'transient-value) - (propertize argument 'face 'transient-inactive-value)))) - -(cl-defmethod transient-format-value ((obj transient-switches)) - (with-slots (value argument-format choices) obj - (format (propertize argument-format - 'face (if value - 'transient-value - 'transient-inactive-value)) - (concat - (propertize "[" 'face 'transient-inactive-value) - (mapconcat - (lambda (choice) - (propertize choice 'face - (if (equal (format argument-format choice) value) - 'transient-value - 'transient-inactive-value))) - choices - (propertize "|" 'face 'transient-inactive-value)) - (propertize "]" 'face 'transient-inactive-value))))) - -(defun transient--key-unreachable-p (obj) - (and transient--redisplay-key - (let ((key (oref obj key))) - (not (or (equal (seq-take (cl-coerce (edmacro-parse-keys key t) 'list) - (length transient--redisplay-key)) - transient--redisplay-key) - (transient--lookup-key transient-sticky-map (kbd key))))))) - -(defun transient--lookup-key (keymap key) - (let ((val (lookup-key keymap key))) - (and val (not (integerp val)) val))) - -(defun transient--maybe-pad-keys (group &optional parent) - (when-let ((pad (if (slot-boundp group 'pad-keys) - (oref group pad-keys) - (and parent - (slot-boundp parent 'pad-keys) - (oref parent pad-keys))))) - (let ((width (apply #'max - (cons (if (integerp pad) pad 0) - (mapcar (lambda (suffix) - (length (oref suffix key))) - (oref group suffixes)))))) - (dolist (suffix (oref group suffixes)) - (oset suffix key - (truncate-string-to-width (oref suffix key) width nil ?\s)))))) - -(defun transient-command-summary-or-name (obj) - "Return the summary or name of the command represented by OBJ. - -If the command has a doc-string, then return the first line of -that, else its name. - -Intended to be temporarily used as the `:suffix-description' of -a prefix command, while porting a regular keymap to a transient." - (let ((command (transient--suffix-symbol (oref obj command)))) - (if-let ((doc (documentation command))) - (propertize (car (split-string doc "\n")) 'face 'font-lock-doc-face) - (propertize (symbol-name command) 'face 'font-lock-function-name-face)))) - -;;; Help - -(cl-defgeneric transient-show-help (obj) - "Show documentation for the command represented by OBJ.") - -(cl-defmethod transient-show-help ((obj transient-prefix)) - "Call `show-help' if non-nil, else show `info-manual', -if non-nil, else show the `man-page' if non-nil, else use -`describe-function'." - (with-slots (show-help info-manual man-page command) obj - (cond (show-help (funcall show-help obj)) - (info-manual (transient--show-manual info-manual)) - (man-page (transient--show-manpage man-page)) - (t (transient--describe-function command))))) - -(cl-defmethod transient-show-help ((obj transient-suffix)) - "Call `show-help' if non-nil, else use `describe-function'. -Also used to dispatch showing documentation for the current -prefix. If the suffix is a sub-prefix, then also call the -prefix method." - (cond - ((eq this-command 'transient-help) - (transient-show-help transient--prefix)) - ((let ((prefix (get (transient--suffix-command obj) - 'transient--prefix))) - (and prefix (not (eq (oref transient--prefix command) this-command)) - (prog1 t (transient-show-help prefix))))) - (t (if-let ((show-help (oref obj show-help))) - (funcall show-help obj) - (transient--describe-function this-command))))) - -(cl-defmethod transient-show-help ((obj transient-infix)) - "Call `show-help' if non-nil, else show the `man-page' -if non-nil, else use `describe-function'. When showing the -manpage, then try to jump to the correct location." - (if-let ((show-help (oref obj show-help))) - (funcall show-help obj) - (if-let ((man-page (oref transient--prefix man-page)) - (argument (and (slot-boundp obj 'argument) - (oref obj argument)))) - (transient--show-manpage man-page argument) - (transient--describe-function this-command)))) - -;; `cl-generic-generalizers' doesn't support `command' et al. -(cl-defmethod transient-show-help (cmd) - "Show the command doc-string." - (transient--describe-function cmd)) - -(defun transient--describe-function (fn) - (describe-function (if (symbolp fn) fn 'transient--anonymous-infix-argument)) - (select-window (get-buffer-window (help-buffer)))) - -(defun transient--anonymous-infix-argument () - "Cannot show any documentation for this anonymous infix command. - -The infix command in question was defined anonymously, i.e., -it was define when the prefix command that it belongs to was -defined, which means that it gets no docstring and also that -no symbol is bound to it. - -When you request help for an infix command, then we usually -show the respective man-page and jump to the location where -the respective argument is being described. - -Because the containing prefix command does not specify any -man-page, we cannot do that in this case. Sorry about that.") - -(defun transient--show-manual (manual) - (info manual)) - -(defun transient--show-manpage (manpage &optional argument) - (require 'man) - (let* ((Man-notify-method 'meek) - (buf (Man-getpage-in-background manpage)) - (proc (get-buffer-process buf))) - (while (and proc (eq (process-status proc) 'run)) - (accept-process-output proc)) - (switch-to-buffer buf) - (when argument - (transient--goto-argument-description argument)))) - -(defun transient--goto-argument-description (arg) - (goto-char (point-min)) - (let ((case-fold-search nil) - ;; This matches preceding/proceeding options. Options - ;; such as "-a", "-S[]", and "--grep=" - ;; are matched by this regex without the shy group. - ;; The ". " in the shy group is for options such as - ;; "-m parent-number", and the "-[^[:space:]]+ " is - ;; for options such as "--mainline parent-number" - (others "-\\(?:. \\|-[^[:space:]]+ \\)?[^[:space:]]+")) - (when (re-search-forward - (if (equal arg "--") - ;; Special case. - "^[\t\s]+\\(--\\(?: \\|$\\)\\|\\[--\\]\\)" - ;; Should start with whitespace and may have - ;; any number of options before and/or after. - (format - "^[\t\s]+\\(?:%s, \\)*?\\(?1:%s\\)%s\\(?:, %s\\)*$" - others - ;; Options don't necessarily end in an "=" - ;; (e.g., "--gpg-sign[=]") - (string-remove-suffix "=" arg) - ;; Simple options don't end in an "=". Splitting this - ;; into 2 cases should make getting false positives - ;; less likely. - (if (string-suffix-p "=" arg) - ;; "[^[:space:]]*[^.[:space:]]" matches the option - ;; value, which is usually after the option name - ;; and either '=' or '[='. The value can't end in - ;; a period, as that means it's being used at the - ;; end of a sentence. The space is for options - ;; such as '--mainline parent-number'. - "\\(?: \\|\\[?=\\)[^[:space:]]*[^.[:space:]]" - ;; Either this doesn't match anything (e.g., "-a"), - ;; or the option is followed by a value delimited - ;; by a "[", "<", or ":". A space might appear - ;; before this value, as in "-f ". The - ;; space alternative is for options such as - ;; "-m parent-number". - "\\(?:\\(?: \\| ?[\\[<:]\\)[^[:space:]]*[^.[:space:]]\\)?") - others)) - nil t) - (goto-char (match-beginning 1))))) - -(defun transient--insert-help () - (unless (looking-back "\n\n" 2) - (insert "\n")) - (when transient--helpp - (insert - (format (propertize "\ -Type a %s to show help for that suffix command, or %s to show manual. -Type %s to exit help.\n" - 'face 'transient-heading) - (propertize "" 'face 'transient-key) - (propertize "?" 'face 'transient-key) - (propertize "C-g" 'face 'transient-key)))) - (when transient--editp - (unless transient--helpp - (insert - (format (propertize "\ -Type a %s to set level for that suffix command. -Type %s to set what levels are available for this prefix command.\n" - 'face 'transient-heading) - (propertize "" 'face 'transient-key) - (propertize "C-x l" 'face 'transient-key)))) - (with-slots (level) transient--prefix - (insert - (format (propertize " -Suffixes on levels %s are available. -Suffixes on levels %s and %s are unavailable.\n" - 'face 'transient-heading) - (propertize (format "1-%s" level) - 'face 'transient-enabled-suffix) - (propertize " 0 " - 'face 'transient-disabled-suffix) - (propertize (format ">=%s" (1+ level)) - 'face 'transient-disabled-suffix)))))) - -(defvar transient-resume-mode-map - (let ((map (make-sparse-keymap))) - (define-key map [remap Man-quit] #'transient-resume) - (define-key map [remap Info-exit] #'transient-resume) - (define-key map [remap quit-window] #'transient-resume) - map) - "Keymap for `transient-resume-mode'. - -This keymap remaps every command that would usually just quit the -documentation buffer to `transient-resume', which additionally -resumes the suspended transient.") - -(define-minor-mode transient-resume-mode - "Auxiliary minor-mode used to resume a transient after viewing help.") - -(defun transient-toggle-debug () - "Toggle debugging statements for transient commands." - (interactive) - (setq transient--debug (not transient--debug)) - (message "Debugging transient %s" - (if transient--debug "enabled" "disabled"))) - -;;; Popup Navigation - -(defun transient-popup-navigation-help () - "Inform the user how to enable popup navigation commands." - (interactive) - (message "This command is only available if `%s' is non-nil" - 'transient-enable-popup-navigation)) - -(define-button-type 'transient - 'face nil - 'keymap transient-button-map) - -(defun transient-backward-button (n) - "Move to the previous button in the transient popup buffer. -See `backward-button' for information about N." - (interactive "p") - (with-selected-window transient--window - (backward-button n t))) - -(defun transient-forward-button (n) - "Move to the next button in the transient popup buffer. -See `forward-button' for information about N." - (interactive "p") - (with-selected-window transient--window - (forward-button n t))) - -(defun transient--goto-button (command) - (cond - ((stringp command) - (when (re-search-forward (concat "^" (regexp-quote command)) nil t) - (goto-char (match-beginning 0)))) - (command - (while (and (ignore-errors (forward-button 1)) - (not (eq (button-get (button-at (point)) 'command) command)))) - (unless (eq (button-get (button-at (point)) 'command) command) - (goto-char (point-min)) - (forward-button 1))))) - -(defun transient--heading-at-point () - (and (eq (get-text-property (point) 'face) 'transient-heading) - (let ((beg (line-beginning-position))) - (buffer-substring-no-properties - beg (next-single-property-change - beg 'face nil (line-end-position)))))) - -;;; Compatibility -;;;; Popup Isearch - -(defvar transient--isearch-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map isearch-mode-map) - (define-key map [remap isearch-exit] #'transient-isearch-exit) - (define-key map [remap isearch-cancel] #'transient-isearch-cancel) - (define-key map [remap isearch-abort] #'transient-isearch-abort) - map)) - -(defun transient-isearch-backward (&optional regexp-p) - "Do incremental search backward. -With a prefix argument, do an incremental regular expression -search instead." - (interactive "P") - (transient--isearch-setup) - (let ((isearch-mode-map transient--isearch-mode-map)) - (isearch-mode nil regexp-p))) - -(defun transient-isearch-forward (&optional regexp-p) - "Do incremental search forward. -With a prefix argument, do an incremental regular expression -search instead." - (interactive "P") - (transient--isearch-setup) - (let ((isearch-mode-map transient--isearch-mode-map)) - (isearch-mode t regexp-p))) - -(defun transient-isearch-exit () - "Like `isearch-exit' but adapted for `transient'." - (interactive) - (isearch-exit) - (transient--isearch-exit)) - -(defun transient-isearch-cancel () - "Like `isearch-cancel' but adapted for `transient'." - (interactive) - (condition-case nil (isearch-cancel) (quit)) - (transient--isearch-exit)) - -(defun transient-isearch-abort () - "Like `isearch-abort' but adapted for `transient'." - (interactive) - (condition-case nil (isearch-abort) (quit)) - (transient--isearch-exit)) - -(defun transient--isearch-setup () - (select-window transient--window) - (transient--suspend-override t)) - -(defun transient--isearch-exit () - (select-window transient--original-window) - (transient--resume-override)) - -;;;; Hydra Color Emulation - -(defun transient--semantic-coloring-p () - (and transient-semantic-coloring - (not transient--helpp) - (not transient--editp))) - -(defun transient--suffix-color (command) - (or (get command 'transient-color) - (get (transient--get-predicate-for command) 'transient-color))) - -(defun transient--prefix-color (command) - (let* ((nonsuf (or (oref command transient-non-suffix) - 'transient--do-warn)) - (nonsuf (if (memq nonsuf '(transient--do-noop transient--do-warn)) - 'disallow - (get nonsuf 'transient-color))) - (suffix (if-let ((pred (oref command transient-suffix))) - (get pred 'transient-color) - (if (eq nonsuf 'transient-red) - 'transient-red - 'transient-blue)))) - (pcase (list suffix nonsuf) - (`(transient-purple ,_) 'transient-purple) - ('(transient-red disallow) 'transient-amaranth) - ('(transient-blue disallow) 'transient-teal) - ('(transient-red transient-red) 'transient-pink) - ('(transient-red transient-blue) 'transient-red) - ('(transient-blue transient-blue) 'transient-blue)))) - -;;;; Edebug - -(defun transient--edebug--recursive-edit (fn arg-mode) - (transient--debug 'edebug--recursive-edit) - (if (not transient--prefix) - (funcall fn arg-mode) - (transient--suspend-override t) - (funcall fn arg-mode) - (transient--resume-override))) - -(advice-add 'edebug--recursive-edit :around #'transient--edebug--recursive-edit) - -(defun transient--abort-edebug () - (when (bound-and-true-p edebug-active) - (transient--emergency-exit))) - -(advice-add 'abort-recursive-edit :before #'transient--abort-edebug) -(advice-add 'top-level :before #'transient--abort-edebug) - -(defun transient--edebug-command-p () - (and (bound-and-true-p edebug-active) - (or (memq this-command '(top-level abort-recursive-edit)) - (string-prefix-p "edebug" (symbol-name this-command))))) - -;;;; Miscellaneous - -(cl-pushnew (list nil (concat "^\\s-*(" - (eval-when-compile - (regexp-opt - '("transient-define-prefix" - "transient-define-suffix" - "transient-define-infix" - "transient-define-argument") - t)) - "\\s-+\\(" lisp-mode-symbol-regexp "\\)") - 2) - lisp-imenu-generic-expression :test #'equal) - -(declare-function which-key-mode "which-key" (&optional arg)) - -(defun transient--suspend-which-key-mode () - (when (bound-and-true-p which-key-mode) - (which-key-mode -1) - (add-hook 'transient-exit-hook #'transient--resume-which-key-mode))) - -(defun transient--resume-which-key-mode () - (unless transient--prefix - (which-key-mode 1) - (remove-hook 'transient-exit-hook #'transient--resume-which-key-mode))) - -(defun transient-bind-q-to-quit () - "Modify some keymaps to bind \"q\" to the appropriate quit command. - -\"C-g\" is the default binding for such commands now, but Transient's -predecessor Magit-Popup used \"q\" instead. If you would like to get -that binding back, then call this function in your init file like so: - - (with-eval-after-load \\='transient - (transient-bind-q-to-quit)) - -Individual transients may already bind \"q\" to something else -and such a binding would shadow the quit binding. If that is the -case then \"Q\" is bound to whatever \"q\" would have been bound -to by setting `transient-substitute-key-function' to a function -that does that. Of course \"Q\" may already be bound to something -else, so that function binds \"M-q\" to that command instead. -Of course \"M-q\" may already be bound to something else, but -we stop there." - (define-key transient-base-map "q" #'transient-quit-one) - (define-key transient-sticky-map "q" #'transient-quit-seq) - (setq transient-substitute-key-function - #'transient-rebind-quit-commands)) - -(defun transient-rebind-quit-commands (obj) - "See `transient-bind-q-to-quit'." - (let ((key (oref obj key))) - (cond ((string-equal key "q") "Q") - ((string-equal key "Q") "M-q") - (t key)))) - -(defun transient--force-fixed-pitch () - (require 'face-remap) - (face-remap-reset-base 'default) - (face-remap-add-relative 'default 'fixed-pitch)) - -;;;; Missing from Emacs - -(defun transient--seq-reductions-from (function sequence initial-value) - (let ((acc (list initial-value))) - (seq-doseq (elt sequence) - (push (funcall function (car acc) elt) acc)) - (nreverse acc))) - -(defun transient-plist-to-alist (plist) - (let (alist) - (while plist - (push (cons (let* ((symbol (pop plist)) - (name (symbol-name symbol))) - (if (eq (aref name 0) ?:) - (intern (substring name 1)) - symbol)) - (pop plist)) - alist)) - (nreverse alist))) - -;;; Font-Lock - -(defconst transient-font-lock-keywords - (eval-when-compile - `((,(concat "(" - (regexp-opt (list "transient-define-prefix" - "transient-define-infix" - "transient-define-argument" - "transient-define-suffix") - t) - "\\_>[ \t'(]*" - "\\(\\(?:\\sw\\|\\s_\\)+\\)?") - (1 'font-lock-keyword-face) - (2 'font-lock-function-name-face nil t))))) - -(font-lock-add-keywords 'emacs-lisp-mode transient-font-lock-keywords) - -;;; Auxiliary Classes -;;;; `transient-lisp-variable' - -(defclass transient-lisp-variable (transient-variable) - ((reader :initform #'transient-lisp-variable--reader) - (always-read :initform t) - (set-value :initarg :set-value :initform #'set)) - "[Experimental] Class used for Lisp variables.") - -(cl-defmethod transient-init-value ((obj transient-lisp-variable)) - (oset obj value (symbol-value (oref obj variable)))) - -(cl-defmethod transient-infix-set ((obj transient-lisp-variable) value) - (funcall (oref obj set-value) - (oref obj variable) - (oset obj value value))) - -(cl-defmethod transient-format-description ((obj transient-lisp-variable)) - (or (cl-call-next-method obj) - (symbol-name (oref obj variable)))) - -(cl-defmethod transient-format-value ((obj transient-lisp-variable)) - (propertize (prin1-to-string (oref obj value)) - 'face 'transient-value)) - -(cl-defmethod transient-prompt ((obj transient-lisp-variable)) - (format "Set %s: " (oref obj variable))) - -(defun transient-lisp-variable--reader (prompt initial-input _history) - (read--expression prompt initial-input)) - -;;; _ -(provide 'transient) -;; Local Variables: -;; indent-tabs-mode: nil -;; checkdoc-symbol-words: ("command-line" "edit-mode" "help-mode") -;; End: -;;; transient.el ends here diff --git a/org/elpa/transient-20220803.1000/transient.info b/org/elpa/transient-20220803.1000/transient.info deleted file mode 100644 index 4e93375..0000000 --- a/org/elpa/transient-20220803.1000/transient.info +++ /dev/null @@ -1,2658 +0,0 @@ -This is transient.info, produced by makeinfo version 6.7 from -transient.texi. - - Copyright (C) 2018-2022 Jonas Bernoulli - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document 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. - -INFO-DIR-SECTION Emacs -START-INFO-DIR-ENTRY -* Transient: (transient). Transient Commands. -END-INFO-DIR-ENTRY - - -File: transient.info, Node: Top, Next: Introduction, Up: (dir) - -Transient User and Developer Manual -*********************************** - -Taking inspiration from prefix keys and prefix arguments, Transient -implements a similar abstraction involving a prefix command, infix -arguments and suffix commands. We could call this abstraction a -"transient command", but because it always involves at least two -commands (a prefix and a suffix) we prefer to call it just a -"transient". - - When the user calls a transient prefix command, a transient -(temporary) keymap is activated, which binds the transient’s infix and -suffix commands, and functions that control the transient state are -added to ‘pre-command-hook’ and ‘post-command-hook’. The available -suffix and infix commands and their state are shown in a popup buffer -until the transient is exited by invoking a suffix command. - - Calling an infix command causes its value to be changed, possibly by -reading a new value in the minibuffer. - - Calling a suffix command usually causes the transient to be exited -but suffix commands can also be configured to not exit the transient. - -This manual is for Transient version 0.3.7-git. - - Copyright (C) 2018-2022 Jonas Bernoulli - - You can redistribute this document and/or modify it under the terms - of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) - any later version. - - This document 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. - -* Menu: - -* Introduction:: -* Usage:: -* Modifying Existing Transients:: -* Defining New Commands:: -* Classes and Methods:: -* Related Abstractions and Packages:: -* FAQ:: -* Keystroke Index:: -* Command and Function Index:: -* Variable Index:: -* Concept Index:: - -— The Detailed Node Listing — - -Usage - -* Invoking Transients:: -* Aborting and Resuming Transients:: -* Common Suffix Commands:: -* Saving Values:: -* Using History:: -* Getting Help for Suffix Commands:: -* Enabling and Disabling Suffixes:: -* Other Commands:: -* Configuration:: - -Defining New Commands - -* Defining Transients:: -* Binding Suffix and Infix Commands:: -* Defining Suffix and Infix Commands:: -* Using Infix Arguments:: -* Transient State:: - -Binding Suffix and Infix Commands - -* Group Specifications:: -* Suffix Specifications:: - - -Classes and Methods - -* Group Classes:: -* Group Methods:: -* Prefix Classes:: -* Suffix Classes:: -* Suffix Methods:: -* Prefix Slots:: -* Suffix Slots:: -* Predicate Slots:: - -Suffix Methods - -* Suffix Value Methods:: -* Suffix Format Methods:: - - -Related Abstractions and Packages - -* Comparison With Prefix Keys and Prefix Arguments:: -* Comparison With Other Packages:: - - - -File: transient.info, Node: Introduction, Next: Usage, Prev: Top, Up: Top - -1 Introduction -************** - -Taking inspiration from prefix keys and prefix arguments, Transient -implements a similar abstraction involving a prefix command, infix -arguments and suffix commands. We could call this abstraction a -"transient command", but because it always involves at least two -commands (a prefix and a suffix) we prefer to call it just a -"transient". - - Transient keymaps are a feature provided by Emacs. Transients as - implemented by this package involve the use of transient keymaps. - - Emacs provides a feature that it calls "prefix commands". When we - talk about "prefix commands" in this manual, then we mean our own - kind of "prefix commands", unless specified otherwise. To avoid - ambiguity we sometimes use the terms "transient prefix command" for - our kind and "regular prefix command" for Emacs’ kind. - - When the user calls a transient prefix command, a transient -(temporary) keymap is activated, which binds the transient’s infix and -suffix commands, and functions that control the transient state are -added to ‘pre-command-hook’ and ‘post-command-hook’. The available -suffix and infix commands and their state are shown in a popup buffer -until the transient state is exited by invoking a suffix command. - - Calling an infix command causes its value to be changed. How that is -done depends on the type of the infix command. The simplest case is an -infix command that represents a command-line argument that does not take -a value. Invoking such an infix command causes the switch to be toggled -on or off. More complex infix commands may read a value from the user, -using the minibuffer. - - Calling a suffix command usually causes the transient to be exited; -the transient keymaps and hook functions are removed, the popup buffer -no longer shows information about the (no longer bound) suffix commands, -the values of some public global variables are set, while some internal -global variables are unset, and finally the command is actually called. -Suffix commands can also be configured to not exit the transient. - - A suffix command can, but does not have to, use the infix arguments -in much the same way any command can choose to use or ignore the prefix -arguments. For a suffix command that was invoked from a transient, the -variable ‘transient-current-suffixes’ and the function ‘transient-args’ -serve about the same purpose as the variables ‘prefix-arg’ and -‘current-prefix-arg’ do for any command that was called after the prefix -arguments have been set using a command such as ‘universal-argument’. - - The information shown in the popup buffer while a transient is active -looks a bit like this: - - ,----------------------------------------- - |Arguments - | -f Force (--force) - | -a Annotate (--annotate) - | - |Create - | t tag - | r release - `----------------------------------------- - - This is a simplified version of ‘magit-tag’. Info manuals do not - support images or colored text, so the above "screenshot" lacks - some information; in practice you would be able to tell whether the - arguments ‘--force’ and ‘--annotate’ are enabled or not based on - their color. - - Transient can be used to implement simple "command dispatchers". The -main benefit then is that the user can see all the available commands in -a popup buffer. That is useful by itself because it frees the user from -having to remember all the keys that are valid after a certain prefix -key or command. Magit’s ‘magit-dispatch’ (on ‘C-x M-g’) command is an -example of using Transient to merely implement a command dispatcher. - - In addition to that, Transient also allows users to interactively -pass arguments to commands. These arguments can be much more complex -than what is reasonable when using prefix arguments. There is a limit -to how many aspects of a command can be controlled using prefix -arguments. Furthermore, what a certain prefix argument means for -different commands can be completely different, and users have to read -documentation to learn and then commit to memory what a certain prefix -argument means to a certain command. - - Transient suffix commands, on the other hand, can accept dozens of -different arguments without the user having to remember anything. When -using Transient, one can call a command with arguments that are just as -complex as when calling the same function non-interactively from Lisp. - - Invoking a transient command with arguments is similar to invoking a -command in a shell with command-line completion and history enabled. -One benefit of the Transient interface is that it remembers history not -only on a global level ("this command was invoked using these arguments, -and previously it was invoked using those other arguments"), but also -remembers the values of individual arguments independently. See *note -Using History::. - - After a transient prefix command is invoked, ‘C-h ’ can be used -to show the documentation for the infix or suffix command that ‘’ -is bound to (see *note Getting Help for Suffix Commands::) and infixes -and suffixes can be removed from the transient using ‘C-x l ’. -Infixes and suffixes that are disabled by default can be enabled the -same way. See *note Enabling and Disabling Suffixes::. - - Transient ships with support for a few different types of specialized -infix commands. A command that sets a command line option, for example, -has different needs than a command that merely toggles a boolean flag. -Additionally, Transient provides abstractions for defining new types, -which the author of Transient did not anticipate (or didn’t get around -to implementing yet). - - -File: transient.info, Node: Usage, Next: Modifying Existing Transients, Prev: Introduction, Up: Top - -2 Usage -******* - -* Menu: - -* Invoking Transients:: -* Aborting and Resuming Transients:: -* Common Suffix Commands:: -* Saving Values:: -* Using History:: -* Getting Help for Suffix Commands:: -* Enabling and Disabling Suffixes:: -* Other Commands:: -* Configuration:: - - -File: transient.info, Node: Invoking Transients, Next: Aborting and Resuming Transients, Up: Usage - -2.1 Invoking Transients -======================= - -A transient prefix command is invoked like any other command by pressing -the key that is bound to that command. The main difference to other -commands is that a transient prefix command activates a transient -keymap, which temporarily binds the transient’s infix and suffix -commands. Bindings from other keymaps may, or may not, be disabled -while the transient state is in effect. - - There are two kinds of commands that are available after invoking a -transient prefix command; infix and suffix commands. Infix commands set -some value (which is then shown in a popup buffer), without leaving the -transient. Suffix commands, on the other hand, usually quit the -transient and they may use the values set by the infix commands, i.e., -the infix *arguments*. - - Instead of setting arguments to be used by a suffix command, infix -commands may also set some value by side-effect, e.g., by setting the -value of some variable. - - -File: transient.info, Node: Aborting and Resuming Transients, Next: Common Suffix Commands, Prev: Invoking Transients, Up: Usage - -2.2 Aborting and Resuming Transients -==================================== - -To quit the transient without invoking a suffix command press ‘C-g’. - - Key bindings in transient keymaps may be longer than a single event. -After pressing a valid prefix key, all commands whose bindings do not -begin with that prefix key are temporarily unavailable and grayed out. -To abort the prefix key press ‘C-g’ (which in this case only quits the -prefix key, but not the complete transient). - - A transient prefix command can be bound as a suffix of another -transient. Invoking such a suffix replaces the current transient state -with a new transient state, i.e., the available bindings change and the -information displayed in the popup buffer is updated accordingly. -Pressing ‘C-g’ while a nested transient is active only quits the -innermost transient, causing a return to the previous transient. - - ‘C-q’ or ‘C-z’ on the other hand always exits all transients. If you -use the latter, then you can later resume the stack of transients using -‘M-x transient-resume’. - -‘C-g’ (‘transient-quit-seq’) -‘C-g’ (‘transient-quit-one’) - This key quits the currently active incomplete key sequence, if - any, or else the current transient. When quitting the current - transient, it returns to the previous transient, if any. - - Transient’s predecessor bound ‘q’ instead of ‘C-g’ to the quit -command. To learn how to get that binding back see -‘transient-bind-q-to-quit’’s doc string. - -‘C-q’ (‘transient-quit-all’) - This command quits the currently active incomplete key sequence, if - any, and all transients, including the active transient and all - suspended transients, if any. - -‘C-z’ (‘transient-suspend’) - Like ‘transient-quit-all’, this command quits an incomplete key - sequence, if any, and all transients. Additionally, it saves the - stack of transients so that it can easily be resumed (which is - particularly useful if you quickly need to do "something else" and - the stack is deeper than a single transient, and/or you have - already changed the values of some infix arguments). - - Note that only a single stack of transients can be saved at a time. - If another stack is already saved, then saving a new stack discards - the previous stack. - -‘M-x transient-resume’ - This command resumes the previously suspended stack of transients, - if any. - - -File: transient.info, Node: Common Suffix Commands, Next: Saving Values, Prev: Aborting and Resuming Transients, Up: Usage - -2.3 Common Suffix Commands -========================== - -A few shared suffix commands are available in all transients. These -suffix commands are not shown in the popup buffer by default. - - This includes the aborting commands mentioned in the previous -section, as well as some other commands that are all bound to ‘C-x -’. After ‘C-x’ is pressed, a section featuring all these common -commands is temporarily shown in the popup buffer. After invoking one -of them, the section disappears again. Note however that one of these -commands is described as "Show common permanently"; invoke that if you -want the common commands to always be shown for all transients. - -‘C-x t’ (‘transient-toggle-common’) - This command toggles whether the generic commands that are common - to all transients are always displayed or only after typing the - incomplete prefix key sequence ‘C-x’. This only affects the - current Emacs session. - - -- User Option: transient-show-common-commands - This option controls whether shared suffix commands are shown - alongside the transient-specific infix and suffix commands. By - default, the shared commands are not shown to avoid overwhelming - the user with to. many options. - - While a transient is active, pressing ‘C-x’ always shows the common - commands. The value of this option can be changed for the current - Emacs session by typing ‘C-x t’ while a transient is active. - - The other common commands are described in either the previous or in -one of the following sections. - - Some of Transient’s key bindings differ from the respective bindings -of Magit-Popup; see *note FAQ:: for more information. - - -File: transient.info, Node: Saving Values, Next: Using History, Prev: Common Suffix Commands, Up: Usage - -2.4 Saving Values -================= - -After setting the infix arguments in a transient, the user can save -those arguments for future invocations. - - Most transients will start out with the saved arguments when they are -invoked. There are a few exceptions, though. Some transients are -designed so that the value that they use is stored externally as the -buffer-local value of some variable. Invoking such a transient again -uses the buffer-local value. (1) - - If the user does not save the value and just exits using a regular -suffix command, then the value is merely saved to the transient’s -history. That value won’t be used when the transient is next invoked, -but it is easily accessible (see *note Using History::). - -‘C-x s’ (‘transient-set’) - This command saves the value of the active transient for this Emacs - session. - -‘C-x C-s’ (‘transient-save’) - Save the value of the active transient persistently across Emacs - sessions. - -‘C-x C-k’ (‘transient-save’) - Clear the set and saved value of the active transient. - - -- User Option: transient-values-file - This option names the file that is used to persist the values of - transients between Emacs sessions. - - ---------- Footnotes ---------- - - (1) ‘magit-diff’ and ‘magit-log’ are two prominent examples, and -their handling of buffer-local values is actually a bit more complicated -than outlined above and even customizable. - - -File: transient.info, Node: Using History, Next: Getting Help for Suffix Commands, Prev: Saving Values, Up: Usage - -2.5 Using History -================= - -Every time the user invokes a suffix command the transient’s current -value is saved to its history. These values can be cycled through the -same way one can cycle through the history of commands that read -user-input in the minibuffer. - -‘C-M-p’ (‘transient-history-prev’) -‘C-x p’ - This command switches to the previous value used for the active - transient. - -‘C-M-n’ (‘transient-history-next’) -‘C-x n’ - This command switches to the next value used for the active - transient. - - In addition to the transient-wide history, Transient of course -supports per-infix history. When an infix reads user-input using the -minibuffer, the user can use the regular minibuffer history commands to -cycle through previously used values. Usually the same keys as those -mentioned above are bound to those commands. - - Authors of transients should arrange for different infix commands -that read the same kind of value to also use the same history key (see -*note Suffix Slots::). - - Both kinds of history are saved to a file when Emacs is exited. - - -- User Option: transient-history-file - This option names the file that is used to persist the history of - transients and their infixes between Emacs sessions. - - -- User Option: transient-history-limit - This option controls how many history elements are kept at the time - the history is saved in ‘transient-history-file’. - - -File: transient.info, Node: Getting Help for Suffix Commands, Next: Enabling and Disabling Suffixes, Prev: Using History, Up: Usage - -2.6 Getting Help for Suffix Commands -==================================== - -Transients can have many suffixes and infixes that the user might not be -familiar with. To make it trivial to get help for these, Transient -provides access to the documentation directly from the active transient. - -‘C-h’ (‘transient-help’) - This command enters help mode. When help mode is active, typing a - key shows information about the suffix command that the key - normally is bound to (instead of invoking it). Pressing ‘C-h’ a - second time shows information about the _prefix_ command. - - After typing a key, the stack of transient states is suspended and - information about the suffix command is shown instead. Typing ‘q’ - in the help buffer buries that buffer and resumes the transient - state. - - What sort of documentation is shown depends on how the transient was -defined. For infix commands that represent command-line arguments this -ideally shows the appropriate manpage. ‘transient-help’ then tries to -jump to the correct location within that. Info manuals are also -supported. The fallback is to show the command’s doc string, for -non-infix suffixes this is usually appropriate. - - -File: transient.info, Node: Enabling and Disabling Suffixes, Next: Other Commands, Prev: Getting Help for Suffix Commands, Up: Usage - -2.7 Enabling and Disabling Suffixes -=================================== - -The user base of a package that uses transients can be very diverse. -This is certainly the case for Magit; some users have been using it and -Git for a decade, while others are just getting started now. - - For that reason a mechanism is needed that authors can use to -classify a transient’s infixes and suffixes along the -essentials...everything spectrum. We use the term "levels" to describe -that mechanism. - - Each suffix command is placed on a level and each transient has a -level (called transient-level), which controls which suffix commands are -available. Integers between 1 and 7 (inclusive) are valid levels. For -suffixes, 0 is also valid; it means that the suffix is not displayed at -any level. - - The levels of individual transients and/or their individual suffixes -can be changed interactively, by invoking the transient and then -pressing ‘C-x l’ to enter the "edit" mode, see below. - - The default level for both transients and their suffixes is 4. The -‘transient-default-level’ option only controls the default for -transients. The default suffix level is always 4. The authors of -transients should place certain suffixes on a higher level, if they -expect that it won’t be of use to most users, and they should place very -important suffixes on a lower level, so that they remain available even -if the user lowers the transient level. - - -- User Option: transient-default-level - This option controls which suffix levels are made available by - default. It sets the transient-level for transients for which the - user has not set that individually. - - -- User Option: transient-levels-file - This option names the file that is used to persist the levels of - transients and their suffixes between Emacs sessions. - -‘C-x l’ (‘transient-set-level’) - This command enters edit mode. When edit mode is active, then all - infixes and suffixes that are currently usable are displayed along - with their levels. The colors of the levels indicate whether they - are enabled or not. The level of the transient is also displayed - along with some usage information. - - In edit mode, pressing the key that would usually invoke a certain - suffix instead prompts the user for the level that suffix should be - placed on. - - Help mode is available in edit mode. - - To change the transient level press ‘C-x l’ again. - - To exit edit mode press ‘C-g’. - - Note that edit mode does not display any suffixes that are not - currently usable. ‘magit-rebase’, for example, shows different - suffixes depending on whether a rebase is already in progress or - not. The predicates also apply in edit mode. - - Therefore, to control which suffixes are available given a certain - state, you have to make sure that that state is currently active. - - -File: transient.info, Node: Other Commands, Next: Configuration, Prev: Enabling and Disabling Suffixes, Up: Usage - -2.8 Other Commands -================== - -When invoking a transient in a small frame, the transient window may not -show the complete buffer, making it necessary to scroll, using the -following commands. These commands are never shown in the transient -window, and the key bindings are the same as for ‘scroll-up-command’ and -‘scroll-down-command’ in other buffers. - - -- Command: transient-scroll-up arg - This command scrolls text of transient popup window upward ARG - lines. If ARG is ‘nil’, then it scrolls near full screen. This is - a wrapper around ‘scroll-up-command’ (which see). - - -- Command: transient-scroll-down arg - This command scrolls text of transient popup window down ARG lines. - If ARG is ‘nil’, then it scrolls near full screen. This is a - wrapper around ‘scroll-down-command’ (which see). - - -File: transient.info, Node: Configuration, Prev: Other Commands, Up: Usage - -2.9 Configuration -================= - -More options are described in *note Common Suffix Commands::, in *note -Saving Values::, in *note Using History:: and in *note Enabling and -Disabling Suffixes::. - -Essential Options ------------------ - -Also see *note Common Suffix Commands::. - - -- User Option: transient-show-popup - This option controls whether the current transient’s infix and - suffix commands are shown in the popup buffer. - - • If ‘t’ (the default) then the popup buffer is shown as soon as - a transient prefix command is invoked. - - • If ‘nil’, then the popup buffer is not shown unless the user - explicitly requests it, by pressing an incomplete prefix key - sequence. - - • If a number, then the a brief one-line summary is shown - instead of the popup buffer. If zero or negative, then not - even that summary is shown; only the pressed key itself is - shown. - - The popup is shown when the user explicitly requests it by - pressing an incomplete prefix key sequence. Unless this is - zero, the popup is shown after that many seconds of inactivity - (using the absolute value). - - -- User Option: transient-enable-popup-navigation - This option controls whether navigation commands are enabled in the - transient popup buffer. - - While a transient is active the transient popup buffer is not the - current buffer, making it necessary to use dedicated commands to - act on that buffer itself. This is disabled by default. If this - option is non-‘nil’, then the following features are available: - - • ‘’ moves the cursor to the previous suffix. ‘’ - moves the cursor to the next suffix. ‘RET’ invokes the suffix - the cursor is on. - • ‘’ invokes the clicked on suffix. - • ‘C-s’ and ‘C-r’ start isearch in the popup buffer. - - -- User Option: transient-display-buffer-action - This option specifies the action used to display the transient - popup buffer. The transient popup buffer is displayed in a window - using ‘(display-buffer BUFFER transient-display-buffer-action)’. - - The value of this option has the form ‘(FUNCTION . ALIST)’, where - FUNCTION is a function or a list of functions. Each such function - should accept two arguments: a buffer to display and an alist of - the same form as ALIST. See *note (elisp)Choosing Window::, for - details. - - The default is: - - (display-buffer-in-side-window - (side . bottom) - (inhibit-same-window . t) - (window-parameters (no-other-window . t))) - - This displays the window at the bottom of the selected frame. - Another useful FUNCTION is ‘display-buffer-below-selected’, which - is what ‘magit-popup’ used by default. For more alternatives see - *note (elisp)Display Action Functions:: and *note (elisp)Buffer - Display Action Alists::. - - Note that the buffer that was current before the transient buffer - is shown should remain the current buffer. Many suffix commands - act on the thing at point, if appropriate, and if the transient - buffer became the current buffer, then that would change what is at - point. To that effect ‘inhibit-same-window’ ensures that the - selected window is not used to show the transient buffer. - - It may be possible to display the window in another frame, but - whether that works in practice depends on the window-manager. If - the window manager selects the new window (Emacs frame), then that - unfortunately changes which buffer is current. - - If you change the value of this option, then you might also want to - change the value of ‘transient-mode-line-format’. - -Accessibility Options ---------------------- - - -- User Option: transient-force-single-column - This option controls whether the use of a single column to display - suffixes is enforced. This might be useful for users with low - vision who use large text and might otherwise have to scroll in two - dimensions. - -Auxiliary Options ------------------ - - -- User Option: transient-mode-line-format - This option controls whether the transient popup buffer has a - mode-line, separator line, or neither. - - If ‘nil’, then the buffer has no mode-line. If the buffer is not - displayed right above the echo area, then this probably is not a - good value. - - If ‘line’ (the default), then the buffer also has no mode-line, but - a thin line is drawn instead, using the background color of the - face ‘transient-separator’. Text-mode frames cannot display thin - lines, and therefore fall back to treating ‘line’ like ‘nil’. - - Otherwise this can be any mode-line format. See *note (elisp)Mode - Line Format::, for details. - - -- User Option: transient-semantic-coloring - This option controls whether prefixes and suffixes are colored in a - Hydra-like fashion. - - If non-‘nil’, then the key binding of each suffix is colorized to - indicate whether it exits the transient state or not. The color of - the prefix is indicated using the line that is drawn when the value - of ‘transient-mode-line-format’ is ‘line’. - - For more information about how Hydra uses colors see - and - . - - -- User Option: transient-highlight-mismatched-keys - This option controls whether key bindings of infix commands that do - not match the respective command-line argument should be - highlighted. For other infix commands this option has no effect. - - When this option is non-‘nil’, the key binding for an infix - argument is highlighted when only a long argument (e.g., - ‘--verbose’) is specified but no shorthand (e.g ‘-v’). In the rare - case that a shorthand is specified but the key binding does not - match, then it is highlighted differently. - - Highlighting mismatched key bindings is useful when learning the - arguments of the underlying command-line tool; you wouldn’t want to - learn any short-hands that do not actually exist. - - The highlighting is done using one of the faces - ‘transient-mismatched-key’ and ‘transient-nonstandard-key’. - - -- User Option: transient-substitute-key-function - This function is used to modify key bindings. If the value of this - option is nil (the default), then no substitution is performed. - - This function is called with one argument, the prefix object, and - must return a key binding description, either the existing key - description it finds in the ‘key’ slot, or the key description that - replaces the prefix key. It could be used to make other - substitutions, but that is discouraged. - - For example, ‘=’ is hard to reach using my custom keyboard layout, - so I substitute ‘(’ for that, which is easy to reach using a layout - optimized for lisp. - - (setq transient-substitute-key-function - (lambda (obj) - (let ((key (oref obj key))) - (if (string-match "\\`\\(=\\)[a-zA-Z]" key) - (replace-match "(" t t key 1) - key)))) - - -- User Option: transient-read-with-initial-input - This option controls whether the last history element is used as - the initial minibuffer input when reading the value of an infix - argument from the user. If ‘nil’, there is no initial input and - the first element has to be accessed the same way as the older - elements. - - -- User Option: transient-hide-during-minibuffer-read - This option controls whether the transient buffer is hidden while - user input is being read in the minibuffer. - - -- User Option: transient-align-variable-pitch - This option controls whether columns are aligned pixel-wise in the - popup buffer. - - If this is non-‘nil’, then columns are aligned pixel-wise to - support variable-pitch fonts. Keys are not aligned, so you should - use a fixed-pitch font for the ‘transient-key’ face. Other key - faces inherit from that face unless a theme is used that breaks - that relationship. - - This option is intended for users who use a variable-pitch font for - the ‘default’ face. - - -- User Option: transient-force-fixed-pitch - This option controls whether to force the use of a monospaced font - in popup buffer. Even if you use a proportional font for the - ‘default’ face, you might still want to use a monospaced font in - transient’s popup buffer. Setting this option to ‘t’ causes - ‘default’ to be remapped to ‘fixed-pitch’ in that buffer. - -Developer Options ------------------ - -These options are mainly intended for developers. - - -- User Option: transient-detect-key-conflicts - This option controls whether key binding conflicts should be - detected at the time the transient is invoked. If so, this results - in an error, which prevents the transient from being used. Because - of that, conflicts are ignored by default. - - Conflicts cannot be determined earlier, i.e., when the transient is - being defined and when new suffixes are being added, because at - that time there can be false-positives. It is actually valid for - multiple suffixes to share a common key binding, provided the - predicates of those suffixes prevent that more than one of them is - enabled at a time. - - -- User Option: transient-highlight-higher-levels - This option controls whether suffixes that would not be available - by default are highlighted. - - When non-‘nil’ then the descriptions of suffixes are highlighted if - their level is above 4, the default of ‘transient-default-level’. - Assuming you have set that variable to 7, this highlights all - suffixes that won’t be available to users without them making the - same customization. - - -File: transient.info, Node: Modifying Existing Transients, Next: Defining New Commands, Prev: Usage, Up: Top - -3 Modifying Existing Transients -******************************* - -To an extent, transients can be customized interactively, see *note -Enabling and Disabling Suffixes::. This section explains how existing -transients can be further modified non-interactively. - - The following functions share a few arguments: - - • PREFIX is a transient prefix command, a symbol. - - • SUFFIX is a transient infix or suffix specification in the same - form as expected by ‘transient-define-prefix’. Note that an infix - is a special kind of suffix. Depending on context "suffixes" means - "suffixes (including infixes)" or "non-infix suffixes". Here it - means the former. See *note Suffix Specifications::. - - SUFFIX may also be a group in the same form as expected by - ‘transient-define-prefix’. See *note Group Specifications::. - - • LOC is a command, a key vector, a key description (a string as - returned by ‘key-description’), or a list specifying coordinates - (the last element may also be a command or key). For example ‘(1 0 - -1)’ identifies the last suffix (‘-1’) of the first subgroup (‘0’) - of the second group (‘1’). - - If LOC is a list of coordinates, then it can be used to identify a - group, not just an individual suffix command. - - The function ‘transient-get-suffix’ can be useful to determine - whether a certain coordination list identifies the suffix or group - that you expect it to identify. In hairy cases it may be necessary - to look at the definition of the transient prefix command. - - These functions operate on the information stored in the -‘transient--layout’ property of the PREFIX symbol. Suffix entries in -that tree are not objects but have the form ‘(LEVEL CLASS PLIST)’, where -plist should set at least ‘:key’, ‘:description’ and ‘:command’. - - -- Function: transient-insert-suffix prefix loc suffix &optional - keep-other - -- Function: transient-append-suffix prefix loc suffix &optional - keep-other - These functions insert the suffix or group SUFFIX into PREFIX - before or after LOC. - - Conceptually adding a binding to a transient prefix is similar to - adding a binding to a keymap, but this is complicated by the fact - that multiple suffix commands can be bound to the same key, - provided they are never active at the same time, see *note - Predicate Slots::. - - Unfortunately both false-positives and false-negatives are - possible. To deal with the former use non-nil KEEP-OTHER. To deal - with the latter remove the conflicting binding explicitly. - - -- Function: transient-replace-suffix prefix loc suffix - This function replaces the suffix or group at LOC in PREFIX with - suffix or group SUFFIX. - - -- Function: transient-remove-suffix prefix loc - This function removes the suffix or group at LOC in PREFIX. - - -- Function: transient-get-suffix prefix loc - This function returns the suffix or group at LOC in PREFIX. The - returned value has the form mentioned above. - - -- Function: transient-suffix-put prefix loc prop value - This function edits the suffix or group at LOC in PREFIX, by - setting the PROP of its plist to VALUE. - - Most of these functions do not signal an error if they cannot perform -the requested modification. The functions that insert new suffixes show -a warning if LOC cannot be found in PREFIX, without signaling an error. -The reason for doing it like this is that establishing a key binding -(and that is what we essentially are trying to do here) should not -prevent the rest of the configuration from loading. Among these -functions only ‘transient-get-suffix’ and ‘transient-suffix-put’ may -signal an error. - - -File: transient.info, Node: Defining New Commands, Next: Classes and Methods, Prev: Modifying Existing Transients, Up: Top - -4 Defining New Commands -*********************** - -* Menu: - -* Defining Transients:: -* Binding Suffix and Infix Commands:: -* Defining Suffix and Infix Commands:: -* Using Infix Arguments:: -* Transient State:: - - -File: transient.info, Node: Defining Transients, Next: Binding Suffix and Infix Commands, Up: Defining New Commands - -4.1 Defining Transients -======================= - -A transient consists of a prefix command and at least one suffix -command, though usually a transient has several infix and suffix -commands. The below macro defines the transient prefix command *and* -binds the transient’s infix and suffix commands. In other words, it -defines the complete transient, not just the transient prefix command -that is used to invoke that transient. - - -- Macro: transient-define-prefix name arglist [docstring] [keyword - value]... group... [body...] - This macro defines NAME as a transient prefix command and binds the - transient’s infix and suffix commands. - - ARGLIST are the arguments that the prefix command takes. DOCSTRING - is the documentation string and is optional. - - These arguments can optionally be followed by keyword-value pairs. - Each key has to be a keyword symbol, either ‘:class’ or a keyword - argument supported by the constructor of that class. The - ‘transient-prefix’ class is used if the class is not specified - explicitly. - - GROUPs add key bindings for infix and suffix commands and specify - how these bindings are presented in the popup buffer. At least one - GROUP has to be specified. See *note Binding Suffix and Infix - Commands::. - - The BODY is optional. If it is omitted, then ARGLIST is ignored - and the function definition becomes: - - (lambda () - (interactive) - (transient-setup 'NAME)) - - If BODY is specified, then it must begin with an ‘interactive’ form - that matches ARGLIST, and it must call ‘transient-setup’. It may, - however, call that function only when some condition is satisfied. - - All transients have a (possibly ‘nil’) value, which is exported - when suffix commands are called, so that they can consume that - value. For some transients it might be necessary to have a sort of - secondary value, called a "scope". Such a scope would usually be - set in the command’s ‘interactive’ form and has to be passed to the - setup function: - - (transient-setup 'NAME nil nil :scope SCOPE) - - For example, the scope of the ‘magit-branch-configure’ transient is - the branch whose variables are being configured. - - -File: transient.info, Node: Binding Suffix and Infix Commands, Next: Defining Suffix and Infix Commands, Prev: Defining Transients, Up: Defining New Commands - -4.2 Binding Suffix and Infix Commands -===================================== - -The macro ‘transient-define-prefix’ is used to define a transient. This -defines the actual transient prefix command (see *note Defining -Transients::) and adds the transient’s infix and suffix bindings, as -described below. - - Users and third-party packages can add additional bindings using -functions such as ‘transient-insert-suffix’ (See *note Modifying -Existing Transients::). These functions take a "suffix specification" -as one of their arguments, which has the same form as the specifications -used in ‘transient-define-prefix’. - -* Menu: - -* Group Specifications:: -* Suffix Specifications:: - - -File: transient.info, Node: Group Specifications, Next: Suffix Specifications, Up: Binding Suffix and Infix Commands - -4.2.1 Group Specifications --------------------------- - -The suffix and infix commands of a transient are organized in groups. -The grouping controls how the descriptions of the suffixes are outlined -visually but also makes it possible to set certain properties for a set -of suffixes. - - Several group classes exist, some of which organize suffixes in -subgroups. In most cases the class does not have to be specified -explicitly, but see *note Group Classes::. - - Groups are specified in the call to ‘transient-define-prefix’, using -vectors. Because groups are represented using vectors, we cannot use -square brackets to indicate an optional element and instead use curly -brackets to do the latter. - - Group specifications then have this form: - - [{LEVEL} {DESCRIPTION} {KEYWORD VALUE}... ELEMENT...] - - The LEVEL is optional and defaults to 4. See *note Enabling and -Disabling Suffixes::. - - The DESCRIPTION is optional. If present, it is used as the heading -of the group. - - The KEYWORD-VALUE pairs are optional. Each keyword has to be a -keyword symbol, either ‘:class’ or a keyword argument supported by the -constructor of that class. - - • One of these keywords, ‘:description’, is equivalent to specifying - DESCRIPTION at the very beginning of the vector. The - recommendation is to use ‘:description’ if some other keyword is - also used, for consistency, or DESCRIPTION otherwise, because it - looks better. - - • Likewise ‘:level’ is equivalent to LEVEL. - - • Other important keywords include the ‘:if...’ keywords. These - keywords control whether the group is available in a certain - situation. - - For example, one group of the ‘magit-rebase’ transient uses ‘:if - magit-rebase-in-progress-p’, which contains the suffixes that are - useful while rebase is already in progress; and another that uses - ‘:if-not magit-rebase-in-progress-p’, which contains the suffixes - that initiate a rebase. - - These predicates can also be used on individual suffixes and are - only documented once, see *note Predicate Slots::. - - • The value of ‘:hide’, if non-‘nil’, is a predicate that controls - whether the group is hidden by default. The key bindings for - suffixes of a hidden group should all use the same prefix key. - Pressing that prefix key should temporarily show the group and its - suffixes, which assumes that a predicate like this is used: - - (lambda () - (eq (car transient--redisplay-key) - ?\C-c)) ; the prefix key shared by all bindings - - • The value of ‘:setup-children’, if non-‘nil’, is a function that - takes two arguments the group object itself and a list of children. - The children are given as a (potentially empty) list consisting of - either group or suffix specifications. It can make arbitrary - changes to the children including constructing new children from - scratch. Also see ‘transient-setup-children’. - - • The boolean ‘:pad-keys’ argument controls whether keys of all - suffixes contained in a group are right padded, effectively - aligning the descriptions. - - The ELEMENTs are either all subgroups (vectors), or all suffixes -(lists) and strings. (At least currently no group type exists that -would allow mixing subgroups with commands at the same level, though in -principle there is nothing that prevents that.) - - If the ELEMENTs are not subgroups, then they can be a mixture of -lists that specify commands and strings. Strings are inserted verbatim. -The empty string can be used to insert gaps between suffixes, which is -particularly useful if the suffixes are outlined as a table. - - Variables are supported inside group specifications. For example in -place of a direct subgroup specification, a variable can be used whose -value is a vector that qualifies as a group specification. Likewise, a -variable can be used where a suffix specification is expected. Lists of -group or suffix specifications are also supported. Indirect -specifications are resolved when the transient prefix is being defined. - - The form of suffix specifications is documented in the next node. - - -File: transient.info, Node: Suffix Specifications, Prev: Group Specifications, Up: Binding Suffix and Infix Commands - -4.2.2 Suffix Specifications ---------------------------- - -A transient’s suffix and infix commands are bound when the transient -prefix command is defined using ‘transient-define-prefix’, see *note -Defining Transients::. The commands are organized into groups, see -*note Group Specifications::. Here we describe the form used to bind an -individual suffix command. - - The same form is also used when later binding additional commands -using functions such as ‘transient-insert-suffix’, see *note Modifying -Existing Transients::. - - Note that an infix is a special kind of suffix. Depending on context -"suffixes" means "suffixes (including infixes)" or "non-infix suffixes". -Here it means the former. - - Suffix specifications have this form: - - ([LEVEL] [KEY] [DESCRIPTION] COMMAND|ARGUMENT [KEYWORD VALUE]...) - - LEVEL, KEY and DESCRIPTION can also be specified using the KEYWORDs -‘:level’, ‘:key’ and ‘:description’. If the object that is associated -with COMMAND sets these properties, then they do not have to be -specified here. You can however specify them here anyway, possibly -overriding the object’s values just for the binding inside this -transient. - - • LEVEL is the suffix level, an integer between 1 and 7. See *note - Enabling and Disabling Suffixes::. - - • KEY is the key binding, either a vector or key description string. - - • DESCRIPTION is the description, either a string or a function that - returns a string. The function should be a lambda expression to - avoid ambiguity. In some cases a symbol that is bound as a - function would also work but to be safe you should use - ‘:description’ in that case. - - The next element is either a command or an argument. This is the -only argument that is mandatory in all cases. - - • COMMAND should be a symbol that is bound as a function, which has - to be defined or at least autoloaded as a command by the time the - containing prefix command is invoked. - - Any command will do; it does not need to have an object associated - with it (as would be the case if ‘transient-define-suffix’ or - ‘transient-define-infix’ were used to define it). - - Anonymous, dynamically defined suffix commands are also support. - See information about the ‘:setup-children’ function in *note Group - Specifications::. - - As mentioned above, the object that is associated with a command - can be used to set the default for certain values that otherwise - have to be set in the suffix specification. Therefore if there is - no object, then you have to make sure to specify the KEY and the - DESCRIPTION. - - As a special case, if you want to add a command that might be - neither defined nor autoloaded, you can use a workaround like: - - (transient-insert-suffix 'some-prefix "k" - '("!" "Ceci n'est pas une commande" no-command - :if (lambda () (featurep 'no-library)))) - - Instead of ‘featurep’ you could also use ‘require’ with a non-‘nil’ - value for NOERROR. - - • The mandatory argument can also be a command-line argument, a - string. In that case an anonymous command is defined and bound. - - Instead of a string, this can also be a list of two strings, in - which case the first string is used as the short argument (which - can also be specified using ‘:shortarg’) and the second as the long - argument (which can also be specified using ‘:argument’). - - Only the long argument is displayed in the popup buffer. See - ‘transient-detect-key-conflicts’ for how the short argument may be - used. - - Unless the class is specified explicitly, the appropriate class is - guessed based on the long argument. If the argument ends with "=​" - (e.g., "–format=") then ‘transient-option’ is used, otherwise - ‘transient-switch’. - - Finally, details can be specified using optional KEYWORD-VALUE pairs. -Each keyword has to be a keyword symbol, either ‘:class’ or a keyword -argument supported by the constructor of that class. See *note Suffix -Slots::. - - -File: transient.info, Node: Defining Suffix and Infix Commands, Next: Using Infix Arguments, Prev: Binding Suffix and Infix Commands, Up: Defining New Commands - -4.3 Defining Suffix and Infix Commands -====================================== - -Note that an infix is a special kind of suffix. Depending on context -"suffixes" means "suffixes (including infixes)" or "non-infix suffixes". - - -- Macro: transient-define-suffix name arglist [docstring] [keyword - value]... body... - This macro defines NAME as a transient suffix command. - - ARGLIST are the arguments that the command takes. DOCSTRING is the - documentation string and is optional. - - These arguments can optionally be followed by keyword-value pairs. - Each keyword has to be a keyword symbol, either ‘:class’ or a - keyword argument supported by the constructor of that class. The - ‘transient-suffix’ class is used if the class is not specified - explicitly. - - The BODY must begin with an ‘interactive’ form that matches - ARGLIST. The infix arguments are usually accessed by using - ‘transient-args’ inside ‘interactive’. - - -- Macro: transient-define-infix name arglist [docstring] [keyword - value]... - This macro defines NAME as a transient infix command. - - ARGLIST is always ignored (but mandatory never-the-less) and - reserved for future use. DOCSTRING is the documentation string and - is optional. - - The keyword-value pairs are mandatory. All transient infix - commands are ‘equal’ to each other (but not ‘eq’), so it is - meaningless to define an infix command without also setting at - least ‘:class’ and one other keyword (which it is depends on the - used class, usually ‘:argument’ or ‘:variable’). - - Each keyword has to be a keyword symbol, either ‘:class’ or a - keyword argument supported by the constructor of that class. The - ‘transient-switch’ class is used if the class is not specified - explicitly. - - The function definition is always: - - (lambda () - (interactive) - (let ((obj (transient-suffix-object))) - (transient-infix-set obj (transient-infix-read obj))) - (transient--show)) - - ‘transient-infix-read’ and ‘transient-infix-set’ are generic - functions. Different infix commands behave differently because the - concrete methods are different for different infix command classes. - In rare cases the above command function might not be suitable, - even if you define your own infix command class. In that case you - have to use ‘transient-define-suffix’ to define the infix command - and use ‘t’ as the value of the ‘:transient’ keyword. - - -- Macro: transient-define-argument name arglist [docstring] [keyword - value]... - This macro defines NAME as a transient infix command. - - This is an alias for ‘transient-define-infix’. Only use this alias - to define an infix command that actually sets an infix argument. - To define an infix command that, for example, sets a variable, use - ‘transient-define-infix’ instead. - - -File: transient.info, Node: Using Infix Arguments, Next: Transient State, Prev: Defining Suffix and Infix Commands, Up: Defining New Commands - -4.4 Using Infix Arguments -========================= - -The functions and the variables described below allow suffix commands to -access the value of the transient from which they were invoked; which is -the value of its infix arguments. These variables are set when the user -invokes a suffix command that exits the transient, but before actually -calling the command. - - When returning to the command-loop after calling the suffix command, -the arguments are reset to ‘nil’ (which causes the function to return -‘nil’ too). - - Like for Emacs’ prefix arguments, it is advisable, but not mandatory, -to access the infix arguments inside the command’s ‘interactive’ form. -The preferred way of doing that is to call the ‘transient-args’ -function, which for infix arguments serves about the same purpose as -‘prefix-arg’ serves for prefix arguments. - - -- Function: transient-args prefix - This function returns the value of the transient prefix command - PREFIX. - - If the current command was invoked from the transient prefix - command PREFIX, then it returns the active infix arguments. If the - current command was not invoked from PREFIX, then it returns the - set, saved or default value for PREFIX. - - -- Function: transient-arg-value arg args - This function return the value of ARG as it appears in ARGS. - - For a switch a boolean is returned. For an option the value is - returned as a string, using the empty string for the empty value, - or nil if the option does not appear in ARGS. - - -- Function: transient-suffixes prefix - This function returns the suffixes of the transient prefix command - PREFIX. This is a list of objects. This function should only be - used if you need the objects (as opposed to just their values) and - if the current command is not being invoked from PREFIX. - - -- Variable: transient-current-suffixes - The suffixes of the transient from which this suffix command was - invoked. This is a list of objects. Usually it is sufficient to - instead use the function ‘transient-args’, which returns a list of - values. In complex cases it might be necessary to use this - variable instead, i.e., if you need access to information beside - the value. - - -- Variable: transient-current-prefix - The transient from which this suffix command was invoked. The - returned value is a ‘transient-prefix’ object, which holds - information associated with the transient prefix command. - - -- Variable: transient-current-command - The transient from which this suffix command was invoked. The - returned value is a symbol, the transient prefix command. - - -File: transient.info, Node: Transient State, Prev: Using Infix Arguments, Up: Defining New Commands - -4.5 Transient State -=================== - -Invoking a transient prefix command "activates" the respective -transient, i.e., it puts a transient keymap into effect, which binds the -transient’s infix and suffix commands. - - The default behavior while a transient is active is as follows: - - • Invoking an infix command does not affect the transient state; the - transient remains active. - - • Invoking a (non-infix) suffix command "deactivates" the transient - state by removing the transient keymap and performing some - additional cleanup. - - • Invoking a command that is bound in a keymap other than the - transient keymap is disallowed and trying to do so results in a - warning. This does not "deactivate" the transient. - - But these are just the defaults. Whether a certain command -deactivates or "exits" the transient is configurable. There is more -than one way in which a command can be "transient" or "non-transient"; -the exact behavior is implemented by calling a so-called "pre-command" -function. Whether non-suffix commands are allowed to be called is -configurable per transient. - - • The transient-ness of suffix commands (including infix commands) is - controlled by the value of their ‘transient’ slot, which can be set - either when defining the command or when adding a binding to a - transient while defining the respective transient prefix command. - - Valid values are booleans and the pre-commands described below. - - • ‘t’ is equivalent to ‘transient--do-stay’. - • ‘nil’ is equivalent to ‘transient--do-exit’. - • If ‘transient’ is unbound (and that is actually the default - for non-infix suffixes) then the value of the prefix’s - ‘transient-suffix’ slot is used instead. The default value of - that slot is ‘nil’, so the suffix’s ‘transient’ slot being - unbound is essentially equivalent to it being ‘nil’. - - • A suffix command can be a prefix command itself, i.e., a - "sub-prefix". While a sub-prefix is active we nearly always want - ‘C-g’ to take the user back to the "super-prefix". However in rare - cases this may not be desirable, and that makes the following - complication necessary: - - For ‘transient-suffix’ objects the ‘transient’ slot is unbound. We - can ignore that for the most part because, as stated above, ‘nil’ - and the slot being unbound are equivalent, and mean "do exit". - That isn’t actually true for suffixes that are sub-prefixes though. - For such suffixes unbound means "do exit but allow going back", - which is the default, while ‘nil’ means "do exit permanently", - which requires that slot to be explicitly set to that value. - - • The transient-ness of certain built-in suffix commands is specified - using ‘transient-predicate-map’. This is a special keymap, which - binds commands to pre-commands (as opposed to keys to commands) and - takes precedence over the ‘transient’ slot. - - The available pre-command functions are documented below. They are -called by ‘transient--pre-command’, a function on ‘pre-command-hook’ and -the value that they return determines whether the transient is exited. -To do so the value of one of the constants ‘transient--exit’ or -‘transient--stay’ is used (that way we don’t have to remember if ‘t’ -means "exit" or "stay"). - - Additionally, these functions may change the value of ‘this-command’ -(which explains why they have to be called using ‘pre-command-hook’), -call ‘transient-export’, ‘transient--stack-zap’ or -‘transient--stack-push’; and set the values of ‘transient--exitp’, -‘transient--helpp’ or ‘transient--editp’. - -Pre-commands for Infixes ------------------------- - -The default for infixes is ‘transient--do-stay’. This is also the only -function that makes sense for infixes. - - -- Function: transient--do-stay - Call the command without exporting variables and stay transient. - -Pre-commands for Suffixes -------------------------- - -The default for suffixes is ‘transient--do-exit’. - - -- Function: transient--do-exit - Call the command after exporting variables and exit the transient. - - -- Function: transient--do-return - Call the command after exporting variables and return to parent - prefix. If there is no parent prefix, then call - ‘transient--do-exit’. - - -- Function: transient--do-call - Call the command after exporting variables and stay transient. - - The following pre-commands are suitable for sub-prefixes. Only the -first should ever explicitly be set as the value of the ‘transient’ -slot. - - -- Function: transient--do-recurse - Call the transient prefix command, preparing for return to active - transient. - - Whether we actually return to the parent transient is ultimately - under the control of each invoked suffix. The difference between - this pre-command and ‘transient--do-replace’ is that it changes the - value of the ‘transient-suffix’ slot to ‘transient--do-return’. - - If there is no parent transient, then only call this command and - skip the second step. - - -- Function: transient--do-replace - Call the transient prefix command, replacing the active transient. - - Unless ‘transient--do-recurse’ is explicitly used, this pre-command - is automatically used for suffixes that are prefixes themselves, - i.e., for sub-prefixes. - - -- Function: transient--do-suspend - Suspend the active transient, saving the transient stack. - - This is used by the command ‘transient-suspend’ and optionally also - by "external events" such as ‘handle-switch-frame’. Such bindings - should be added to ‘transient-predicate-map’. - -Pre-commands for Non-Suffixes ------------------------------ - -The default for non-suffixes, i.e commands that are bound in other -keymaps beside the transient keymap, is ‘transient--do-warn’. Silently -ignoring the user-error is also an option, though probably not a good -one. - - If you want to let the user invoke non-suffix commands, then use -‘transient--do-stay’ as the value of the prefix’s ‘transient-non-suffix’ -slot. - - -- Function: transient--do-warn - Call ‘transient-undefined’ and stay transient. - - -- Function: transient--do-noop - Call ‘transient-noop’ and stay transient. - -Special Pre-Commands --------------------- - - -- Function: transient--do-quit-one - If active, quit help or edit mode, else exit the active transient. - - This is used when the user pressed ‘C-g’. - - -- Function: transient--do-quit-all - Exit all transients without saving the transient stack. - - This is used when the user pressed ‘C-q’. - - -- Function: transient--do-suspend - Suspend the active transient, saving the transient stack. - - This is used when the user pressed ‘C-z’. - - -File: transient.info, Node: Classes and Methods, Next: Related Abstractions and Packages, Prev: Defining New Commands, Up: Top - -5 Classes and Methods -********************* - -Transient uses classes and generic functions to make it possible to -define new types of suffix commands that are similar to existing types, -but behave differently in some aspects. It does the same for groups and -prefix commands, though at least for prefix commands that *currently* -appears to be less important. - - Every prefix, infix and suffix command is associated with an object, -which holds information that controls certain aspects of its behavior. -This happens in two ways. - - • Associating a command with a certain class gives the command a - type. This makes it possible to use generic functions to do - certain things that have to be done differently depending on what - type of command it acts on. - - That in turn makes it possible for third-parties to add new types - without having to convince the maintainer of Transient that that - new type is important enough to justify adding a special case to a - dozen or so functions. - - • Associating a command with an object makes it possible to easily - store information that is specific to that particular command. - - Two commands may have the same type, but obviously their key - bindings and descriptions still have to be different, for example. - - The values of some slots are functions. The ‘reader’ slot for - example holds a function that is used to read a new value for an - infix command. The values of such slots are regular functions. - - Generic functions are used when a function should do something - different based on the type of the command, i.e., when all commands - of a certain type should behave the same way but different from the - behavior for other types. Object slots that hold a regular - function as value are used when the task that they perform is - likely to differ even between different commands of the same type. - -* Menu: - -* Group Classes:: -* Group Methods:: -* Prefix Classes:: -* Suffix Classes:: -* Suffix Methods:: -* Prefix Slots:: -* Suffix Slots:: -* Predicate Slots:: - - -File: transient.info, Node: Group Classes, Next: Group Methods, Up: Classes and Methods - -5.1 Group Classes -================= - -The type of a group can be specified using the ‘:class’ property at the -beginning of the class specification, e.g., ‘[:class transient-columns -...]’ in a call to ‘transient-define-prefix’. - - • The abstract ‘transient-child’ class is the base class of both - ‘transient-group’ (and therefore all groups) as well as of - ‘transient-suffix’ (and therefore all suffix and infix commands). - - This class exists because the elements (aka "children") of certain - groups can be other groups instead of suffix and infix commands. - - • The abstract ‘transient-group’ class is the superclass of all other - group classes. - - • The ‘transient-column’ class is the simplest group. - - This is the default "flat" group. If the class is not specified - explicitly and the first element is not a vector (i.e., not a - group), then this class is used. - - This class displays each element on a separate line. - - • The ‘transient-row’ class displays all elements on a single line. - - • The ‘transient-columns’ class displays commands organized in - columns. - - Direct elements have to be groups whose elements have to be - commands or strings. Each subgroup represents a column. This - class takes care of inserting the subgroups’ elements. - - This is the default "nested" group. If the class is not specified - explicitly and the first element is a vector (i.e., a group), then - this class is used. - - • The ‘transient-subgroups’ class wraps other groups. - - Direct elements have to be groups whose elements have to be - commands or strings. This group inserts an empty line between - subgroups. The subgroups themselves are responsible for displaying - their elements. - - -File: transient.info, Node: Group Methods, Next: Prefix Classes, Prev: Group Classes, Up: Classes and Methods - -5.2 Group Methods -================= - - -- Function: transient-setup-children group children - This generic function can be used to setup the children or a group. - - The default implementation usually just returns the children - unchanged, but if the ‘setup-children’ slot of GROUP is non-‘nil’, - then it calls that function with CHILDREN as the only argument and - returns the value. - - The children are given as a (potentially empty) list consisting of - either group or suffix specifications. These functions can make - arbitrary changes to the children including constructing new - children from scratch. - - -- Function: transient--insert-group group - This generic function formats the group and its elements and - inserts the result into the current buffer, which is a temporary - buffer. The contents of that buffer are later inserted into the - popup buffer. - - Functions that are called by this function may need to operate in - the buffer from which the transient was called. To do so they can - temporarily make the ‘transient--source-buffer’ the current buffer. - - -File: transient.info, Node: Prefix Classes, Next: Suffix Classes, Prev: Group Methods, Up: Classes and Methods - -5.3 Prefix Classes -================== - -Currently the ‘transient-prefix’ class is being used for all prefix -commands and there is only a single generic function that can be -specialized based on the class of a prefix command. - - -- Function: transient--history-init obj - This generic function is called while setting up the transient and - is responsible for initializing the ‘history’ slot. This is the - transient-wide history; many individual infixes also have a history - of their own. - - The default (and currently only) method extracts the value from the - global variable ‘transient-history’. - - A transient prefix command’s object is stored in the -‘transient--prefix’ property of the command symbol. While a transient -is active, a clone of that object is stored in the variable -‘transient--prefix’. A clone is used because some changes that are made -to the active transient’s object should not affect later invocations. - - -File: transient.info, Node: Suffix Classes, Next: Suffix Methods, Prev: Prefix Classes, Up: Classes and Methods - -5.4 Suffix Classes -================== - - • All suffix and infix classes derive from ‘transient-suffix’, which - in turn derives from ‘transient-child’, from which - ‘transient-group’ also derives (see *note Group Classes::). - - • All infix classes derive from the abstract ‘transient-infix’ class, - which in turn derives from the ‘transient-suffix’ class. - - Infixes are a special type of suffixes. The primary difference is - that infixes always use the ‘transient--do-stay’ pre-command, while - non-infix suffixes use a variety of pre-commands (see *note - Transient State::). Doing that is most easily achieved by using - this class, though theoretically it would be possible to define an - infix class that does not do so. If you do that then you get to - implement many methods. - - Also, infixes and non-infix suffixes are usually defined using - different macros (see *note Defining Suffix and Infix Commands::). - - • Classes used for infix commands that represent arguments should be - derived from the abstract ‘transient-argument’ class. - - • The ‘transient-switch’ class (or a derived class) is used for infix - arguments that represent command-line switches (arguments that do - not take a value). - - • The ‘transient-option’ class (or a derived class) is used for infix - arguments that represent command-line options (arguments that do - take a value). - - • The ‘transient-switches’ class can be used for a set of mutually - exclusive command-line switches. - - • The ‘transient-files’ class can be used for a "–" argument that - indicates that all remaining arguments are files. - - • Classes used for infix commands that represent variables should - derived from the abstract ‘transient-variables’ class. - - Magit defines additional classes, which can serve as examples for the -fancy things you can do without modifying Transient. Some of these -classes will likely get generalized and added to Transient. For now -they are very much subject to change and not documented. - - -File: transient.info, Node: Suffix Methods, Next: Prefix Slots, Prev: Suffix Classes, Up: Classes and Methods - -5.5 Suffix Methods -================== - -To get information about the methods implementing these generic -functions use ‘describe-function’. - -* Menu: - -* Suffix Value Methods:: -* Suffix Format Methods:: - - -File: transient.info, Node: Suffix Value Methods, Next: Suffix Format Methods, Up: Suffix Methods - -5.5.1 Suffix Value Methods --------------------------- - - -- Function: transient-init-value obj - This generic function sets the initial value of the object OBJ. - - This function is called for all suffix commands, but unless a - concrete method is implemented this falls through to the default - implementation, which is a noop. In other words this usually only - does something for infix commands, but note that this is not - implemented for the abstract class ‘transient-infix’, so if your - class derives from that directly, then you must implement a method. - - -- Function: transient-infix-read obj - This generic function determines the new value of the infix object - OBJ. - - This function merely determines the value; ‘transient-infix-set’ is - used to actually store the new value in the object. - - For most infix classes this is done by reading a value from the - user using the reader specified by the ‘reader’ slot (using the - ‘transient-infix-value’ method described below). - - For some infix classes the value is changed without reading - anything in the minibuffer, i.e., the mere act of invoking the - infix command determines what the new value should be, based on the - previous value. - - -- Function: transient-prompt obj - This generic function returns the prompt to be used to read infix - object OBJ’s value. - - -- Function: transient-infix-set obj value - This generic function sets the value of infix object OBJ to VALUE. - - -- Function: transient-infix-value obj - This generic function returns the value of the suffix object OBJ. - - This function is called by ‘transient-args’ (which see), meaning - this function is how the value of a transient is determined so that - the invoked suffix command can use it. - - Currently most values are strings, but that is not set in stone. - ‘nil’ is not a value, it means "no value". - - Usually only infixes have a value, but see the method for - ‘transient-suffix’. - - -- Function: transient-init-scope obj - This generic function sets the scope of the suffix object OBJ. - - The scope is actually a property of the transient prefix, not of - individual suffixes. However it is possible to invoke a suffix - command directly instead of from a transient. In that case, if the - suffix expects a scope, then it has to determine that itself and - store it in its ‘scope’ slot. - - This function is called for all suffix commands, but unless a - concrete method is implemented this falls through to the default - implementation, which is a noop. - - -File: transient.info, Node: Suffix Format Methods, Prev: Suffix Value Methods, Up: Suffix Methods - -5.5.2 Suffix Format Methods ---------------------------- - - -- Function: transient-format obj - This generic function formats and returns OBJ for display. - - When this function is called, then the current buffer is some - temporary buffer. If you need the buffer from which the prefix - command was invoked to be current, then do so by temporarily making - ‘transient--source-buffer’ current. - - -- Function: transient-format-key obj - This generic function formats OBJ’s ‘key’ for display and returns - the result. - - -- Function: transient-format-description obj - This generic function formats OBJ’s ‘description’ for display and - returns the result. - - -- Function: transient-format-value obj - This generic function formats OBJ’s value for display and returns - the result. - - -- Function: transient-show-help obj - Show help for the prefix, infix or suffix command represented by - OBJ. - - For prefixes, show the info manual, if that is specified using the - ‘info-manual’ slot. Otherwise, show the manpage if that is - specified using the ‘man-page’ slot. Otherwise, show the command’s - doc string. - - For suffixes, show the command’s doc string. - - For infixes, show the manpage if that is specified. Otherwise show - the command’s doc string. - - -File: transient.info, Node: Prefix Slots, Next: Suffix Slots, Prev: Suffix Methods, Up: Classes and Methods - -5.6 Prefix Slots -================ - - • ‘show-help’, ‘man-page’ or ‘info-manual’ can be used to specify the - documentation for the prefix and its suffixes. The command - ‘transient-help’ uses the method ‘transient-show-help’ (which see) - to lookup and use these values. - - • ‘history-key’ If multiple prefix commands should share a single - value, then this slot has to be set to the same value for all of - them. You probably don’t want that. - - • ‘transient-suffix’ and ‘transient-non-suffix’ play a part when - determining whether the currently active transient prefix command - remains active/transient when a suffix or abitrary non-suffix - command is invoked. See *note Transient State::. - - • ‘incompatible’ A list of lists. Each sub-list specifies a set of - mutually exclusive arguments. Enabling one of these arguments - causes the others to be disabled. An argument may appear in - multiple sub-lists. - - • ‘scope’ For some transients it might be necessary to have a sort of - secondary value, called a "scope". See ‘transient-define-prefix’. - -Internal Prefix Slots ---------------------- - -These slots are mostly intended for internal use. They should not be -set in calls to ‘transient-define-prefix’. - - • ‘prototype’ When a transient prefix command is invoked, then a - clone of that object is stored in the global variable - ‘transient--prefix’ and the prototype is stored in the clone’s - ‘prototype’ slot. - - • ‘command’ The command, a symbol. Each transient prefix command - consists of a command, which is stored in a symbol’s function slot - and an object, which is stored in the ‘transient--prefix’ property - of the same symbol. - - • ‘level’ The level of the prefix commands. The suffix commands - whose layer is equal or lower are displayed. See *note Enabling - and Disabling Suffixes::. - - • ‘value’ The likely outdated value of the prefix. Instead of - accessing this slot directly you should use the function - ‘transient-get-value’, which is guaranteed to return the up-to-date - value. - - • ‘history’ and ‘history-pos’ are used to keep track of historic - values. Unless you implement your own ‘transient-infix-read’ - method you should not have to deal with these slots. - - -File: transient.info, Node: Suffix Slots, Next: Predicate Slots, Prev: Prefix Slots, Up: Classes and Methods - -5.7 Suffix Slots -================ - -Here we document most of the slots that are only available for suffix -objects. Some slots are shared by suffix and group objects, they are -documented in *note Predicate Slots::. - - Also see *note Suffix Classes::. - -Slots of ‘transient-suffix’ ---------------------------- - - • ‘key’ The key, a key vector or a key description string. - - • ‘command’ The command, a symbol. - - • ‘transient’ Whether to stay transient. See *note Transient - State::. - - • ‘format’ The format used to display the suffix in the popup buffer. - It must contain the following %-placeholders: - - • ‘%k’ For the key. - • ‘%d’ For the description. - • ‘%v’ For the infix value. Non-infix suffixes don’t have a - value. - - • ‘description’ The description, either a string or a function that - is called with no argument and returns a string. - - • ‘show-help’ A function used to display help for the suffix. If - unspecified, the prefix controls how hlep is displayed for its - suffixes. - -Slots of ‘transient-infix’ --------------------------- - -Some of these slots are only meaningful for some of the subclasses. -They are defined here anyway to allow sharing certain methods. - - • ‘argument’ The long argument, e.g., ‘--verbose’. - - • ‘shortarg’ The short argument, e.g., ‘-v’. - - • ‘value’ The value. Should not be accessed directly. - - • ‘init-value’ Function that is responsible for setting the object’s - value. If bound, then this is called with the object as the only - argument. Usually this is not bound, in which case the object’s - primary ‘transient-init-value’ method is called instead. - - • ‘unsavable’ Whether the value of the suffix is not saved as part of - the prefixes. - - • ‘multi-value’ For options, whether the option can have multiple - values. If this is non-‘nil’, then the values are read using - ‘completing-read-multiple’ by default and if you specify your own - reader, then it should read the values using that function or - similar. - - Supported non-‘nil’ values are: - - • Use ‘rest’ for an option that can have multiple values. This - is useful e.g., for an ‘--’ argument that indicates that all - remaining arguments are files (such as ‘git log -- file1 - file2’). - - In the list returned by ‘transient-args’ such an option and - its values are represented by a single list of the form - ‘(ARGUMENT . VALUES)’. - - • Use ‘repeat’ for an option that can be specified multiple - times. - - In the list returned by ‘transient-args’ each instance of the - option and its value appears separately in the usual from, for - example: ‘("--another-argument" "--option=first" - "--option=second")’. - - In both cases the option’s values have to be specified in the - default value of a prefix using the same format as returned by - ‘transient-args’, e.g., ‘("--other" "--o=1" "--o=2" ("--" "f1" - "f2"))’. - - • ‘always-read’ For options, whether to read a value on every - invocation. If this is nil, then options that have a value are - simply unset and have to be invoked a second time to set a new - value. - - • ‘allow-empty’ For options, whether the empty string is a valid - value. - - • ‘history-key’ The key used to store the history. This defaults to - the command name. This is useful when multiple infixes should - share the same history because their values are of the same kind. - - • ‘reader’ The function used to read the value of an infix. Not used - for switches. The function takes three arguments, PROMPT, - INITIAL-INPUT and HISTORY, and must return a string. - - • ‘prompt’ The prompt used when reading the value, either a string or - a function that takes the object as the only argument and which - returns a prompt string. - - • ‘choices’ A list of valid values. How exactly that is used depends - on the class of the object. - -Slots of ‘transient-variable’ ------------------------------ - - • ‘variable’ The variable. - -Slots of ‘transient-switches’ ------------------------------ - - • ‘argument-format’ The display format. Must contain ‘%s’, one of - the ‘choices’ is substituted for that. e.g., ‘--%s-order’. - - • ‘argument-regexp’ The regexp used to match any one of the switches. - e.g., ‘\\(--\\(topo\\|author-date\\|date\\)-order\\)’. - - -File: transient.info, Node: Predicate Slots, Prev: Suffix Slots, Up: Classes and Methods - -5.8 Predicate Slots -=================== - -Suffix and group objects share some predicate slots that control whether -a group or suffix should be available depending on some state. Only one -of these slots can be used at the same time. It is undefined what -happens if you use more than one. - - • ‘if’ Enable if predicate returns non-‘nil’. - • ‘if-not’ Enable if predicate returns nil. - • ‘if-non-~nil~’ Enable if variable’s value is non-‘nil’. - • ‘if-nil’ Enable if variable’s value is nil. - • ‘if-mode’ Enable if major-mode matches value. - • ‘if-not-mode’ Enable if major-mode does not match value. - • ‘if-derived’ Enable if major-mode derives from value. - • ‘if-not-derived’ Enable if major-mode does not derive from value. - - One more slot is shared between group and suffix classes, ‘level’. -Like the slots documented above, it is a predicate, but it is used for a -different purpose. The value has to be an integer between 1 and 7. -‘level’ controls whether a suffix or a group should be available -depending on user preference. See *note Enabling and Disabling -Suffixes::. - - -File: transient.info, Node: Related Abstractions and Packages, Next: FAQ, Prev: Classes and Methods, Up: Top - -6 Related Abstractions and Packages -*********************************** - -* Menu: - -* Comparison With Prefix Keys and Prefix Arguments:: -* Comparison With Other Packages:: - - -File: transient.info, Node: Comparison With Prefix Keys and Prefix Arguments, Next: Comparison With Other Packages, Up: Related Abstractions and Packages - -6.1 Comparison With Prefix Keys and Prefix Arguments -==================================================== - -While transient commands were inspired by regular prefix keys and prefix -arguments, they are also quite different and much more complex. - - The following diagrams illustrate some of the differences. - - • ‘(c)’ represents a return to the command loop. - • ‘(+)’ represents the user’s choice to press one key or another. - • ‘{WORD}’ are possible behaviors. - • ‘{NUMBER}’ is a footnote. - -Regular Prefix Commands ------------------------ - -See *note (elisp)Prefix Keys::. - - ,--> command1 --> (c) - | - (c)-(+)-> prefix command or key --+--> command2 --> (c) - | - `--> command3 --> (c) - -Regular Prefix Arguments ------------------------- - -See *note (elisp)Prefix Command Arguments::. - - ,----------------------------------, - | | - v | - (c)-(+)---> prefix argument command --(c)-(+)-> any command --> (c) - | ^ | - | | | - `-- sets or changes --, ,-- maybe used --' | - | | | - v | | - prefix argument state | - ^ | - | | - `-------- discards --------' - -Transients ----------- - -(∩`-´)⊃━☆゚.*・。゚ - - This diagram ignores the infix value and external state: - - (c) - | ,- {stay} ------<-,-<------------<-,-<---, - (+) | | | | - | | | | | - | | ,--> infix1 --| | | - | | | | | | - | | |--> infix2 --| | | - v v | | | | - prefix -(c)-(+)-> infix3 --' ^ | - | | | - |---------------> suffix1 -->--| | - | | | - |---------------> suffix2 ----{1}------> {exit} --> (c) - | | - |---------------> suffix3 -------------> {exit} --> (c) - | | - `--> any command --{2}-> {warn} -->--| - | | - |--> {noop} -->--| - | | - |--> {call} -->--' - | - `------------------> {exit} --> (c) - - This diagram takes the infix value into account to an extend, while -still ignoring external state: - - (c) - | ,- {stay} ------<-,-<------------<-,-<---, - (+) | | | | - | | | | | - | | ,--> infix1 --| | | - | | | | | | | - | | ,--> infix2 --| | | - v v | | | | | - prefix -(c)-(+)-> infix3 --' | | - | | ^ | - | | | | - |---------------> suffix1 -->--| | - | | ^ | | - | | | | | - |---------------> suffix2 ----{1}------> {exit} --> (c) - | | ^ | | - | | | | v - | | | | | - |---------------> suffix3 -------------> {exit} --> (c) - | | ^ | | - | sets | | v - | | maybe | | - | | used | | - | | | | | - | | infix --' | | - | `---> value | | - | ^ | | - | | | | - | hides | | - | | | | - | `--------------------------<---| - | | | - `--> any command --{2}-> {warn} -->--| | - | | | - |--> {noop} -->--| | - | | | - |--> {call} -->--' ^ - | | - `------------------> {exit} --> (c) - - This diagram provides more information about the infix value and also -takes external state into account. - - ,----sets--- "anything" - | - v - ,---------> external - | state - | | | - | initialized | ☉‿⚆ - sets from | - | | maybe - | ,----------' used - | | | - (c) | | v - | ,- {stay} --|---<-,-<------|-----<-,-<---, - (+) | | | | | | | - | | | v | | | | - | | ,--> infix1 --| | | | - | | | | | | | | | - | | | | v | | | | - | | ,--> infix2 --| | | | - | | | | ^ | | | | - v v | | | | | | | - prefix -(c)-(+)-> infix3 --' | | | - | | ^ | ^ | - | | | v | | - |---------------> suffix1 -->--| | - | | | ^ | | | - | | | | v | | - |---------------> suffix2 ----{1}------> {exit} --> (c) - | | | ^ | | | - | | | | | | v - | | | | v | | - |---------------> suffix3 -------------> {exit} --> (c) - | | | ^ | | - | sets | | | v - | | initialized maybe | | - | | from used | | - | | | | | | - | | `-- infix ---' | | - | `---> value -----------------------------> persistent - | ^ ^ | | across - | | | | | invocations -, - | hides | | | | - | | `----------------------------------------------' - | | | | - | `--------------------------<---| - | | | - `--> any command --{2}-> {warn} -->--| | - | | | - |--> {noop} -->--| | - | | | - |--> {call} -->--' ^ - | | - `------------------> {exit} --> (c) - - • ‘{1}’ Transients can be configured to be exited when a suffix - command is invoked. The default is to do so for all suffixes - except for those that are common to all transients and which are - used to perform tasks such as providing help and saving the value - of the infix arguments for future invocations. The behavior can - also be specified for individual suffix commands and may even - depend on state. - - • ‘{2}’ Transients can be configured to allow the user to invoke - non-suffix commands. The default is to not allow that and instead - warn the user. - - Despite already being rather complex, even the last diagram leaves -out many details. Most importantly it implies that the decision whether -to remain transient is made later than it actually is made (for the most -part a function on ‘pre-command-hook’ is responsible). But such -implementation details are of little relevance to users and are covered -elsewhere. - - -File: transient.info, Node: Comparison With Other Packages, Prev: Comparison With Prefix Keys and Prefix Arguments, Up: Related Abstractions and Packages - -6.2 Comparison With Other Packages -================================== - -Magit-Popup ------------ - -Transient is the successor to Magit-Popup (see *note -(magit-popup)Top::). - - One major difference between these two implementations of the same -ideas is that while Transient uses transient keymaps and embraces the -command-loop, Magit-Popup implemented an inferior mechanism that does -not use transient keymaps and that instead of using the command-loop -implements a naive alternative based on ‘read-char’. - - Magit-Popup does not use classes and generic functions and defining a -new command type is near impossible as it involves adding hard-coded -special-cases to many functions. Because of that only a single new type -was added, which was not already part of Magit-Popup’s initial release. - - A lot of things are hard-coded in Magit-Popup. One random example is -that the key bindings for switches must begin with "-" and those for -options must begin with "=". - -Hydra ------ - -Hydra (see ) is another package that -provides features similar to those of Transient. - - Both packages use transient keymaps to make a set of commands -temporarily available and show the available commands in a popup buffer. - - A Hydra "body" is equivalent to a Transient "prefix" and a Hydra -"head" is equivalent to a Transient "suffix". Hydra has no equivalent -of a Transient "infix". - - Both hydras and transients can be used as simple command dispatchers. -Used like this they are similar to regular prefix commands and prefix -keys, except that the available commands are shown in the popup buffer. - - (Another package that does this is ‘which-key’. It does so -automatically for any incomplete key sequence. The advantage of that -approach is that no additional work is necessary; the disadvantage is -that the available commands are not organized semantically.) - - Both Hydra and Transient provide features that go beyond simple -command dispatchers: - - • Invoking a command from a hydra does not necessarily exit the - hydra. That makes it possible to invoke the same command again, - but using a shorter key sequence (i.e., the key that was used to - enter the hydra does not have to be pressed again). - - Transient supports that too, but for now this feature is not a - focus and the interface is a bit more complicated. A very basic - example using the current interface: - - (transient-define-prefix outline-navigate () - :transient-suffix 'transient--do-stay - :transient-non-suffix 'transient--do-warn - [("p" "previous visible heading" outline-previous-visible-heading) - ("n" "next visible heading" outline-next-visible-heading)]) - - • Transient supports infix arguments; values that are set by infix - commands and then consumed by the invoked suffix command(s). - - To my knowledge, Hydra does not support that. - - Both packages make it possible to specify how exactly the available -commands are outlined: - - • With Hydra this is often done using an explicit format string, - which gives authors a lot of flexibility and makes it possible to - do fancy things. - - The downside of this is that it becomes harder for a user to add - additional commands to an existing hydra and to change key - bindings. - - • Transient allows the author of a transient to organize the commands - into groups and the use of generic functions allows authors of - transients to control exactly how a certain command type is - displayed. - - However while Transient supports giving sections a heading it does - not currently support giving the displayed information more - structure by, for example, using box-drawing characters. - - That could be implemented by defining a new group class, which lets - the author specify a format string. It should be possible to - implement that without modifying any existing code, but it does not - currently exist. - - -File: transient.info, Node: FAQ, Next: Keystroke Index, Prev: Related Abstractions and Packages, Up: Top - -Appendix A FAQ -************** - -A.1 Can I control how the popup buffer is displayed? -==================================================== - -Yes, see ‘transient-display-buffer-action’ in *note Configuration::. - -A.2 Why did some of the key bindings change? -============================================ - -You may have noticed that the bindings for some of the common commands -do *not* have the prefix ‘C-x’ and that furthermore some of these -commands are grayed out while others are not. That unfortunately is a -bit confusing if the section of common commands is not shown -permanently, making the following explanation necessary. - - The purpose of usually hiding that section but showing it after the -user pressed the respective prefix key is to conserve space and not -overwhelm users with too much noise, while allowing the user to quickly -list common bindings on demand. - - That however should not keep us from using the best possible key -bindings. The bindings that do use a prefix do so to avoid wasting too -many non-prefix bindings, keeping them available for use in individual -transients. The bindings that do not use a prefix and that are *not* -grayed out are very important bindings that are *always* available, even -when invoking the "common command key prefix" or *any other* -transient-specific prefix. The non-prefix keys that *are* grayed out -however, are not available when any incomplete prefix key sequence is -active. They do not use the "common command key prefix" because it is -likely that users want to invoke them several times in a row and e.g., -‘M-p M-p M-p’ is much more convenient than ‘C-x M-p C-x M-p C-x M-p’. - - You may also have noticed that the "Set" command is bound to ‘C-x s’, -while Magit-Popup used to bind ‘C-c C-c’ instead. I have seen several -users praise the latter binding (sic), so I did not change it -willy-nilly. The reason that I changed it is that using different -prefix keys for different common commands, would have made the temporary -display of the common commands even more confusing, i.e., after pressing -‘C-c’ all the ‘C-x ...’ bindings would be grayed out. - - Using a single prefix for common commands key means that all other -potential prefix keys can be used for transient-specific commands -*without* the section of common commands also popping up. ‘C-c’ in -particular is a prefix that I want to (and already do) use for Magit, -and also using that for a common command would prevent me from doing so. - - (Also see the next question.) - -A.3 Why does ‘q’ not quit popups anymore? -========================================= - -I agree that ‘q’ is a good binding for commands that quit something. -This includes quitting whatever transient is currently active, but it -also includes quitting whatever it is that some specific transient is -controlling. The transient ‘magit-blame’ for example binds ‘q’ to the -command that turns ‘magit-blame-mode’ off. - - So I had to decide if ‘q’ should quit the active transient (like -Magit-Popup used to) or whether ‘C-g’ should do that instead, so that -‘q’ could be bound in individual transient to whatever commands make -sense for them. Because all other letters are already reserved for use -by individual transients, I have decided to no longer make an exception -for ‘q’. - - If you want to get ‘q’’s old binding back then you can do so. Doing -that is a bit more complicated than changing a single key binding, so I -have implemented a function, ‘transient-bind-q-to-quit’ that makes the -necessary changes. See its doc string for more information. - - -File: transient.info, Node: Keystroke Index, Next: Command and Function Index, Prev: FAQ, Up: Top - -Appendix B Keystroke Index -************************** - -[index] -* Menu: - -* C-g: Aborting and Resuming Transients. - (line 27) -* C-g <1>: Aborting and Resuming Transients. - (line 27) -* C-h: Getting Help for Suffix Commands. - (line 11) -* C-M-n: Using History. (line 18) -* C-M-p: Using History. (line 13) -* C-q: Aborting and Resuming Transients. - (line 36) -* C-x C-k: Saving Values. (line 29) -* C-x C-s: Saving Values. (line 25) -* C-x l: Enabling and Disabling Suffixes. - (line 43) -* C-x n: Using History. (line 18) -* C-x p: Using History. (line 13) -* C-x s: Saving Values. (line 21) -* C-x t: Common Suffix Commands. - (line 18) -* C-z: Aborting and Resuming Transients. - (line 41) - - -File: transient.info, Node: Command and Function Index, Next: Variable Index, Prev: Keystroke Index, Up: Top - -Appendix C Command and Function Index -************************************* - -[index] -* Menu: - -* transient--do-call: Transient State. (line 99) -* transient--do-exit: Transient State. (line 91) -* transient--do-noop: Transient State. (line 147) -* transient--do-quit-all: Transient State. (line 158) -* transient--do-quit-one: Transient State. (line 153) -* transient--do-recurse: Transient State. (line 106) -* transient--do-replace: Transient State. (line 118) -* transient--do-return: Transient State. (line 94) -* transient--do-stay: Transient State. (line 83) -* transient--do-suspend: Transient State. (line 125) -* transient--do-suspend <1>: Transient State. (line 163) -* transient--do-warn: Transient State. (line 144) -* transient--history-init: Prefix Classes. (line 10) -* transient--insert-group: Group Methods. (line 19) -* transient-append-suffix: Modifying Existing Transients. - (line 44) -* transient-arg-value: Using Infix Arguments. - (line 31) -* transient-args: Using Infix Arguments. - (line 22) -* transient-define-argument: Defining Suffix and Infix Commands. - (line 61) -* transient-define-infix: Defining Suffix and Infix Commands. - (line 26) -* transient-define-prefix: Defining Transients. (line 13) -* transient-define-suffix: Defining Suffix and Infix Commands. - (line 9) -* transient-format: Suffix Format Methods. - (line 6) -* transient-format-description: Suffix Format Methods. - (line 18) -* transient-format-key: Suffix Format Methods. - (line 14) -* transient-format-value: Suffix Format Methods. - (line 22) -* transient-get-suffix: Modifying Existing Transients. - (line 66) -* transient-help: Getting Help for Suffix Commands. - (line 11) -* transient-history-next: Using History. (line 18) -* transient-history-prev: Using History. (line 13) -* transient-infix-read: Suffix Value Methods. - (line 16) -* transient-infix-set: Suffix Value Methods. - (line 36) -* transient-infix-value: Suffix Value Methods. - (line 39) -* transient-init-scope: Suffix Value Methods. - (line 52) -* transient-init-value: Suffix Value Methods. - (line 6) -* transient-insert-suffix: Modifying Existing Transients. - (line 42) -* transient-prompt: Suffix Value Methods. - (line 32) -* transient-quit-all: Aborting and Resuming Transients. - (line 36) -* transient-quit-one: Aborting and Resuming Transients. - (line 27) -* transient-quit-seq: Aborting and Resuming Transients. - (line 27) -* transient-remove-suffix: Modifying Existing Transients. - (line 63) -* transient-replace-suffix: Modifying Existing Transients. - (line 59) -* transient-resume: Aborting and Resuming Transients. - (line 53) -* transient-save: Saving Values. (line 25) -* transient-save <1>: Saving Values. (line 29) -* transient-scroll-down: Other Commands. (line 17) -* transient-scroll-up: Other Commands. (line 12) -* transient-set: Saving Values. (line 21) -* transient-set-level: Enabling and Disabling Suffixes. - (line 43) -* transient-setup-children: Group Methods. (line 6) -* transient-show-help: Suffix Format Methods. - (line 26) -* transient-suffix-put: Modifying Existing Transients. - (line 70) -* transient-suffixes: Using Infix Arguments. - (line 38) -* transient-suspend: Aborting and Resuming Transients. - (line 41) -* transient-toggle-common: Common Suffix Commands. - (line 18) - - -File: transient.info, Node: Variable Index, Next: Concept Index, Prev: Command and Function Index, Up: Top - -Appendix D Variable Index -************************* - -[index] -* Menu: - -* transient-align-variable-pitch: Configuration. (line 181) -* transient-current-command: Using Infix Arguments. - (line 57) -* transient-current-prefix: Using Infix Arguments. - (line 52) -* transient-current-suffixes: Using Infix Arguments. - (line 44) -* transient-default-level: Enabling and Disabling Suffixes. - (line 33) -* transient-detect-key-conflicts: Configuration. (line 206) -* transient-display-buffer-action: Configuration. (line 51) -* transient-enable-popup-navigation: Configuration. (line 36) -* transient-force-fixed-pitch: Configuration. (line 194) -* transient-force-single-column: Configuration. (line 93) -* transient-hide-during-minibuffer-read: Configuration. (line 177) -* transient-highlight-higher-levels: Configuration. (line 219) -* transient-highlight-mismatched-keys: Configuration. (line 131) -* transient-history-file: Using History. (line 33) -* transient-history-limit: Using History. (line 37) -* transient-levels-file: Enabling and Disabling Suffixes. - (line 38) -* transient-mode-line-format: Configuration. (line 102) -* transient-read-with-initial-input: Configuration. (line 170) -* transient-semantic-coloring: Configuration. (line 118) -* transient-show-common-commands: Common Suffix Commands. - (line 23) -* transient-show-popup: Configuration. (line 15) -* transient-substitute-key-function: Configuration. (line 149) -* transient-values-file: Saving Values. (line 31) - - -File: transient.info, Node: Concept Index, Prev: Variable Index, Up: Top - -Appendix E Concept Index -************************ - -[index] -* Menu: - -* aborting transients: Aborting and Resuming Transients. - (line 6) -* classes and methods: Classes and Methods. (line 6) -* command dispatchers: Introduction. (line 70) -* common suffix commands: Common Suffix Commands. - (line 6) -* defining infix commands: Defining Suffix and Infix Commands. - (line 6) -* defining suffix commands: Defining Suffix and Infix Commands. - (line 6) -* disabling suffixes: Enabling and Disabling Suffixes. - (line 6) -* enabling suffixes: Enabling and Disabling Suffixes. - (line 6) -* getting help: Getting Help for Suffix Commands. - (line 6) -* group specifications: Group Specifications. (line 6) -* invoking transients: Invoking Transients. (line 6) -* levels: Enabling and Disabling Suffixes. - (line 10) -* modifying existing transients: Modifying Existing Transients. - (line 6) -* quit transient: Aborting and Resuming Transients. - (line 6) -* resuming transients: Aborting and Resuming Transients. - (line 6) -* saving values of arguments: Saving Values. (line 6) -* scope of a transient: Defining Transients. (line 43) -* suffix specifications: Suffix Specifications. - (line 6) -* transient prefix command: Introduction. (line 13) -* transient state: Transient State. (line 6) -* transient-level: Enabling and Disabling Suffixes. - (line 15) -* value history: Using History. (line 6) - - - -Tag Table: -Node: Top751 -Node: Introduction3662 -Node: Usage9475 -Node: Invoking Transients9843 -Node: Aborting and Resuming Transients10922 -Node: Common Suffix Commands13529 -Node: Saving Values15363 -Ref: Saving Values-Footnote-116732 -Node: Using History16925 -Node: Getting Help for Suffix Commands18499 -Node: Enabling and Disabling Suffixes19867 -Node: Other Commands22922 -Node: Configuration23898 -Ref: Essential Options24178 -Ref: Accessibility Options27829 -Ref: Auxiliary Options28152 -Ref: Developer Options32871 -Node: Modifying Existing Transients34119 -Node: Defining New Commands38008 -Node: Defining Transients38344 -Node: Binding Suffix and Infix Commands40776 -Node: Group Specifications41630 -Node: Suffix Specifications45973 -Node: Defining Suffix and Infix Commands50231 -Node: Using Infix Arguments53425 -Node: Transient State56253 -Ref: Pre-commands for Infixes60160 -Ref: Pre-commands for Suffixes60431 -Ref: Pre-commands for Non-Suffixes62200 -Ref: Special Pre-Commands62813 -Node: Classes and Methods63321 -Node: Group Classes65535 -Node: Group Methods67451 -Node: Prefix Classes68704 -Node: Suffix Classes69795 -Node: Suffix Methods72039 -Node: Suffix Value Methods72360 -Node: Suffix Format Methods75114 -Node: Prefix Slots76563 -Ref: Internal Prefix Slots77838 -Node: Suffix Slots79095 -Ref: Slots of transient-suffix79463 -Ref: Slots of transient-infix80317 -Ref: Slots of transient-variable83437 -Ref: Slots of transient-switches83539 -Node: Predicate Slots83902 -Node: Related Abstractions and Packages85157 -Node: Comparison With Prefix Keys and Prefix Arguments85444 -Ref: Regular Prefix Commands86129 -Ref: Regular Prefix Arguments86477 -Ref: Transients87446 -Node: Comparison With Other Packages95717 -Ref: Magit-Popup95948 -Ref: Hydra96847 -Node: FAQ99883 -Ref: Can I control how the popup buffer is displayed?100026 -Ref: Why did some of the key bindings change?100207 -Ref: Why does q not quit popups anymore?102525 -Node: Keystroke Index103618 -Node: Command and Function Index105336 -Node: Variable Index111635 -Node: Concept Index113908 - -End Tag Table - - -Local Variables: -coding: utf-8 -End: diff --git a/org/elpa/transient-20220806.2224/transient-pkg.el b/org/elpa/transient-20220806.2224/transient-pkg.el deleted file mode 100644 index cd9400b..0000000 --- a/org/elpa/transient-20220806.2224/transient-pkg.el +++ /dev/null @@ -1,13 +0,0 @@ -(define-package "transient" "20220806.2224" "Transient commands" - '((emacs "25.1") - (compat "28.1.1.0")) - :commit "6b9c93af9c1d1646be4445656c46ee9390c9f129" :authors - '(("Jonas Bernoulli" . "jonas@bernoul.li")) - :maintainer - '("Jonas Bernoulli" . "jonas@bernoul.li") - :keywords - '("extensions") - :url "https://github.com/magit/transient") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/org/elpa/transient-20220806.2224/dir b/org/elpa/transient-20220915.1511/dir similarity index 100% rename from org/elpa/transient-20220806.2224/dir rename to org/elpa/transient-20220915.1511/dir diff --git a/org/elpa/transient-20220806.2224/gpl.info b/org/elpa/transient-20220915.1511/gpl.info similarity index 100% rename from org/elpa/transient-20220806.2224/gpl.info rename to org/elpa/transient-20220915.1511/gpl.info diff --git a/org/elpa/transient-20220806.2224/transient-autoloads.el b/org/elpa/transient-20220915.1511/transient-autoloads.el similarity index 100% rename from org/elpa/transient-20220806.2224/transient-autoloads.el rename to org/elpa/transient-20220915.1511/transient-autoloads.el diff --git a/org/elpa/transient-20220803.1000/transient-pkg.el b/org/elpa/transient-20220915.1511/transient-pkg.el similarity index 68% rename from org/elpa/transient-20220803.1000/transient-pkg.el rename to org/elpa/transient-20220915.1511/transient-pkg.el index 5c391c2..9c71ca1 100644 --- a/org/elpa/transient-20220803.1000/transient-pkg.el +++ b/org/elpa/transient-20220915.1511/transient-pkg.el @@ -1,7 +1,7 @@ -(define-package "transient" "20220803.1000" "Transient commands" +(define-package "transient" "20220915.1511" "Transient commands" '((emacs "25.1") (compat "28.1.1.0")) - :commit "389d2bffff1d7ada561688861ca67b7a360cf352" :authors + :commit "555792f71e0ad41a08ab50cce26e229d5769aeea" :authors '(("Jonas Bernoulli" . "jonas@bernoul.li")) :maintainer '("Jonas Bernoulli" . "jonas@bernoul.li") diff --git a/org/elpa/transient-20220806.2224/transient.el b/org/elpa/transient-20220915.1511/transient.el similarity index 99% rename from org/elpa/transient-20220806.2224/transient.el rename to org/elpa/transient-20220915.1511/transient.el index 8dce4d6..54f3ba0 100644 --- a/org/elpa/transient-20220806.2224/transient.el +++ b/org/elpa/transient-20220915.1511/transient.el @@ -1448,7 +1448,10 @@ probably use this instead: transient-current-prefix) (cl-find-if (lambda (obj) (eq (transient--suffix-command obj) - (or command this-command))) + ;; When `this-command' is `transient-set-level', + ;; its reader needs to know what command is being + ;; configured. + (or command this-original-command))) (or transient--suffixes transient-current-suffixes)) (when-let* ((obj (get (or command this-command) 'transient--suffix)) @@ -3669,7 +3672,14 @@ manpage, then try to jump to the correct location." (defun transient--describe-function (fn) (describe-function (if (symbolp fn) fn 'transient--anonymous-infix-argument)) - (select-window (get-buffer-window (help-buffer)))) + (unless (derived-mode-p 'help-mode) + (when-let* ((buf (get-buffer "*Help*")) + (win (or (and buf (get-buffer-window buf)) + (cl-find-if (lambda (win) + (with-current-buffer (window-buffer win) + (derived-mode-p 'help-mode))) + (window-list))))) + (select-window win)))) (defun transient--anonymous-infix-argument () "Cannot show any documentation for this anonymous infix command. diff --git a/org/elpa/transient-20220806.2224/transient.info b/org/elpa/transient-20220915.1511/transient.info similarity index 100% rename from org/elpa/transient-20220806.2224/transient.info rename to org/elpa/transient-20220915.1511/transient.info diff --git a/org/elpa/transpose-frame-20200307.2119/transpose-frame-pkg.el b/org/elpa/transpose-frame-20200307.2119/transpose-frame-pkg.el deleted file mode 100644 index 567d33e..0000000 --- a/org/elpa/transpose-frame-20200307.2119/transpose-frame-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from transpose-frame.el -*- no-byte-compile: t -*- -(define-package "transpose-frame" "20200307.2119" "Transpose windows arrangement in a frame" 'nil :commit "12e523d70ff78cc8868097b56120848befab5dbc" :authors '(("S. Irie")) :maintainer '("S. Irie") :keywords '("window")) diff --git a/org/elpa/transpose-frame-20200307.2119/transpose-frame-autoloads.el b/org/elpa/transpose-frame-20220913.1749/transpose-frame-autoloads.el similarity index 100% rename from org/elpa/transpose-frame-20200307.2119/transpose-frame-autoloads.el rename to org/elpa/transpose-frame-20220913.1749/transpose-frame-autoloads.el diff --git a/org/elpa/transpose-frame-20220913.1749/transpose-frame-pkg.el b/org/elpa/transpose-frame-20220913.1749/transpose-frame-pkg.el new file mode 100644 index 0000000..2189fda --- /dev/null +++ b/org/elpa/transpose-frame-20220913.1749/transpose-frame-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from transpose-frame.el -*- no-byte-compile: t -*- +(define-package "transpose-frame" "20220913.1749" "Transpose windows arrangement in a frame" 'nil :commit "7b7f8a1582436749a57ebbba6ead716b5a0edddc" :authors '(("S. Irie")) :maintainer '("S. Irie") :keywords '("window")) diff --git a/org/elpa/transpose-frame-20200307.2119/transpose-frame.el b/org/elpa/transpose-frame-20220913.1749/transpose-frame.el similarity index 98% rename from org/elpa/transpose-frame-20200307.2119/transpose-frame.el rename to org/elpa/transpose-frame-20220913.1749/transpose-frame.el index e847cce..c16c06c 100644 --- a/org/elpa/transpose-frame-20200307.2119/transpose-frame.el +++ b/org/elpa/transpose-frame-20220913.1749/transpose-frame.el @@ -4,8 +4,8 @@ ;; Author: S. Irie ;; Keywords: window -;; Package-Version: 20200307.2119 -;; Package-Commit: 12e523d70ff78cc8868097b56120848befab5dbc +;; Package-Version: 20220913.1749 +;; Package-Commit: 7b7f8a1582436749a57ebbba6ead716b5a0edddc ;; This program is free software. @@ -112,7 +112,7 @@ (window-margins tree) (window-fringes tree) (window-dedicated-p tree) - (window-redisplay-end-trigger tree) + (jit-lock-register tree) tree (eq tree (frame-selected-window frame))) (let* ((vertical (car tree)) @@ -147,7 +147,7 @@ (set-window-margins window (caar config) (cdr (pop config))) (apply 'set-window-fringes window (pop config)) (set-window-dedicated-p window (pop config)) - (set-window-redisplay-end-trigger window (pop config)) + (jit-lock-register window (pop config)) (let* ((orig-window (pop config)) (ol-func (lambda (ol) (when (eq (overlay-get ol 'window) orig-window)